Smazaný obsah Přidaný obsah
m doplněno o překlad z anglické wikipedie
m doplněny odkazy
Řádek 65:
 
== Srovnání se vzájemnou rekurzí ==
Používání koprogramů pro stavové stroje nebo souběžnost je podobné jako používání [[Rekurze|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í==
Řádek 78:
* AngelScript
* BCPL
* [[Pascal (programovací jazyk)|Pascal]] ([[Borland]] [[Turbo Pascal]] 7.0 s uThreads modulem)
* BETA
* BLISS
* [[C#]]
* ChucK
* [[D (programovací jazyk)|D]]
* D
* Dynamic C
* [[Erlang (programovací jazyk)|Erlang]]
* Erlang
* F#
* Factor
* GameMonkey Script
* Go
* [[Haskell (programovací jazyk)|Haskell]]
* High Level Assembly
* Icon
* Io
* [[JavaScript]] (od verze 1.7)
* Julia
* Limbo
Řádek 101:
* µC++
* MiniD
* [[Modula-2]]
* Nemerle
* [[Perl]] (Perl5 s Coro, nativně od Perl 6)
* [[PHP]] (s Hiphop, nativně od PHP 5.5)
* [[Picolisp]]
* [[Prolog (programovací jazyk)|Prolog]]
* Prolog
* [[Python]] (od verze 2.5, s vylepšenou podporou od verze 3.3)
* [[Ruby (programovací jazyk)|Ruby]]
* Ruby
* Rust
* Sather
* [[Scheme]]
* Self
* [[Simula 67]]
* Squirrel
* Stackless Python
* SuperCollider
* [[Tcl]] (od verze 8.6)
* Urbiscript
 
Řádek 123:
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ákno (program)|Vlákna]] jsou dnes v oboru [[programování]] také alternativou koprogramů. [[Vlákno (program)|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šířenyrozšířena v prostředích, která podporují jazyk [[C (programovací jazyk)|C]] (a jsou podporovány nativně ve spoustě ostatních moderních jazycích) a [[programátor|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 [[Preempce (informatika)|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á architektura|událostmi řízeného]] nebo asynchronního programování.
 
== Reference ==