1 Punkte von GN⁺ 2024-05-10 | Noch keine Kommentare. | Auf WhatsApp teilen

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.h und der einen Abhängigkeit Metalang99.
  • Bei Verwendung von CMake wird empfohlen, es über FetchContent einzubinden.
  • 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 datatype definieren.
    • 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 otherwise verwendet.
    • Zum Ignorieren einer Bindung wird _ verwendet.
    • In of und ifLet dürfen keine top-level break/continue verwendet werden. Stattdessen sollen goto-Labels genutzt werden.

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 UnitT99 und unit_v99 bereitgestellt.

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 constexpr geben. 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.

Noch keine Kommentare.