Coroutines in C
- Einführung von Coroutines: Große Programme zu strukturieren ist immer schwierig. Wenn es Code gibt, der Daten produziert, und Code, der Daten konsumiert, stellt sich oft die Frage, welcher der Aufrufer (
caller) und welcher der Aufgerufene (callee) ist.
- Umschreiben (Rewriting): Eine Seite eines Kommunikationskanals in eine aufrufbare Funktion umzuschreiben, ist die übliche Lösung. Das ist weniger klar als der ursprüngliche Code und erhöht den Wartungsaufwand.
- Knuths Coroutines: Donald Knuth schlug eine Lösung vor, die auf das Stack-Konzept verzichtet und Prozesse als gleichberechtigte Kooperationspartner betrachtet. Das ist jedoch nur in Assemblersprache möglich und wird von höheren Sprachen wie C nicht unterstützt.
- Stack-basierte Coroutines: In C wird versucht, Knuths Aufrufprinzip für Coroutines nachzuahmen. Dazu werden
goto-Anweisungen und Zustandsvariablen verwendet, um die Kontrolle innerhalb einer Funktion zu beliebigen Punkten zu verschieben.
- Duff's device: Statt Labels werden
case-Zweige innerhalb einer switch-Anweisung verwendet, sodass der Sprung durch die switch-Anweisung selbst erfolgt. Damit wird der Coroutine-Trick implementiert.
- Bewertung: Mit Coroutine-Makros wird die Datenübergabe zwischen Produzent und Konsument ermöglicht. Das lässt sich portabel in ANSI C implementieren.
- Coding Standards: Diese Technik verstößt gegen Coding Standards, hilft aber dabei, die Struktur des Algorithmus klarer offenzulegen. Coding Standards sollten eher algorithmische als rein syntaktische Klarheit anstreben.
- Verbesserungen und Code: In realen Anwendungen wird eine Coroutine-Implementierung benötigt, die nicht von statischen Variablen abhängt, reentrant ist und auch in Multithreading-Umgebungen funktioniert. Dafür wird eine Kontextstruktur als Parameter verwendet.
Meinung von GN⁺
- Bedeutung: Dieser Artikel zeigt eine kreative Methode zur Implementierung von Coroutines in C und erklärt, wie Programmierer die Interaktion zwischen Datenproduzenten und -konsumenten effizienter codieren können.
- Interessant: Der Versuch, Knuths Coroutine-Konzept auf C anzuwenden, zeigt die Kreativität von Entwicklern beim Überwinden von Grenzen von Programmiersprachen.
- Hilfreich: Mit Coroutines lässt sich asynchrone Verarbeitung umsetzen, ohne explizit komplexe Zustandsmaschinen schreiben zu müssen, was Lesbarkeit und Wartbarkeit des Codes verbessert.
Noch keine Kommentare.