Koprogram: Porovnání verzí

Přidány 3 bajty ,  před 3 lety
m
Napřímení odkazů, odstranění chybné čárky
(Robot: Opravuji 1 zdrojů and označuji 0 zdrojů jako nefunkční #IABot (v2.0beta8))
m (Napřímení odkazů, odstranění chybné čárky)
== Srovnání s podprogramy ==
 
Koprogramy jsou obecnější, než podprogramy. Životní cyklus podprogramů je řízen [[Zásobník (datová struktura)|zásobníkem]] (LIFO) (tj. poslední volaný podprogram provede návrat jako první). Naproti tomu životní cyklus koprogramů závisí výhradně na jejich použití a aktuální potřebě.
 
Podprogram má pouze jeden vstupní bod (svůj začátek) a můžeme se z něj vrátit jen jednou. Naproti tomu koprogramy se mohou vracet několikrát (příkazem ''yield''). Začátek koprogramu je první vstupní bod a následující vstupní body označuje příkaz ''yield''. V praxi příkaz ''yield'' vrací výsledek a předává řízení do volajícího koprogramu podobně, jako u klasických podprogramů. Avšak při dalším volání koprogramu nezačne provádění na jeho začátku, ale následujícím příkazem za posledním provedeným příkazem ''yield''.
== Č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 [[Skok (informatika)|goto]] a může 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 [[Proces (programinformatika)|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ů ==
* [[Prolog (programovací jazyk)|Prolog]]
* [[Python]] (od verze 2.5, s vylepšenou podporou od verze 3.3)
* [[Ruby (programovací jazyk)|Ruby]]
* [[Rust (programovací jazyk)|Rust]]
* [[Sather (programovací jazyk)|Sather]]
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 (programinformatika)|Vlákna]] jsou dnes v oboru [[programování]] také alternativou koprogramů. [[Vlákno (programinformatika)|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šíř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í.