6 Punkte von GN⁺ 2024-02-26 | Noch keine Kommentare. | Auf WhatsApp teilen

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.

Noch keine Kommentare.