VyÜlo v t²denφku: COMPUTERWORLD
╚φslo:9/95
RoΦnφk:1995
Rubrika/kategorie: Co (ne)najdete ve slovnφku

zp∞t do archivu Φlßnk∙ | rejst°φk | p°edchozφ Φlßnek | nßsledujφcφ Φlßnek

Ji°φ Peterka

Subroutine vs. coroutine

Programovßnφ nemusφ v₧dy b²t inspirujφcφm a povznßÜejφcφm cviΦenφm intelektu - zvlßÜt∞ chßpeme-li jej v u₧Üφm slova smyslu jako tzv. k≤dovßnφ (coding), neboli jako p°episovßnφ ji₧ vymyÜlenΘho a ji₧ rozpracovanΘho do p°φsluÜnΘho programovacφho jazyka. P°esto se ale i p°i k≤dovßnφ musφ peΦliv∞ zva₧ovat, co a jak naprogramovat, zvlßÜt∞ jde-li o alespo≥ trochu rozsßhlejÜφ program, kter² mß n∞co smysluplnΘho d∞lat.

Jednφm z nejd∙le₧it∞jÜφch moment∙ p°i k≤dovßnφ je sprßvn∞ rozpoznat, kterΘ Φinnosti se opakujφ, by¥ s p°φpadn²mi drobn²mi obm∞nami. V∞tÜina programovacφch jazyk∙ toti₧ umo₧≥uje naprogramovat takovΘto Φinnosti prßv∞ jednou, a pak je opakovan∞ vyu₧φvat (volat). Podφvejme se podrobn∞ji, jakΘ mechanismy a konstrukty za tφmto ·Φelem programovacφ jazyky nabφzφ.

Na ·rovni jazyka symbolick²ch adres, neboli asembleru, jsou takov²mto mechanismem podprogramy (subroutines), zatφmco na ·rovni vyÜÜφch programovacφch jazyk∙ jde o nejr∙zn∞jÜφ procedury, funkce Φi jinΘ druhy procedurßlnφch blok∙. Ob∞ tyto kategorie p°itom dosti ·zce souvisφ - p°ekladem procedury, funkce Φi jinΘho procedurßlnφho bloku vyÜÜφho programovacφho jazyka obvykle vznikß podprogramu. Co je ale charakteristickΘ pro podprogram? Zkusme se na n∞j podφvat z pon∞kud netradiΦnφho ·hlu, kter² nßm umo₧nφ srovnat jej s jin²m mechanismem, kter²m jsou tzv. koprogramy.

Podprogram jako takov² nenφ nic jinΘho ne₧ äkus k≤du", kter² mß Φist∞ statickou povahu - existuje po celou dobu existence programu. Jakmile ale n∞jak² podprogram spustφme (zavolßme, p°edßme mu °φzenφ), vznikß nov² objekt, kter² mß ji₧ ryze dynamick² charakter, a kter² bychom m∞li oznaΦovat jako dynamick² exemplß° Φi instanci podprogramu. O co jde, je nejlΘpe patrnΘ na p°edstav∞ podprogramu, kter² realizuje proceduru Φi funkci vyÜÜφho programovacφho jazyka s lokßlnφmi prom∞nn²mi: jakmile je podprogram spuÜt∞n, vytvo°φ si (nejspφÜe na zßsobnφku) jednu sadu sv²ch lokßlnφch prom∞nn²ch. Jakmile danß procedura-podprogram skonΦφ, p°φsluÜnß instance lokßlnφch prom∞nn²ch zanikne. Nebo jeÜt∞ lΘpe: pokud n∞jak² podprogram (procedura, funkce) volß rekurzivn∞ sebe sama, k≤d tohoto podprogramu existuje v pam∞ti stßle jen jednou, ale dynamick²ch instancφ podprogramu (vΦetn∞ instancφ lokßlnφch prom∞nn²ch a dalÜφch lokßlnφch objekt∙) existuje tolik, kolik prob∞hlo rekurzivnφch volßnφ.

