Kurz: Zig (Andrew Kelley, 2016) ist eine Systemprogrammiersprache als moderner Ersatz für C: ohne versteckte Kontrolle, ohne versteckte Speicherallokation, ohne Präprozessor und Makros. Das Motto.
Teil des Kurses Zig
Was ist Zig?
Zig (Andrew Kelley, 2016) ist eine Systemprogrammiersprache als moderner Ersatz für C: ohne versteckte Kontrolle, ohne versteckte Speicherallokation, ohne Präprozessor und Makros. Das Motto: “Was du siehst, passiert.” Zig ist klein (eine Spezifikation, die man an einem Nachmittag liest), bietet aber mächtige Werkzeuge:
comptime: beliebiger Zig-Code läuft zur Übersetzungszeit (Generics ohne Templates)- Explizite Speicherverwaltung mit Allocators statt
mallocim Verborgenen - Fehler als Werte (
error-Typen,try,catch) statt Exceptions - C-Interop: C-Header direkt einbinden, C-Code mit
zig cckompilieren, Cross-Compiling out of the box - Sicherheit im Debug-Modus: Überlauf-, Grenzen- und
null-Prüfungen
Eingesetzt in Bun (JS-Laufzeit), TigerBeetle (Datenbank), dem Ghostty-Terminal und Spielen. Zig ist noch vor Version 1.0: Sprache und Standardbibliothek ändern sich zwischen Versionen. Dieser Kurs nutzt Zig 0.13.
Ausführen
zig run hallo.zig # übersetzen und starten
zig build-exe hallo.zig # ausführbare Datei erzeugen
zig build-exe -O ReleaseFast hallo.zig # optimiert
zig test datei.zig # Tests ausführen
zig init # Projektgerüst mit build.zig
zig build run # Projekt bauen und startenOptimierungsmodi: Debug (Prüfungen, Standard), ReleaseSafe (schnell, mit Prüfungen), ReleaseFast, ReleaseSmall.
Das erste Programm
hallo.zig
const std = @import("std");
pub fn main() !void {
const out = std.io.getStdOut().writer();
try out.print("Hallo, {s}!\n", .{"Zig"});
try out.print("2 + 3 = {d}\n", .{2 + 3});
try out.writeAll("Zeile ohne Format\n");
}Ausgabe:
Hallo, Zig!
2 + 3 = 5
Zeile ohne Format@import("std")lädt die Standardbibliothek (Builtins beginnen mit@)pub fn main() !void:!voidbedeutet “kann einen Fehler liefern, sonst nichts”trygibt Fehler an den Aufrufer weiterprintnimmt einen Formatstring und ein Tupel.{ ... }mit den Werten- Anweisungen enden mit
;, Kommentare mit//; es gibt keine Blockkommentare
Hinweis
std.debug.printschreibt auf den Fehlerkanal (stderr) und eignet sich zum schnellen Debuggen. Für normale Ausgabe nutzt dustd.io.getStdOut().writer(). Die Beispiele hier verwenden dazuconst out = ....
Formatieren
const std = @import("std");
pub fn main() !void {
const out = std.io.getStdOut().writer();
try out.print("{d} {d:.2} {s} {c} {}\n", .{ 42, 3.14159, "Text", 'Z', true });
try out.print("{x} {X} {b} {o} {e}\n", .{ 255, 255, 5, 8, 12345.678 });
try out.print("[{d:>5}] [{d:<5}] [{d:^5}] [{d:0>5}] [{s:*^9}]\n", .{ 42, 42, 42, 42, "mitte" });
try out.print("{any} {any}\n", .{ [_]u8{ 1, 2, 3 }, @as(?i32, null) });
try out.print("{} {}\n", .{ 1 + 1, @as(f32, 2) / 3 });
try out.print("{s} {d}\n", .{ @typeName(i32), @sizeOf(u64) });
try out.print("{{geschweift}} und \"Anführung\"\n", .{});
}Ausgabe:
42 3.14 Text Z true
ff FF 101 10 1.2345678e4
[ 42] [42 ] [ 42 ] [00042] [**mitte**]
{ 1, 2, 3 } null
2 6.666667e-1
i32 8
{geschweift} und "Anführung"Merke
- Zig ist eine einfache, explizite Systemsprache: keine versteckten Allokationen, keine Makros
zig run,zig build-exe,zig test,zig buildconst std = @import("std");,pub fn main() !void- Ausgabe:
std.io.getStdOut().writer()undprintmit.{ ... } comptime, Allocators und Fehler als Werte sind die Kernideen
Übungsaufgabe
Gib mit print deinen Namen und das Ergebnis von 6 * 7 aus.
Quiz zur Selbstkontrolle
Wofür steht ! in !void?
- Die Funktion kann einen Fehler zurückgeben (richtig)
- Die Funktion ist unsicher
- Die Funktion ist asynchron
- Die Funktion ist privat
Wie beginnen Builtin-Funktionen?
- Mit @ (richtig)
- Mit #
- Mit $
- Mit _
Wofür steht Zig?
- Eine Systemsprache als moderner Ersatz für C (richtig)
- Eine Skriptsprache für Webseiten
- Eine Datenbank
- Ein Texteditor
Weiter im Kurs
Weiter: Variablen, Typen und Kontrollfluss
Alle Kapitel: Zig im Überblick