Koprogram: Porovnání verzí

Přidáno 3 516 bajtů ,  před 8 lety
Přidáno srovnání s generátory a častá použití
m (Bot: Odstranění 10 odkazů interwiki, které jsou nyní dostupné na Wikidatech (d:q1339231))
(Přidáno srovnání s generátory a častá použití)
 
Přestože je tento příklad obvykle uváděn jako úvod do [[multithreading]]u, není nutné, abychom kvůli tomu vytvářeli dva thready. Příkaz ''yield'' může být implementován jako přímý odskok z jedné rutiny do druhé.
 
==Srovnání s generátory==
Generátory jsou také zobecněním podprogramů, ale jsou více limitovány než koprogramy. Obě umožňují více návratů, což zastaví jejich vykonávání s tím, že je možné pokračovat z více vstupních bodů. Liší se v tom, že korutiny mohou kontrolovat místo, ve kterém bude vykonávání programu pokračovat po zavolání ''yield''. Toto generátory nemohou ovlivnit, pouze vrací kontrolu zpět na místo kde byly zavolány.<ref>Příklad ''[http://docs.python.org/reference/index.html The Python Language Reference]''
"http://docs.python.org/reference/expressions.html#yieldexpr 5.2.10. Yield expressions]":<br />
"All of this makes generator functions quite similar to coroutines; they yield multiple times, they have more than one entry point and their execution can be suspended. The only difference is that a generator function cannot control where should the execution continue after it yields; the control is always transferred to the generator's caller."</ref>
 
Nicméně je stále možné implementovat koprogramy za pomocí více generátorů s vrchní rozhodující funkcí, která předává kontrolu explicitně svým generátorům identifikovatelným pomocí tokenů, které jsou z nich předány zpět:
 
''var'' q := new queue
 
'''generator''' produce
'''loop'''
'''while''' q is not full
create some new items
add the items to q
'''yield''' consume
 
'''generator''' consume
'''loop'''
'''while''' q is not empty
remove some items from q
use the items
'''yield''' produce
 
'''subroutine''' dispatcher
''var'' d := new dictionary('''generator''' → '''iterator''')
d[produce] := '''start''' produce
d[consume] := '''start''' consume
''var'' current := produce
'''loop'''
current := '''next''' d[current]
 
Mnoho implementací koprogramů pro jazyky s podporou generátorů, avšak bez nativních koprogramů (e.g. Python<ref name="MertzIBM">{{Cite web | url = http://www.ibm.com/developerworks/library/l-pygen.html | title = Generator-based State Machines | work = Charming Python | first = David | last = Mertz | publisher = IBM developerWorks | date = July 1, 2002 | accessdate = Feb 2, 2011 | archiveurl = http://www.webcitation.org/5wCZa062h | archivedate = February 2, 2011}}</ref> před 2.5), využívá tento přístup.
 
==Častá použití==
Koprogramy jsou užitečné při implementaci:
*[[Konečný automat|Stavových automatů]] v jediném podprogramu, kde stav je určen aktuálním vstupním/výstupním bodem procedury;takto může vzniknout více čitelný kód v porovnání s použitím [[goto]] a m;6e být také implementován pomocí [[rekurze|vzájemné rekurze]] s [[koncová rekurze|koncovým voláním]].
*[[aktor|Aktorový model]] souběhu, například v [[počítačová hra|počítačových hrách]]. Každý aktor má své vlastní procedury (logicky odděluje kód), ale dobrovolně předává kontrolu hlavnímu plánovači, který je vykonává sekvenčně (určitá forma [[multitasking|kooperativního multitaskingu]]).
*Generátory jsou užitečné pro [[Datový proud|proudy]] – zejména vstupní/výstupní – a pro obecné procházení datových struktur.
* Komunikace mezi sekvenčními procesy, kde každý podproces je koprogram. Vstupně-výstupní kanály a blokující operace volají ''yield'' v koprogramu a plánovač je následně odblokuje při dokončení.
 
== Reference ==
35

editací