Nynφ si uv∞domme dalÜφ d∙le₧itou skuteΦnost: podprogram (subroutine) nenφ urΦen k tomu, aby se z n∞j dalo ävyskoΦit ven", a n∞kdy pozd∞ji se zase ävrßtit zp∞t". S jedinou v²jimkou, kterou je volßnφ jinΘho podprogramu, nebo rekurzivnφ volßnφ sebe sama. TakovΘto vno°enΘ volßnφ podprogramu vÜak v₧dy musφ skonΦit p°esn∞ opaΦn²m po°adφm nßvrat∙ p°i ukonΦenφ p°φsluÜnΘho podprogramu: jestli₧e nap°φklad podprogram A volß podprogram B, kter² zase sßm volß podprogram C, pak podprogram C nem∙₧e vrßtit °φzenφ zp∞t programu A. Jakmile skonΦφ, vrßtφ se °φzenφ zp∞t podprogramu B, a teprve p°i skonΦenφ podprogramu B p°i se °φzenφ vracφ zp∞t podprogramu A. Pokud bychom cht∞li vzßjemnß volßnφ podprogram∙ znßzornit graficky, dostali bychom v ka₧dΘm okam₧iku v₧dy jen jednu lineßrnφ posloupnost do sebe vno°en²ch instancφ, p°edstavujφ jedinou tzv. linii v²poΦtu. Tato posloupnost by se p°itom v₧dy chovala jako zßsobnφk - °φzenφ by m∞la v₧dy ta instance, kterß by se prßv∞ nachßzela na vrcholu, a p°i svΘm skonΦenφ by p°edßvala °φzenφ instanci bezprost°edn∞ pod sebou, kterß by souΦasn∞ stala nov²m vrcholem. Nebo jinak: dynamickΘ instance se p°i vzßjemnΘm volßnφ podprogram∙ v₧dy vrÜφ na sebe, a v obrßcenΘm po°adφ se zase z vrcholku odebφrajφ (a zanikajφ).

Pokud bychom cht∞li dosßhnout toho, aby si podprogramy mohly p°edßvat °φzenφ bez jakΘhokoli omezenφ, nesm∞ly by to ji₧ b²t podprogramy ve v²Üe uvedenΘm smyslu. Muselo by jφt o tzv. koprogramy (coroutines).

Ka₧d² koprogram p°edstavuje samostatnou linii v²poΦtu - neboli samostatn² zßsobnφk, na kter² se postupn∞ vrÜφ jednotlivΘ dynamickΘ instance. P°edßnφ °φzenφ z jednoho koprogramu do jinΘho koprogramu potom vlastn∞ p°edstavuje äp°eskok" z jednΘ samostatnΘ linie v²poΦtu na jinou, resp. p°eskok z jednoho pomyslnΘho zßsobnφku dynamick²ch instancφ na jin². Dφky tomu ji₧ nenφ nutnΘ zachovßvat ₧ßdnΘ definovanΘ po°adφ p°i p°edßvßnφ °φzenφ, tak₧e nap°φklad koprogram A m∙₧e p°edat °φzenφ koprogramu B, ten koprogramu C, a koprogram C m∙₧e p°edat °φzenφ p°φmo koprogramu A.

Koprogramy jsou zßkladnφm mechanismem, kter² umo₧≥uje realizovat nejr∙zn∞jÜφ druhy pseudoparalelism∙ - neboli provozovat vφce v²poΦt∙ nikoli skuteΦn∞ paraleln∞, ale takov²m zp∙sobem, ₧e se velmi rychle st°φdajφ ve svΘm provßd∞nφ, a p°itom si vzßjemn∞ a z vlastnφ iniciativy p°edßvajφ °φzenφ.

V∞tÜin∞ programovacφch jazyk∙ vyÜÜφ ·rovn∞ je pojem koprogramu cizφ - to platφ zejmΘna pro ty programovacφ jazyky, kterΘ se ji₧ svou koncepcφ sna₧φ p°im∞t programßtory k dodr₧ovßnφ zßsad äsluÜnΘho chovßnφ", neboli zßsad strukturovanΘho programovßnφ. Nenφ divu, nebo¥ mo₧nost chaotickΘho äp°eskakovßnφ" v²poΦtu z jednΘ v∞tve na jinou se se zßsadami strukturovanΘho programovßnφ skuteΦn∞ p°φliÜ nesluΦuje. Na druhΘ stran∞ existujφ i takovΘ programovacφ jazyky vyÜÜφ ·rovn∞, kterΘ s existencφ koprogram∙ v n∞jakΘ podob∞ poΦφtajφ. Jednφm z prvnφch takov²chto jazyk∙ byl jazyk Simula 67, prap°edek vÜech dneÜnφch objektov∞ orientovan²ch jazyk∙. Koprogramy vÜak zdaleka nejsou jen zßle₧itostφ minulosti - majφ nap°φklad dost spoleΦnΘho s dnes tolik populßrnφmi vlßkny (angl. threads). Ale o tom zase a₧ n∞kdy p°φÜt∞.


zp∞t do archivu Φlßnk∙ | rejst°φk | p°edchozφ Φlßnek | nßsledujφcφ Φlßnek
Tento Φlßnek m∙₧e b²t voln∞ Üφ°en, pokud se tak d∞je pro studijnφ ·Φely, na nev²d∞leΦnΘm zßklad∞ a se zachovßnφm tohoto dov∞tku. Podrobnosti hledejte zde, resp. na adrese http://archiv.czech.net/copyleft.htm