Koprogram: Porovnání verzí

Z Wikipedie, otevřené encyklopedie
Smazaný obsah Přidaný obsah
Reaperbot (diskuse | příspěvky)
m sjednocení pahýlů na jednotnou šablonu {{Pahýl}} dle Wikipedie:Žádost o komentář/Šablony pahýlů
G3robot (diskuse | příspěvky)
m komprese kódu, substituce šablony vjazyce2
Řádek 1: Řádek 1:
'''Koprogramy''' ({{Vjazyce2|en|coroutine}}) jsou v [[informatika|informatice]] programové komponenty, které umožňují na rozdíl od podprogramů (procedur, funkcí, metod) více vstupních bodů, pozastavení a obnovení výpočtu v jejich různých místech. Koprogramy jsou vhodné pro implementaci kooperativního [[multitasking]]u, iterátorů, proudů (stream) a trubek (pipe).
'''Koprogramy''' ({{Vjazyce|en}} {{Cizojazyčně|en|coroutine}}) jsou v [[informatika|informatice]] programové komponenty, které umožňují na rozdíl od podprogramů (procedur, funkcí, metod) více vstupních bodů, pozastavení a obnovení výpočtu v jejich různých místech. Koprogramy jsou vhodné pro implementaci kooperativního [[multitasking]]u, iterátorů, proudů (stream) a trubek (pipe).


Termín koprogram poprvé použil [[Melvin Conway]] ve své seminární práci v roce [[1963]]<ref>M.E. Conway, ''Design of a separable transition-diagram compiler'', Communications of the ACM, Vol. 6, No. 7, July 1963</ref>.
Termín koprogram poprvé použil [[Melvin Conway]] ve své seminární práci v roce [[1963]]<ref>M.E. Conway, ''Design of a separable transition-diagram compiler'', Communications of the ACM, Vol. 6, No. 7, July 1963</ref>.
Řádek 14: Řádek 14:
'''coroutine''' produce
'''coroutine''' produce
'''loop'''
'''loop'''
'''while''' q is not full
'''while''' q is not full
create some new items
create some new items
add the items to q
add the items to q
'''yield''' to consume
'''yield''' to consume
'''coroutine''' consume
'''coroutine''' consume
'''loop'''
'''loop'''
'''while''' q is not empty
'''while''' q is not empty
remove some items from q
remove some items from q
use the items
use the items
'''yield''' to produce
'''yield''' to produce


Fronta je zde kompletně naplněna nebo vyprázdněna před voláním příkazu ''yield'' a předáním řízení druhému koprogramu. Vnitřní koprogramové smyčka zajišťuje další volání koprogramů přímo za příkazem ''yield''.
Fronta je zde kompletně naplněna nebo vyprázdněna před voláním příkazu ''yield'' a předáním řízení druhému koprogramu. Vnitřní koprogramové smyčka zajišťuje další volání koprogramů přímo za příkazem ''yield''.

Verze z 2. 12. 2012, 20:17

Koprogramy (anglicky coroutine) jsou v informatice programové komponenty, které umožňují na rozdíl od podprogramů (procedur, funkcí, metod) více vstupních bodů, pozastavení a obnovení výpočtu v jejich různých místech. Koprogramy jsou vhodné pro implementaci kooperativního multitaskingu, iterátorů, proudů (stream) a trubek (pipe).

Termín koprogram poprvé použil Melvin Conway ve své seminární práci v roce 1963[1].

Srovnání s podprogramy

Koprogramy jsou obecnější, než podprogramy. Životní cyklus podprogramů je řízen 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.

V následujícím příkladu si ukážeme, jak mohou být koprogramy užitečné. Předpokládejme, že máme vazbu producent-konzument, kde jedna rutina vytváří položky a přidává je do fronty a druhá odebírá položky z fronty a zpracovává je. Z úsporných důvodů chceme přidávat a odebírat několik položek najednou. Zápis programu by mohl vypadat takto:

var q := new queue

coroutine produce
loop
while q is not full
create some new items
add the items to q
yield to consume

coroutine consume
loop
while q is not empty
remove some items from q
use the items
yield to produce

Fronta je zde kompletně naplněna nebo vyprázdněna před voláním příkazu yield a předáním řízení druhému koprogramu. Vnitřní koprogramové smyčka zajišťuje další volání koprogramů přímo za příkazem yield.

Přestože je tento příklad obvykle uváděn jako úvod do multithreadingu, 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é.

Reference

  1. M.E. Conway, Design of a separable transition-diagram compiler, Communications of the ACM, Vol. 6, No. 7, July 1963

V tomto článku byl použit překlad textu z článku Coroutine na anglické Wikipedii.