Korutin

Coroutine ( angolul  coroutine ) - egy szoftvermodul , amelyet kifejezetten a többi modullal való interakció biztosítására szerveztek a kooperatív többfeladatos munka elve alapján : a modul egy bizonyos ponton felfüggesztésre kerül, elmentve a teljes állapotot (beleértve a hívás veremét és a parancsszámlálót is ), és átadja az irányítást egy másiknak, az viszont végrehajtja a feladatot, és visszaadja az irányítást, megőrizve veremét és számlálóját. A szálak mellett a  korutinok „könnyű” szoftveres többszálú megoldást jelentenek abban az értelemben, hogy az operációs rendszer környezetváltási mechanizmusai nélkül is megvalósíthatók .

A korutinok rugalmasabbak és általánosabbak, mint az alprogramok : egy olyan szubrutinhoz képest, amelynek mindig van egy belépési pontja, a korutinnak van egy kezdő belépési pontja, és egy visszatérési sorozatba van beágyazva, amelyet belépési pontok követnek. Egy szubrutin csak egyszer, egy szubrutin többször is visszatérhet. Egy szubrutin futási idejét a LIFO - elv határozza meg (az utoljára nevezett szubrutin fejeződik be először), a szubrutin futási idejét annak használata és szükségessége határozza meg.

A korutin fogalmának megjelenése annak a konstrukciónak tulajdonítható, amelyet Melvin Conway 1958-ban az assembly nyelvű programozás gyakorlatában [1] használt, az 1960-as és 1970-es években a korutinokat néhány magas szintű nyelven gyakorolták. ( Klu , Simula , Modula-2 ), de csak a 2000-es években nyertek jelentős elterjedtséget, amikor számos korutin támogató könyvtár jelent meg a népszerű programozási nyelveken, és néhány új nyelven (például Lua , Ruby , Go ). , Julia ) kezdettől fogva beépültek. A korutinok számos hasonló programkomponens megvalósítására szolgálnak, mint például generátorok és iterátorok , végtelen listák lusta kiértékelést használva , csövek , állapotgépek egyetlen szubrutinon belül (ahol az állapotot az aktuális be- és kilépési pont határozza meg), kivételkezelő megvalósítások, és a színész modell .

Megvalósítások

A népszerű programozási nyelvek jelentős része , beleértve a C -t és a származékokat ( C++ a C++20 előtt ), nem támogatja közvetlenül a korutinokat a nyelvben vagy a szabványos könyvtárban (ez nagyrészt a verem követelményeinek köszönhető szubrutinok megvalósítása).

Abban a helyzetben, amikor a korutinok, mint a komponensek megvalósításának természetes módja nem állnak rendelkezésre, a tipikus megoldás az, hogy korutinokat hoznak létre logikai jelzők és más változó állapotok halmazával, hogy fenntartsák a külső állapotot a meghívások között. A kódon belüli feltételek az állapotváltozók értékének megfelelően különböző parancssorozatok végrehajtását okozzák az egymást követő hívásoknál. Egy másik tipikus megoldás az állapotgép saját maga implementálása egy big switch utasítással . Az ilyen megvalósításokat nehéz támogatni és fenntartani.

A patakok megfelelő alternatívát jelentenek a korutinokkal szemben a legtöbb modern kivitelben. A szálak lehetővé teszik a kód "egyidejűleg" végrehajtó szakaszainak interakciójának kezelését. Ezért megoldást jelent nagy és összetett problémákra, erőteljes komplex képességeket tartalmaz, és ezzel együtt jár a tanulás bonyolultsága. Más alternatívák ellenére azonban a szálak széles körben elérhetők a C környezetben, a legtöbb programozó számára ismerősek , és általában implementálva, dokumentálva és karbantartva vannak.

Néhány kísérlet a korutinok megvalósítására C-ben:

A natív támogatás nélküli nyelveken a korutinok megvalósítására használt egyik megközelítés a verem nélküli protoszálak , amelyek blokkolási kontextust biztosítanak szálanként több bájt memória rovására.

A funkcionális programozási nyelvek gyakran alkalmaznak korutinokat, például Scheme , Lisp , Haskell . Számos nyelv beépített korutintámogatással bővült a későbbi megvalósításokban, mint például a Python (2.5 óta és kifejezett szintaktikai támogatással 3.5 óta), PHP (5.5 óta), Kotlin (1.1 óta), JavaScript (1.7 óta ). ), C# (2.0 óta), Tcl (8.6 óta).

Jegyzetek

  1. Melvin E. Conway. Elválasztható átmeneti diagram fordító tervezése // Az ACM kommunikációja . - 1963. - V. 6 , 7. sz . – S. 396–408 . doi : 10.1145 / 366663.366704 .
  2. Korutinok C-ben . Letöltve: 2006. március 17. Az eredetiből archiválva : 2019. november 9..
  3. Hordozható Coroutine Library kezdőlapja . Letöltve: 2006. március 17. Az eredetiből archiválva : 2005. december 14..
  4. /~froese/coro indexe

Irodalom