Coroutine

Coroutine ( engelska  coroutine ) - en mjukvarumodul , speciellt organiserad för att säkerställa interaktion med andra moduler enligt principen om kooperativ multitasking : modulen avbryts vid en viss punkt, vilket sparar hela tillståndet (inklusive samtalsstacken och kommandoräknaren ) och överförs kontrollen till en annan, den i sin tur, utför uppgiften och överför kontrollen tillbaka, bevara sin stack och räknare. Tillsammans med fibrer ( eng.  fiber ) är koroutiner ett sätt att tillhandahålla "lättvikts" multithreading av programvarai den meningen att de kan implementeras utan att använda mekanismerna för kontextväxlingar av operativsystemet.

Coroutines är mer flexibla och generella än subrutiner : jämfört med en subrutin som alltid har en ingångspunkt, har en coroutine en startpunkt och kapslad inuti en sekvens av returer följt av ingångspunkter. En subrutin kan bara återvända en gång, en coroutine kan återvända flera gånger. Löptiden för en subrutin bestäms av LIFO- principen (den senast kallade subrutinen slutförs först), körtiden för en koroutin bestäms av dess användning och nödvändighet.

Uppkomsten av begreppet en koroutin tillskrivs den konstruktion som användes av Melvin Conway 1958 i praktiken av programmering i assemblerspråk [1] , på 1960-1970-talet praktiserades koroutiner på vissa högnivåspråk ( Klu , Simula , Modula-2 ), men de fick anmärkningsvärd distribution först på 2000-talet, när många koroutinstödbibliotek dök upp i populära programmeringsspråk och några nya språk (som Lua , Ruby , Go , Julia ) byggdes in från början. Coroutiner används för att implementera många liknande programkomponenter, såsom generatorer och iteratorer , oändliga listor med lata utvärderingar , pipes , tillståndsmaskiner inom en enda subrutin (där tillståndet bestäms av den aktuella ingångs- och utgångspunkten), undantagshanteringsimplementeringar och skådespelarens modell .

Implementeringar

En betydande del av populära programmeringsspråk , inklusive C och derivator ( C++ före C++20 ), har inte direkt stöd för koroutiner i språket eller standardbiblioteket (detta beror till stor del på kraven för en stack implementering av subrutiner).

I en situation där koroutiner, som ett naturligt sätt att implementera komponenter, inte är tillgängliga, är den typiska lösningen att skapa koroutiner med hjälp av en uppsättning booleska flaggor och andra variabla tillstånd för att upprätthålla externt tillstånd mellan anrop. Förhållanden inom koden gör att olika sekvenser av kommandon exekveras på successiva anrop, enligt värdena för tillståndsvariablerna. En annan typisk lösning är att implementera tillståndsmaskinen själv med en stor switch-sats . Sådana implementeringar är svåra att stödja och underhålla.

Strömmar är ett lämpligt alternativ till coroutiner i de flesta moderna mönster. Trådar ger möjlighet att hantera interaktionen av "samtidigt" exekverande kodavsnitt. Därför är det en lösning på stora och komplexa problem, den innehåller kraftfulla komplexa förmågor och har en åtföljande komplexitet att lära sig. Men trots andra alternativ är trådar allmänt tillgängliga i C-miljön, är bekanta för de flesta programmerare och är i allmänhet implementerade, dokumenterade och underhållna.

Några försök att implementera koroutiner i C:

Ett tillvägagångssätt som används för att implementera koroutiner på språk utan inbyggt stöd är stackless protothreads , som ger ett blockerande sammanhang på bekostnad av flera byte minne per tråd.

Funktionella programmeringsspråk implementerar ofta koroutiner, t ex Scheme , Lisp , Haskell . Ett antal språk har inbyggt coroutine-stöd lagt till i senare implementeringar, såsom Python (sedan 2.5 och med explicit syntaktisk stöd sedan 3.5), PHP (sedan 5.5), Kotlin (sedan 1.1), JavaScript (sedan 1.7 ). ), C# (sedan 2.0), Tcl (sedan 8.6).

Anteckningar

  1. Melvin E. Conway. Design av en separerbar kompilator för övergångsdiagram // Kommunikation av ACM . - 1963. - V. 6 , nr 7 . — S. 396–408 . doi : 10.1145 / 366663.366704 .
  2. Coroutines i C. Hämtad 17 mars 2006. Arkiverad från originalet 9 november 2019.
  3. Hemsida för bärbart Coroutine-bibliotek . Hämtad 17 mars 2006. Arkiverad från originalet 14 december 2005.
  4. Index för /~froese/coro

Litteratur