Koprogram: Porovnání verzí

Přidáno 3 568 bajtů ,  před 7 lety
m
doplněno o překlad z anglické wikipedie
m (doplněno o překlad z anglické wikipedie)
 
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.
 
== Srovnání se vzájemnou rekurzí ==
Používání koprogramů pro stavové stroje nebo souběžnost je podobné jako používání vzájemné rekurze s návratem. V obou případech řízení mění různé druhy úloh. Nicméně koprogramy jsou více flexibilní a obvykle výhodnější. Koprogramy jsou uzpůsobené spíše k obnovení provádění než k restartování, a proto jsou schopné udržet stav, obě proměnné (jako uzávěry), bod vykonávání a výsledky nemusí nutně být na konci kódu. Vzájemné rekurzivní podprogramy musí používat sdílené proměnné, a nebo odesílat stav jako parametr. Předávání řízení mezi koprogramy probíhá pomocí existujícího kontextu a může být jednoduše implementováno jako instrukce skoku. 
 
==Častá použití==
*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í.
 
== Programovací jazyky s nativní podporou koprogramů ==
* Aikido
* AngelScript
* BCPL
* Pascal (Borland Turbo Pascal 7.0 s uThreads modulem)
* BETA
* BLISS
* C#
* ChucK
* D
* Dynamic C
* Erlang
* F#
* Factor
* GameMonkey Script
* Go
* Haskell
* High Level Assembly
* Icon
* Io
* JavaScript (od verze 1.7)
* Julia
* Limbo
* Lua
* Lucid
* µC++
* MiniD
* Modula-2
* Nemerle
* Perl (Perl5 s Coro, nativně od Perl 6)
* PHP (s Hiphop, nativně od PHP 5.5)
* Picolisp
* Prolog
* Python (od verze 2.5, s vylepšenou podporou od verze 3.3)
* Ruby
* Rust
* Sather
* Scheme
* Self
* Simula 67
* Squirrel
* Stackless Python
* SuperCollider
* Tcl (od verze 8.6)
* Urbiscript
 
== Alternativy ==
Použití koprogramů nemusí být vždy dostupné řešení pro přirozenou implementaci mechanismu. Typickou reakcí na tento problém je použití uzávěr - podprogramů se stavovými proměnnými (statické proměnné, často booleovské příznaky). Tyto proměnné se používají k udržení vnitřních stavů mezi voláními a k řízení transferu do správného bodu. Podmínky uvnitř kódu určují, která část kódu se vykoná na základě hodnot stavových proměnných. Další typickou reakcí je implementace explicitního stavového stroje ve formě rozsáhlých a komplexních switch nebo „goto“ příkazů, zvláště vypočítaných „goto“ příkazů. Všechny tyto implementace jsou považovány za složité k pochopení a údržbě. Jsou tedy motivací pro podporu koprogramů.
 
Vlákna jsou dnes v oboru programování také alternativou koprogramů. Vlákna poskytují v reálném čase možnosti pro řízení spolupráce mezi souběžně vykonávanými kusy kódu. Vlákna jsou široce rozšířeny v prostředích, která podporují jazyk C (a jsou podporovány nativně ve spoustě ostatních moderních jazycích) a programátoři jsou s nimi obeznámeni. Jsou obvykle velmi dobře implementovány, dokumentovány a podporovány. Jakmile vlákna řeší rozsáhlý a obtížný problém obsahují mnoho mocných a komplexních možností a mají tomu odpovídající složitost na porozumění. V případě, že je snadnější použít koprogram, je vláknování velmi nadbytečné.
 
Jedním důležitým rozdílem mezi vlákny a koprogramy je ten, že vlákna jsou typicky preemptivně plánována, zatímco koprogramy nejsou. Programy používající vlákna musí být chráněny proti uzamčení, protože vlákna mohou být přeplánována v jakýkoliv moment a mohou být spuštěna současně. Koprogramy, které mohou být přeplánovány pouze v určitých bodech v programu a nespouští se současně, často předchází uzamčení úplně. Tato vlastnost je často citována jako výhoda událostmi řízeného nebo asynchronního programování.
 
== Reference ==
3

editace