Corutine

Coroutine ( anglicky  coroutine ) - softwarový modul, speciálně organizovaný pro zajištění interakce s ostatními moduly na principu kooperativního multitaskingu : modul se v určitém bodě pozastaví, uloží se celý stav (včetně zásobníku hovorů a počítadla příkazů ) a přenese se řízení na jiného, ​​ten na oplátku, provede úlohu a předá řízení zpět, přičemž zachová svůj zásobník a počítadlo. Spolu s vlákny jsou korutiny prostředkem  k poskytování „odlehčeného“ softwarového multithreadingu v tom smyslu, že je lze implementovat bez použití mechanismů přepínání kontextu operačním systémem.

Korutiny jsou flexibilnější a obecnější než podprogramy : ve srovnání s podprogramem, který má vždy jeden vstupní bod, má korutina počáteční vstupní bod a vnořená do sekvence návratů následovaných vstupními body. Podprogram se může vrátit pouze jednou, koroutina se může vrátit vícekrát. Doba běhu podprogramu je dána principem LIFO (poslední volaný podprogram je dokončen jako první), doba běhu koroutiny je dána jeho použitím a nutností.

Vznik konceptu coroutine je připisován konstrukci použité Melvinem Conwayem v roce 1958 při nácviku programování v assembleru [1] , v 60. až 70. letech 20. století byly korutiny praktikovány v některých jazycích na vysoké úrovni ( Klu , Simula , Modula-2 ), ale pozoruhodnou distribuci získaly až v roce 2000, kdy se v populárních programovacích jazycích objevily četné knihovny podpory koroutinu a některé nové jazyky (jako Lua , Ruby , Go , Julia ) byly zabudovány od začátku. Korutiny se používají k implementaci mnoha podobných programových komponent, jako jsou generátory a iterátory , nekonečné seznamy využívající líné vyhodnocení , roury , stavové automaty v rámci jednoho podprogramu (kde je stav určen aktuálním vstupním a výstupním bodem), implementace zpracování výjimek a herecký model .

Implementace

Významná část oblíbených programovacích jazyků , včetně C a odvozených jazyků ( C++ před C++20 ), nemá přímou podporu pro korutiny v jazykové nebo standardní knihovně (to je z velké části způsobeno požadavky na zásobník implementace podprogramů).

V situaci, kdy nejsou k dispozici korutiny jako přirozený způsob implementace komponent, je typickým řešením vytvoření korutin pomocí sady booleovských příznaků a dalších proměnných stavů k udržení vnějšího stavu mezi vyvoláním. Podmínky v kódu způsobují, že se při po sobě jdoucích voláních provádějí různé sekvence příkazů podle hodnot stavových proměnných. Dalším typickým řešením je implementovat stavový automat sami pomocí velkého příkazu switch . Takové implementace se obtížně podporují a udržují.

Potoky jsou vhodnou alternativou ke korutínám ve většině moderních designů. Vlákna poskytují schopnost řídit interakci „současně“ spouštěných částí kódu. Proto je řešením velkých a složitých problémů, zahrnuje výkonné komplexní schopnosti a má doprovodnou složitost, kterou je třeba se naučit. Navzdory jiným alternativám jsou vlákna široce dostupná v prostředí C, jsou známá většině programátorů a jsou obecně implementována, dokumentována a udržována.

Některé pokusy o implementaci coroutines v C:

Jedním z přístupů, který se používá k implementaci korutin v jazycích bez nativní podpory, jsou stohovaná protovlákna , která poskytují blokovací kontext na úkor několika bajtů paměti na vlákno.

Funkční programovací jazyky často implementují korutiny, např. Scheme , Lisp , Haskell . Řada jazyků má vestavěnou podporu coroutine přidanou v pozdějších implementacích, jako je Python (od 2.5 a s explicitní syntaktickou podporou od 3.5), PHP (od 5.5), Kotlin (od 1.1), JavaScript (od 1.7 ). ), C# (od 2.0), Tcl (od 8.6).

Poznámky

  1. Melvin E. Conway. Návrh oddělitelného kompilátoru přechodových diagramů // Communications of the ACM . - 1963. - V. 6 , č. 7 . — S. 396–408 . doi : 10.1145 / 366663.366704 .
  2. Korutiny v C . Získáno 17. března 2006. Archivováno z originálu dne 9. listopadu 2019.
  3. Domovská stránka Portable Coroutine Library . Získáno 17. března 2006. Archivováno z originálu dne 14. prosince 2005.
  4. Index /~froese/coro

Literatura