EMZETT.
Login

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

Kapitel 1 von 8 im Kurs Zig. Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

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 malloc im Verborgenen
  • Fehler als Werte (error-Typen, try, catch) statt Exceptions
  • C-Interop: C-Header direkt einbinden, C-Code mit zig cc kompilieren, 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 starten

Optimierungsmodi: 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: !void bedeutet “kann einen Fehler liefern, sonst nichts”
  • try gibt Fehler an den Aufrufer weiter
  • print nimmt einen Formatstring und ein Tupel .{ ... } mit den Werten
  • Anweisungen enden mit ;, Kommentare mit //; es gibt keine Blockkommentare

Hinweis

std.debug.print schreibt auf den Fehlerkanal (stderr) und eignet sich zum schnellen Debuggen. Für normale Ausgabe nutzt du std.io.getStdOut().writer(). Die Beispiele hier verwenden dazu const 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 build
  • const std = @import("std");, pub fn main() !void
  • Ausgabe: std.io.getStdOut().writer() und print mit .{ ... }
  • 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

Weiter im Kurs

Weiter: Variablen, Typen und Kontrollfluss

Alle Kapitel: Zig im Überblick