www.wikidata.de-de.nina.az
In der Informatik sind Koroutinen auch Coroutinen eine Verallgemeinerung des Konzepts einer Prozedur oder Funktion Der prinzipielle Unterschied zwischen Koroutinen und Prozeduren ist dass Koroutinen ihren Ablauf unterbrechen und spater wieder aufnehmen konnen wobei sie ihren Status beibehalten Unter den altesten Programmiersprachen die Koroutinen unterstutzen sind Simula oder Modula 2 Auch moderne Sprachen wie Python kennen ahnliche Konzepte In einigen weit verbreiteten Sprachen wie C oder Java gestaltet sich die Implementierung jedoch schwierig Der Begriff selbst stammt von Melvin Conway der ihn 1963 in einer Veroffentlichung uber Compilerbau 1 benutzte Donald Knuth bezeichnet Prozeduren als Spezialfall von Koroutinen 2 Inhaltsverzeichnis 1 Implementierung 1 1 Python 1 2 C 1 3 C 1 4 C 1 5 D 1 6 Tcl 1 7 PicoLisp 2 EinzelnachweiseImplementierung BearbeitenKoroutinen konnen generell in Sprachen die sie nicht direkt unterstutzen simuliert werden Dabei ist ein sprachunabhangiger Weg vergleichbares Verhalten zu programmieren die Benutzung von Threads die wechselseitig ablaufen und nach Abgabe der Kontrolle abwarten bis sie die Kontrolle zuruckerhalten Eine andere Moglichkeit die in jeder Programmiersprache funktioniert ist das Aufrollen von Koroutinen Hierbei muss die Koroutine ihren Status selbst vorhalten beispielsweise in einer globalen Variablen und dann bei jedem Aufruf an die entsprechende Stelle ihres Codes springen Da es in vielen Programmiersprachen nicht moglich ist in die Mitte eines Blocks beispielsweise in eine Schleife zu springen mussen solche Konstrukte in so einem Fall ebenfalls durch Simulationen ersetzt werden Python Bearbeiten Die Programmiersprache Python unterstutzt Koroutinen uber die asyncio API Seit Python 3 5 gibt es hierzu die Schlusselworter await und async 3 Eine Koroutine wird mittels async def definiert await wartet auf die Fertigstellung einer Koroutine und gibt wahrend der Wartezeit die Ausfuhrungskontrolle zuruck Koroutinen konnen nebenlaufig ausgefuhrt werden und ermoglichen dadurch ein kooperatives Multitasking import asyncio import time async def waitprint s time sleep wurde den Thread blockieren await asyncio sleep nicht await asyncio sleep 1 print s async def main Fuhre Koroutinen nebenlaufig aus task1 asyncio create task waitprint Eins task2 asyncio create task waitprint Zwei task3 asyncio create task waitprint Drei await asyncio gather task1 task2 task3 start time time asyncio run main print Dauer time time start s etwas uber eine Sekunde Eine andere Moglichkeit ist die Verwendung von Generatoren als Koroutine Dabei kann mit dem Schlusselwort yield der Ablauf einer Funktion vorubergehend unterbrochen werden Intern wird jedoch bei Aufruf einer solchen Generator Funktion ein Objekt erzeugt das den Status vorhalt Realisiert wird dies indem bei Abgabe der Kontrolle das vollstandige Stackframe zwischengespeichert und bei Wiederaufnahme wiederhergestellt wird Es ist moglich einem Generator bei der Objektinstanziierung Parameter zu ubergeben Fibonaccifolge als Generator def fibonacci limit first second 0 1 for in range limit first second second first second yield first for number in fibonacci 10 print number In Python 2 5 wurde die Syntax des yield Schlusselworts erweitert um kooperatives Multitasking zu ermoglichen 4 In Python 3 folgten Erweiterungen zur Nutzung von Generatoren als Koroutinen unter anderem durch die Einfuhrung der Schlusselworter async und await In Version 3 11 wurde diese Funktionalitat wieder entfernt 5 Generatoren mit dem Schlusselwort yield sind weiterhin Teil der Sprache fur die Schlusselworter async und await ist jedoch die asyncio API vorgesehen C Bearbeiten C unterstutzt weder Koroutinen noch vergleichbare Konstrukte Es gibt jedoch verschiedene Moglichkeiten sie zu simulieren Eine davon geht auf Simon Tatham zuruck und ist auch wegen der Verwendung in dem popularen SSH Client PuTTY bekannt 6 include lt stdio h gt include lt threads h gt thread local int first 0 second 1 Fibonaccifolge als Koroutine int fibonacci int swap first first second second swap return first void reset fibonacci first 0 second 1 int main for int i 0 i lt 10 i printf d n fibonacci reset fibonacci return 0 Da der Status in globalen Variablen vorgehalten wird kann im Unterschied zu Python von jeder Koroutine jedoch immer nur eine Instanz ablaufen Deswegen wird der Status in einem Thread local Storage gespeichert damit dennoch mehrere Instanzen von Koroutinen parallel ablaufen konnen wenn man mehrere Threads gestartet hat C Bearbeiten Boost Coroutine offizieller Bestandteil der Boost Libraries ermoglicht die Verwendung von Koroutinen in C Im Gegensatz zu Python sind die Koroutinen von Boost Coroutine jeweils mit einem Stack assoziiert Somit sind Umschaltungen und Sprunge aus Unterfunktionen heraus moglich Durch die interne Verwendung von Boost Context werden ARM MIPS PowerPC SPARC und X86 auf POSIX Mac OS X und Windows unterstutzt include lt boost coroutine2 all hpp gt include lt iostream gt using coro t boost coroutines2 coroutine lt int gt int main coro t pull type source coro t push type amp sink int first 0 second 1 for int i 0 i lt 10 i int swap first first second second swap sink first for auto i source std cout lt lt i lt lt std endl return 0 Mit der Version C 20 wurden Koroutinen in die Sprache integriert C Bearbeiten using System using System Collections Generic public class MainClass public static IEnumerable lt int gt fibonacci int limit int first 0 second 1 for int i 0 i lt limit i int swap first first second second swap yield return first public static void Main string args foreach int i in fibonacci 10 Console WriteLine i D Bearbeiten D unterstutzt gut in objektorientierter Umgebung nutzbare Koroutinen unter dem Namen Fibers Die Umschaltung geschieht intern durch eine einfache Vertauschung des Stackpointers und ist bisher nur fur x86 Windows und Posix und PowerPC verfugbar import core thread Fiber import std stdio write import std range iota Iterates over range and applies the function Fnc to each element x and returns it in result Fiber yields after each application void fiberedRange alias Fnc R T R range ref T result while range empty result Fnc range front Fiber yield range popFront void main int squareResult cubeResult Create a fiber that is initialized with a delegate that generates a square range auto squareFiber new Fiber fiberedRange x gt x x iota 1 11 squareResult and here is which creates cubes auto cubeFiber new Fiber fiberedRange x gt x x x iota 1 9 cubeResult if state is TERM the fiber has finished executing its associated function squareFiber call cubeFiber call while squareFiber state Fiber State TERM amp amp cubeFiber state Fiber State TERM write squareResult cubeResult squareFiber call cubeFiber call write n squareFiber could still be run because it has not finished yet Vorteile sieht man besonders deutlich bei Verwendung von rekursiven Funktion wie beispielsweise bei der Traversierung von Binarbaumen Tcl Bearbeiten Tool Command Language unterstutzt gut nutzbare Koroutinen bereits im Sprachkern wie grundsatzlich bei Tcl plattformunabhangig 7 proc f yield set a 0 yield set b 1 while 1 yield incr a b lassign list b a a b coroutine fib f for set i 0 i lt 10 incr i puts fib PicoLisp Bearbeiten PicoLisp unterstutzt Koroutinen als eingebautes Sprachelement nur 64 bit version de fibo co fibo let A 0 B 1 loop yield swap B swap A B B do 10 println fibo Einzelnachweise Bearbeiten M E Conway Design of a separable transition diagram compiler Communications of the ACM Band 6 Nr 7 Juli 1963 Donald Knuth Fundamental Algorithms Third Edition Addison Wesley 1997 ISBN 0 201 89683 4 Section 1 4 2 Coroutines S 193 200 https peps python org pep 0492 PEP 342 Coroutines and Tasks Abschnitt Generator based Coroutines 2 Februar 2023 abgerufen am 2 Februar 2023 Simon Tatham Coroutines in C Erlautert werden sie auf der zugehorigen Manual Page zu coroutine Abgerufen von https de wikipedia org w index php title Koroutine amp oldid 237546107