ZIG Build

zig ist nicht nur eine Sprache und ein alternative C/C++ Compiler, es ist auch ein ganzes Build-System und füllt damit auch jene Lücken aus, die andere Compiler mit CMake stopfen müssen.


Mal ehrlich … warum war es in 50 Jahren C und 40 Jahren C++ ums Verrecken nicht möglich, das hinzubekommen, was “ein Junge aus New York” (Andrew Kelley) jetzt einfach an die Tafel bzw. ins Netz schreibt?

zig entwickelt sich in meinen Augen immer mehr zu dem Vorzeigebeispiel, was alle Compiler eigentlich können sollten, egal welcher Sprachfamilie sie angehören.

Die Idee ist einfach: zig kann eine “spezielle” Datei mit Standard-zig Code dazu benutzen, einen Build-Prozess zu beschreiben um andere Sourcen zu einem Projekt zusammenzufassen, Abhöngigkeiten herunterzuladen und zu bauen.

Man braucht also kein zusätzliches git oder einen OS-Paketmanager für den Download, keinen Build-Graph-Manager zum Dateien-Herauspicken und keinen externen Prozess, der den Compiler steuert.
Alles das macht die zig.exe selbst.

Abhängigkeiten per .zon

Als Javascript seine Objekt-Syntax als Dateiformat namens JSON (JavaScript Object Notation) neu vermarktete, war das schon echt genial und hat unser Denken reformiert.

zig führt mit ZIG-Object-Notation (ZON) genau das gleiche Konzept ein und stützt sich dabei auf seine Möglichkeit, anonyme Strukturen überall frei definieren zu können.

1const mystruct = .{
2    .a: "hello",
3    .b: 42
4};

Einziger Unterschied zu JSON ist der . vor den Membern.

Wie geil wäre es wohl gewesen, hätten wir das in C schon seit den 90ern?

Und nun stelle man sich noch vor, in einer solchen .zon Datei wären URLs mit ZIP-Dateien hinterlegt, wo Sourcecodes drinnen sind und zig würde diese Inhalte herunterladen und für Build-Prozesse nutzen.
Genial!

build.zig

Statt eine Pseudo-Sprache wie cmake, schreiben wir echten zig Code, der in etwa so aussieht:

 1const std = @import("std");
 2
 3pub fn build(b: *std.Build) void {
 4    const lib = b.addStaticLibrary(....);
 5    lib.addIncludePath(....);
 6    lib.addCSourceFile(....);
 7    lib.linkLibC();
 8    b.installArtifact(lib);
 9
10    const exe = b.addExecutable(....);
11    exe.linkLibrary(lib);
12    b.installArtifact(exe);
13}

Oder anders gesagt: zig kompiliert eine build() Funktion, die wir geschrieben haben, wo zig sein eigenes std.Build Objekt hineinwirft und wir dort Build-Vorgaben machen, wie Projekte zu ihren Dateien und Abhängigkeiten kommen.

Am Ende führt ein zig build einfach den Code in unserer build.zig Datei aus um zu Erfahren, wie der Build ablaufen soll … und macht dann genau das.

Fazit

Ich kann jedem nur empfehlen, ein leeres Verzeichnis anzulegen, dann
zig init darin auszuführen und den generierten Code anzusehen.

Genau das hätte jeder C-Compilerhersteller schon vor Jahrzehnten einführen können … doch leider Nein.

Ich gebe zu, dass nicht alle Objektmethoden des ZIG-Build Objektes perfekt sind … um nicht zu sagen, dass es kompliziert werden kann, wenn man viele unterschiedliche Einstellungen setzen will.

Dennoch ist alleine die Idee, dass der Compiler den gesamten Buildprozess gestaltet und alles in einer Sprache ohne zusätzliches externes Scripting auskommt, einfach nur schön und durchdacht umgesetzt.

Hätte es zig schon vor 10 Jahren auf die große Bühne geschafft, so hätte ich heute das GATE Projekt vermutlich ausschließlich in zig geschrieben. Leider hat mir hier die Zeitlinie dann doch einen Streich gespielt.

… aber die große Zeit von zig kommt … unaufhaltsam.

📧 📋 🐘 | 🔗 🔔
 

Meine Dokus über:
 
Weitere externe Links zu:
Alle extern verlinkten Webseiten stehen nicht in Zusammenhang mit opengate.at.
Für deren Inhalt wird keine Haftung übernommen.



Wenn sich eine triviale Erkenntnis mit Dummheit in der Interpretation paart, dann gibt es in der Regel Kollateralschäden in der Anwendung.
frei zitiert nach A. Van der Bellen
... also dann paaren wir mal eine komplexe Erkenntnis mit Klugheit in der Interpretation!