Einführung algebraischer Datentypen für C99
(github.com/Hirrolot)Datatype99
Eine Bibliothek, die sichere und intuitive algebraische Datentypen bereitstellt und erschöpfendes Pattern Matching sowie Resilienz zur Compile-Zeit bietet. Sie ist in reinem C99 implementiert, sodass keine externen Werkzeuge erforderlich sind.
Hauptmerkmale
- Typsicherheit: Ungeeignete Varianten eines Typs, unvollständiges Pattern Matching und ungültige Feldzugriffe werden zur Compile-Zeit erkannt.
- Portabilität: Es wird nur ein standardkonformer C99-Compiler benötigt. Weder Standardbibliothek noch compiler-/plattformspezifische Funktionen, VLAs oder Ähnliches sind erforderlich.
- Vorhersehbarkeit: Eine formale Semantik für die Codegenerierung ist definiert und garantiert, dass das erzeugte Datenlayout immer identisch ist.
- Leicht verständliche Fehler: Robust gegenüber fehlerhaftem Code.
- In der Praxis erprobt: Wird bei OpenIPC für die Entwicklung von Echtzeit-Streaming-Software für IP-Kameras eingesetzt. Enthält unter anderem eine RTSP-1.0-Implementierung und rund 50.000 Zeilen proprietären Code.
Installation
- Datatype99 besteht aus einer Header-Datei
datatype99.hund der einen Abhängigkeit Metalang99. - Bei Verwendung von CMake wird empfohlen, es über
FetchContenteinzubinden. - Falls nötig, können Precompiled Headers verwendet werden. Das kann die Compile-Zeit verkürzen.
Verwendung
- Datatype99 ist einfacher Syntaxzucker für Tagged Unions. Es ist sicherer und kompakter.
- Beispiel eines Binärbaums:
- Bei einer direkten Implementierung in C müssten Strukturen, Unions, Enums usw. verwendet werden.
- Mit Datatype99 lässt sich dies einfach durch einen Aufruf des Makros
datatypedefinieren. - Auch das Berechnen der Summe des Baums per Pattern Matching ist einfach.
- Compile-Zeit-Sicherheit: Beim Zugriff auf eine Bindung einer falschen Variante tritt ein Compilerfehler auf.
- Flexibilität: Bindungen sind Pointer-Typen und können verändert werden; durch Dereferenzierung erhält man die Werte.
- Konstruktorfunktionen für Varianten werden automatisch erzeugt.
- Kurze Erklärung zu Pattern Matching:
- Für das Matching des Standardfalls wird
otherwiseverwendet. - Zum Ignorieren einer Bindung wird
_verwendet. - In
ofundifLetdürfen keine top-levelbreak/continueverwendet werden. Stattdessen sollengoto-Labels genutzt werden.
- Für das Matching des Standardfalls wird
Syntax und Semantik
- Es werden eine EBNF-Grammatikdefinition und eine Erklärung der Semantik bereitgestellt.
- Im Header der Bibliothek wird die Verwendung von Postfix-Versionen der Makros empfohlen.
Unit-Typ
- Wird als
UnitT99undunit_v99bereitgestellt.
Meinung von GN⁺
- Mit Datatype99 lassen sich algebraische Datentypen auch in C sicher und komfortabel verwenden, was wie ein großer Vorteil wirkt. Auch die Integration in bestehende C-Codebasen scheint einfach zu sein.
- Bei Einsatz in C++ könnte es jedoch Überschneidungen mit Spracheigenheiten wie Templates oder
constexprgeben. Gegenüber C könnten die Vorteile daher geringer ausfallen. - Die zur Compile-Zeit garantierte Sicherheit ist ein großer Pluspunkt, doch in Fällen, in denen sich Datentypen dynamisch ändern, dürfte der Einsatz schwieriger sein. Eine Grenze statischer Typisierung.
- In kleinen Projekten könnte man so etwas direkt selbst implementieren, aber mit wachsender Codebasis dürfte eine Bibliothek wie Datatype99 bei Produktivität und Stabilität helfen.
- Bibliotheken mit ähnlicher Funktionalität sind unter anderem LibADT, Kitsune und P99.
Noch keine Kommentare.