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
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");
}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
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", .{});
}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"So führst du den Code aus: Datei hallo.zig speichern und mit zig run hallo.zig ausführen (Zig von ziglang.org).
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
Aufgabe
Gib mit print deinen Namen und das Ergebnis von 6 * 7 aus.