Programmiersprachen: Wieso Zig die Vorherrschaft von C beenden könnte

Zig versucht, die Sicherheit von Rust mit der Leichtigkeit von C zu verbinden. Die Programmiersprache kann mit Besonderheiten wie comptime punkten – einem Schlüsselwort, mit dessen Hilfe Code explizit zur Compile-Zeit ausgewertet werden kann.
Die Programmiersprache wurde bereits 2016 von Andrew Kelley ins Leben gerufen und scheint nun immer beliebter zu werden. Laut dem Entwickler ist Zig „eine modernere Sprache, die versucht, das Beste aus diesen Sprachen zu absorbieren und eine vergleichbare Leistung mit einer besseren, zuverlässigeren Entwickler:innenerfahrung zu bieten.“
Wann kommt die 1.0-Version von Zig?
Zwar hat es Zig noch nicht zur Version 1.0 geschafft, doch das könnte sich 2025 ändern, wie Kelley in einem Roadmap-Update vor ein paar Monaten bestätigte. Kunst könne man eben nicht hetzen, erklärte er.
Und mit Kunst lässt sich Zig tatsächlich auch vergleichen, denn wie Jarred Sumner, der Schöpfer von Bun verriet, ähnelt Zig „dem Schreiben von C, aber mit besseren Speichersicherheitsfunktionen im Debug-Modus und modernen Funktionen wie Defer (ähnlich wie bei Go)“. Die Sprache habe nur sehr wenige Schlüsselwörter, daher sei sie viel einfacher zu lernen als C++ oder Rust.
Zig soll die moderne Alternative zu C werden
Damit ist Zig auf dem besten Wege C abzulösen – sowohl als tragbare Low-Level-Sprache als auch als Standard, mit dem andere Sprachen verglichen werden. Derzeit wird Zig verwendet, um die Bun.js-JavaScript-Laufzeit als Alternative zu Node.js zu implementieren.
In vielen anderen Sprachen, wie beispielsweise Python, müssen Daten speziell für die Interoperabilität von C und C++ umgewandelt werden. Zig ist da viel moderner, denn sie kann dank des eingebauten Clang-Compilers Bibliotheken von C und C++ direkt importieren.
Der Compiler kann Header-Dateien für diese Sprache generieren, um umgekehrt in Zig geschriebene Programmteile in C oder C++ verwenden zu können. Die Ausgabe von Zig-Bibliotheken ist eine .o-Datei, die direkt in GCC eingespeist werden kann.
Diese Kernfunktionen hat Zig zu bieten:
- Kein versteckter Kontrollfluss
- Keine versteckten Speicherallokationen
- Kein Präprozessor, keine Makros
- Erstklassiger Support einer optionalen Standardbibliothek
- Einstellbare Laufzeitsicherheit
- Codeausführung zur Compile-Zeit
Zig ist eine imperative, prozedurale, funktionale, objektorientierte, modulare Multi-Paradigmensprache und hilft Programmierer:innen dabei, schnelle und klare Codes zu schreiben, die mit allen Fehlerbedingungen umgehen können. Es ist ein moderner Ansatz zur Metaprogrammierung, basierend auf Compile-Zeit-Ausführung und Lazy-Evaluation.
Zig: Mindestens so effizient und portierbar wie C
Loris Cro, ein Mitglied des Zig-Teams verriet gegenüber Fastly: „Zig hat einen ganz einfachen Zweck: Es soll (mindestens) so effizient und portierbar wie C sein und dabei alle seine Probleme bei der Nutzerfreundlichkeit und seine Einschränkungen umgehen, die den eigenen (und auch den angrenzenden) Ökosystemen von C seit jeher zu schaffen machen.“ Im Gegensatz zu C komme Zig aber ohne Runtime-Umgebung aus.
Von den meisten anderen Sprachen unterscheidet sich Zig auch durch ihren geringen Funktionsumfang. Kevin Lynagh, der normalerweise mit Rust arbeitet, schrieb: „Die Sprache ist so klein und konsistent, dass ich nach ein paar Stunden Lernen genug davon in meinen Kopf laden konnte, um meine Arbeit zu erledigen.“
Er konvertierte erst kürzlich seine Tastatur-Firmware von Rust auf Zig und stellte dabei fest, dass es sich um eine Sprache handelt, die er beherrschen könnte.
Entwickler:innen mögen das kleine Featureset
Nathan Craddock, ein C-Entwickler, konnte sich dieser Meinung nur anschließen. Programmierer:innen scheinen vor allem das möglichst kleine Featureset zu mögen, weil sie es vorteilhaft finden, wenn es nur eine offensichtliche Möglichkeit gibt, etwas zu tun.
Die Entwickler:innen von Zig haben sich dieses Ziel so sehr zu Herzen genommen, dass Zig eine Zeit lang auf For-Schleifen verzichtet hat, weil sie als unnötige syntaktische Ausarbeitung der ohnehin schon ausreichenden While-Schleifen betrachtet wurden.
Exceptions werden nicht geworfen, sondern zurückgegeben
Auch das Error-Handling-Konzept ist beeindruckend. Denn Exceptions werden einfach zurückgegeben und nicht geworfen – aus einem einfachen Grund: Geworfene Exceptions werden nämlich oft als versteckter Control-Flow missbraucht.
Auch Zig benötigt eine direkte Möglichkeit, um Speicher zu allokieren. Es gibt aber kein direktes Malloc. Die Speicherzuweisung wird der Standard Library überlassen und erfolgt über eine Anfrage an ein Allocator-Objekt. Versteckte Allokationen sollen damit verhindert werden.
Wer Zig unter die Lupe nehmen möchte: Auf der Homepage von Zig gibt es einen Lernbereich, mit dem jeder, der Lust hat, tiefer in die Materie eintauchen kann.
„ Im Gegensatz zu C komme Zig aber ohne Runtime-Umgebung aus.“ C hat meines Wissens auch keine spezielle Runtime-Umgebung oder was genau ist hier gemeint?
Tatsächlich kann man C auch ohne Standardbibliothek programmieren (wenn man das als Runtime-Umgebung bezeichnen möchte) und wenn man es hat und benötigt direkt Betriebssystemfunktionen nutzen. Vielleicht war damit gemeint, dass in Zig alles statisch zusammen gelinkt wird (inklusive der Zig Standardbibliothek) und keine Abhängigkeit zu Systembibliotheken besteht? Wobei man das bei C, zumindest mit musl, auch machen kann. Oder es war bei dieser Aussage Go gemeint?
Zumindest ist die Aussage sehr ungenau, denn eine Klassische Runtime wie Dotnet, Java ist das nicht. Noch nicht einmal eine Green Thread Runtime wie in Go ist in C enthalten.
„Zig versucht, die Sicherheit von Rust mit der Leichtigkeit von C zu verbinden.“
Naja, also in Zig bekommt man eine bessere Null-Safety, mit „defer/errdefer“ besseren Schutz vor Resource-Leaks und je nach Build-Mode und Allokator noch Bounds-Checks und Schutz vor einigen Formen von Undefined Behavior. Aber Speichersicherheit wird scheinbar so gut wie immer mit Runtime Checks erkauft und man kann es abschalten (was bei veröffentlichten Binaries auch gemacht wird). Der Vorteil ist natürlich, dass das die Compile-Zeiten schön kurz hält. Zig löst das Problem der Speichersicherheit aber nicht grundsätzlich, weil die Runtime-Checks in realen Release Builds nicht vorhanden sind, da der Laufzeit Overhead sonst einfach zu groß ist. Zudem werden auch bei Safe Build Modes die Fehler nicht zur Compile-Time verhindert, sondern führen zur Laufzeit zum Crash. Besser als falsches Verhalten und Sicherheitslücken, aber nicht so gut wie von vornherein ausgeschlossene Fehler.
Rust kann dazu noch Data Races ausschließen, was bei Zig gar nicht möglich ist.
Zig ist natürlich eine viel schlanke Sprache (wer darauf Wert legt) und hat viel bessere Compile-Zeiten als Rust. Und es hat schon einige Verbesserungen auch bezüglich Sicherheit gegenüber C, aber die Sicherheit und Robustheit von speichersicheren Sprachen wird mit Zig (augenblicklich) leider nicht erreicht.
Und täglich grüßt das Murmeltier, oder wie?
Jegliche „neue“ Programmiersprache wird immer und immer wieder als der Heilsbringer verkauft und dann in solchen Marketing versuchen, wie dieser Artikel hier, die vermeintlich bessere Programmiersprache zu puschen. Am Ende bleibt davon immer nichts übrig. Schaut euch PHP an. Im Web gibt es nichts besseres und weitverbreitestes als PHP. Wie oft wurde schon gesagt, dass PHP nun nicht mehr sei und ein neue Player kommen würde. Es langweilt. Besser wäre es, die Programmiersprache auch wirklich darzustellen. Was sind die Unterschied zu den etblierten Sprachen, was ist wirklcih besser, was ist schlechter? usw.
Denn sind wir mal ehrlich: Jeder, der wirklich Entwickler ist und nicht nur ein dahergelaufener Trendmitreisender und auch wirklich damit sein Geld verdient, der weißt, dass die Sprachen zu dem jeweiligen Projekt gesucht werden und nicht umgekehrt. Ich glaub, das hab ich schon im ersten Semester Informatik so vermittelt bekommen. Grundlagen also.