Zig 0.17.0 Release Notes

De ontwikkeling van Zig wordt gefinancierd via de Zig Software Foundation, een non-profitorganisatie (501(c)(3)).

Deze release bevat vijf maanden werk, met bijdragen van 206 verschillende ontwikkelaars, verdeeld over 925 commits. Hoewel werd voorspeld dat deze cyclus korter zou zijn, is de release aanzienlijk geworden. Het build-systeem is herzien, inclusief de introductie van het Build Server Protocol, en de ELF Linker is verbeterd tot een punt waarop we verwachten dat incrementele compilatie voor iedereen op x86_64-linux zal werken.

Ondersteuning voor Targets

Zig ondersteunt een breed scala aan architecturen en besturingssystemen. De onderstaande secties behandelen de targets waarvoor Zig programma's kan bouwen.

Belangrijke wijzigingen

  • aarch64-openbsd: Wordt nu native getest in de CI van Zig, wat zorgt voor hoogwaardige ondersteuning in de toekomst.
  • aarch64-freebsd en aarch64-netbsd: CI-jobs draaien nu ook op pull requests, naast master-pushes.
  • aarch64-windows: Er is een workaround geïmplementeerd voor een LLVM-bug die de meeste binaire bestanden brak, inclusief de Zig Compiler.
  • aarch64-openbsd: De compiler past nu verplichte code-hardening technieken toe zodat de resulterende binaries daadwerkelijk werken.
  • 32-bit ARM en SPARC: Zig biedt nu stack traces bij crashes en mislukte assertions.
  • AArch64: Zig handelt nu pointer-authenticatie opcodes af tijdens stack unwinding.
  • loongarch32-linux-gnu[sf]: Ondersteuning is toegevoegd.
  • 64-bit SPARC (vooral sparc64-linux): De ondersteuning is nu algemeen bruikbaar, grotendeels dankzij de nieuwe ELF linker die betere ondersteuning biedt dan LLD.
  • x32 en N32 ABI's: De Zig Standard Library is geporteerd naar deze niche ILP32 ABI's op respectievelijk x86-64 en 64-bit MIPS. Hiermee kan de 64-bit instructieset worden gebruikt met 32-bit pointers om geheugengebruik te verlagen en cache-benutting te verbeteren.
  • Gameconsoles: Target-informatie is toegevoegd voor aarch64-switch, arm-gba, mipsel-psx en powerpc-wiiu.
  • xtensa-linux: Vroege ondersteuning is toegevoegd via de C-backend of de experimentele LLVM-backend.
  • C-backend ondersteuning: De Standard Library ondersteunt nu arc[eb]-linux, csky-linux en m88k-openbsd.
  • No-libc ondersteuning: De Standard Library ondersteunt nu microblaze[el]-linux, sh[eb]-linux en sparc-linux.
  • PowerPC: Zig dwingt nu -mabi=ieeelongdouble af voor alle PowerPC-targets. Hierdoor vervalt de ondersteuning voor powerpc-linux-gnueabi[hf] (omdat glibc daar alleen het "double-double" formaat ondersteunt), maar powerpc-linux-musleabi[hf] blijft ondersteund.
  • powerpc64-linux-gnu: Ondersteuning is verwijderd omdat Zig alleen ELFv2-binaries voor 64-bit PowerPC ondersteunt, en glibc dit niet officieel ondersteunt op big endian of met IEEE long double.
  • CPU-detectie: De mogelijkheid om het native CPU-model en de functies te detecteren is sterk verbeterd voor bijna elke architectuur op elk ondersteund OS.

Gewijzigde baseline CPU-modellen

  • aarch64-haiku: cortex_a55
  • m68k-*: M68030
  • mips64-openbsd: octeon
  • powerpc-netbsd: 750
  • powerpc64-freebsd: pwr8
  • powerpc64-linux: pwr8
  • powerpc64-openbsd: pwr9
  • s390x-*: arch11
  • sparc-*: generic
  • sparc-linux: v9
  • sparc64-*: ultrasparc
  • xtensa-*: esp32

In de target query-syntax vindt detectie van de native libc-versie nu alleen plaats als de triple daadwerkelijk native libc gebruikt (d.w.z. wanneer het ABI-component wordt weggelaten).

Tier-Systeem

De ondersteuning van Zig is onderverdeeld in vier tiers, waarbij Tier 1 het hoogste niveau is. Het doel is dat Tier 1-targets nul uitgeschakelde tests hebben.

Tier 1

  • Alle niet-experimentele taalfuncties werken correct.
  • De compiler kan machinecode genereren zonder afhankelijk te zijn van LLVM.
  • De geïntegreerde fuzzer werkt op dit target (indien van toepassing).

Tier 2

  • De cross-platform abstracties van de Standard Library zijn geïmplementeerd.
  • Mislukte assertions en crashes produceren stack traces.
  • libc is beschikbaar, ook bij cross-compilatie (indien van toepassing).
  • CI-machines bouwen de module-tests bij elke push.

Tier 3

  • De compiler kan machinecode genereren via een externe backend zoals LLVM.
  • De linker kan object-bestanden, libraries en executables produceren.

Tier 4

  • De compiler kan assembly of C-broncode genereren.

Ondersteuningstabel

TierTargetCode Gen.LinkerLang. Feat.Std. Lib.Stack TracesFuzzerlibcCI
1x86_64-linux�
�
�
�
�
�
�
�
2aarch64-freebsd�
�
�
�
�
�
�
�
2aarch64[_be]-linux�
�
�
�
�
�
�
�
2aarch64-maccatalyst�
�
�
�
�
�
�
�
2aarch64-macos�
�
�
�
�
�
�
�
2aarch64[_be]-netbsd�
�
�
�
�
�
�
�
2aarch64-openbsd�
�
�
�
❌�
�
�
2aarch64-windows�
�
�
�
❌�
⚠️�
2arm-freebsd�
�
�
�
❌�
�
�
2arm[eb]-linux�
�
�
�
❌�
�
�
2arm[eb]-netbsd�
�
�
�
❌�
⚠️�
2arm-openbsd�
�
�
�
❌�
⚠️�
2hexagon-linux�
�
�
�
❌�
�
�
2loongarch32-linux�
❔�
�
❌�
⚠️�
2loongarch64-linux�
�
�
�
�
�
�
�
2mips[el]-linux�
�
�
�
❌�
�
�
2mips[el]-netbsd�
�
�
�
❌�
⚠️�
2mips64[el]-linux�
�
�
�
�
�
�
�
2mips64[el]-openbsd�
�
�
�
❌�
⚠️�
2powerpc-linux�
�
�
�
❌�
⚠️�
2powerpc-netbsd�
�
�
�
❌�
⚠️�
2powerpc-openbsd�
�
�
�
❌�
⚠️�
2powerpc64[le]-freebsd�
�
�
�
❌�
⚠️�
2powerpc64[le]-linux�
�
�
�
❌�
�
�
2powerpc64-openbsd�
�
�
�
❌�
⚠️�
2riscv32-linux�
�
�
�
❌�
�
�
2riscv32-netbsd�
�
�
�
�
�
⚠️�
2riscv64-freebsd�
�
�
�
�
�
⚠️�
2riscv64-linux�
�
�
�
�
�
�
�
2riscv64-netbsd�
�
�
�
�
�
⚠️�
2riscv64-openbsd�
�
�
�
❌�
⚠️�
2s390x-linux�
�
�
�
�
�
�
�
2sparc64-linux�
�
�
�
�
�
�
�
2thumb[eb]-linux�
�
�
�
❌�
�
�
2wasm32-wasi�
�
�
⚠️❌�
�
�
2x86-linux�
�
�
�
❌�
�
�
2x86-netbsd�
�
�
�
❌�
�
�
2x86-openbsd�
�
�
�
❌�
⚠️�
2x86-windows�
�
�
�
❌�
�
�
2x86_64-freebsd�
�
�
�
�
�
�
�
2x86_64-maccatalyst�
�
�
�
�
�
⚠️�
2x86_64-macos�
�
�
�
�
�
⚠️�
2x86_64-netbsd�
�
�
�
�
�
�
�
2x86_64-openbsd�
�
�
�
❌�
�
�
2x86_64-windows�
�
�
�
❌�
�
�
3aarch64-haiku�
�
�
�
❔❌❌�
3aarch64-ios�
�
�
�
❌❌❌�
3aarch64-serenity�
�
�
�
❔❌❌�
3aarch64-tvos�
�
�
�
❌❌❌�
3aarch64-visionos�
�
�
�
❌❌❌�
3aarch64-watchos�
�
�
�
❌❌❌�
3arm-haiku�
�
�
�
❌❌❌�
3mips64[el]-netbsd�
�
�
❌�
❌❌�
3riscv64-haiku�
�
�
�
❔❌❌�
3riscv64-serenity�
�
�
�
❔❌❌�
3thumb-windows�
�
�
�
❌�
❌�
3wasm64-wasi�
❔❌⚠️❌❌❌�
3x86-freebsd�
�
�
�
❌�
❌�
3x86-haiku�
�
�
�
❌❌❌�
3x86-illumos�
�
�
�
❌❌❌�
3x86_64-dragonfly�
�
�
�
❔❌❌�
3x86_64-haiku�
�
�
�
❔❌❌�
3x86_64-illumos�
�
�
�
❔❌❌�
3x86_64-serenity�
�
�
�
❔❌❌�
4alpha-linux❌❔�
�
❌❌❌�
4alpha-netbsd❌❔�
�
❌❌❌�
4alpha-openbsd❌❔�
�
❌❌❌�
4arc[eb]-linux❌❔�
�
❌�
❌�
4csky-linux❌❔�
�
❌�
❌�
4hppa-linux❌❔❌❌❌❌❌�
4hppa-netbsd❌❔�
❌❌❌❌�
4hppa-openbsd❌❔�
❌❌❌❌�
4hppa64-linux❌❔❌❌❌❌❌�
4m68k-linux❌❔�
�
❌�
❌�
4m68k-netbsd❌❔�
�
❌�
❌�
4m88k-openbsd❌❔�
�
❌❌❌�
4microblaze[el]-linux❌❔�
❌❌❌❌�
4or1k-linux❌❔�
�
❌❌❌�
4sh[eb]-linux❌❔�
❌❌❌❌�
4sh[eb]-netbsd❌❔�
❌❌❌❌�
4sh-openbsd❌❔�
❌❌❌❌�
4sparc-linux❌❔�
�
❌�
❌�
4sparc-netbsd❌❔�
❌❌�
❌�
4sparc64-netbsd⚠️�
�
❌�
�
❌�
4sparc64-openbsd⚠️�
�
❌❌�
❌�
4xtensa[eb]-linux❌❔�
❌❌❌❌�

OS Versie-eisen

De Zig Standard Library heeft minimale versie-eisen voor sommige ondersteunde besturingssystemen:

OSVersie
Darwin15.0+
DragonFly BSD6.4+
FreeBSD14.0+
Linux5.10+
NetBSD10.1+
OpenBSD7.8+
Windows10+

Aanvullende Platforms

Zig biedt diverse niveaus van ondersteuning voor deze targets, waarvoor het tier-systeem niet volledig van toepassing is: aarch64-driverkit, aarch64[be]-freestanding, aarch64-fuchsia, aarch64-hurd, aarch64-switch, aarch64-uefi, alpha-freestanding, amdgcn-amdhsa, amdgcn-amdpal, amdgcn-mesa3d, arc[eb]-freestanding, arm[eb]-freestanding, arm-3ds, arm-fuchsia, arm-gba, arm-uefi, arm-vita, avr-freestanding, bpf(eb,el)-freestanding, csky-freestanding, ez80-freestanding, ez80-tios, hexagon-freestanding, hppa[64]-freestanding, kalimba-freestanding, kvx-freestanding, lanai-freestanding, loongarch(32,64)-freestanding, loongarch(32,64)-uefi, m68k-freestanding, m88k-freestanding, microblaze[el]-freestanding, mips[64][el]-freestanding, mipsel-psx, mipsel-psp, msp430-freestanding, nvptx[64]-cuda, nvptx[64]-nvcl, or1k-freestanding, powerpc-wiiu, powerpc[64][le]-freestanding, powerpc64-ps3, propeller-freestanding, riscv(32,64)[be]-freestanding, riscv(32,64)-uefi, riscv64-fuchsia, riscv64-hurd, s390x-freestanding, sh[eb]-freestanding, sparc[64]-freestanding, spirv(32,64)-opencl, spirv(32,64)-opengl, spirv(32,64)-vulkan, spork8-freestanding, thumb[eb]-freestanding, thumb-fuchsia, thumb-gba, thumb-vita, ve-freestanding, wasm(32,64)-emscripten, wasm(32,64)-freestanding, x86[16,64]-freestanding, x86[64]-hurd, x86[64]-uefi, x8664-driverkit, x8664-fuchsia, x8664-plan9, x8664-ps4, x8664-ps5, xcore-freestanding, xtensa[eb]-freestanding.

Taalwijzigingen

Vooruitgang in Taalstabiliteit

Sinds de release van Zig 0.16.0 is er veel vooruitgang geboekt in het stabiliseren van de taal. Dit is een cruciale stap in de roadmap naar Zig 1.0. Er zijn ongeveer 25 taalvoorstellen geaccepteerd en 125 afgewezen.

Wijzigingen aan @bitCast

Zig 0.17.0 wijzigt de definitie van de @bitCast builtin.

De nieuwe definitie is dat @bitCast de logische bit-representatie van een waarde herinterpreteert als een ander type. Dit geldt voor:

  • void, bool.
  • Integer-types (behalve comptime_int).
  • Floating-point types (behalve comptime_float).
  • Integer-backed types: enum(T), packed struct(T), en packed union(T).
  • Arrays of vectoren van bovenstaande types.

Dit betekent dat de nieuwe @bitCast volledig endian-agnostisch is. Casts tussen extern struct of extern union types zijn niet langer toegestaan; gebruik hiervoor @ptrCast of een extern union.

Voorbeeld van migratie:

Foutieve code:

const TwoBytes = extern struct { b0: u8, b1: u8 };
const bytes: TwoBytes = .{ .b0 = 0x12, .b1 = 0xAB };
const int: u16 = @bitCast(bytes); // Error in 0.17.0

Correcte code:

const TwoBytes = extern struct { b0: u8, b1: u8 };
const bytes: TwoBytes = .{ .b0 = 0x12, .b1 = 0xAB };
const int_ptr: *align(1) const u16 = @ptrCast(&bytes);
const int = int_ptr.*;

Formeel Gespecificeerde en Gefuzzed Grammar

Er is een tool geschreven die de grammar.peg van Zig gebruikt om een recursive descent parser te genereren. Deze wordt gebruikt als orakel voor fuzz-testing en vergeleken met de handgeschreven std.zig.Ast.parse(). Dit zorgt voor één enkele bron van waarheid voor de grammatica.

C-translatie verplaatst naar extern pakket

@cImport is verwijderd. std.Build.Step.TranslateC is deprecated ten gunste van een expliciete package dependency op het officiële ZSF translate-c pakket.

Update-instructie: zig fetch --save git+https://codeberg.org/ziglang/translate-c

Nieuwe builtins: @backingInt en @fromBackingInt

Deze vervangen de deprecated @intFromEnum en @enumFromInt.

  • @backingInt: Werkt met alle enums, bitpacks met expliciete backing integer types, en tagged unions (geeft de integer van de actieve tag terug).
  • @fromBackingInt: Inferert het resultaattype (enum of bitpack). Bij enums resulteert een ongeldige tagwaarde in "Illegal Behavior" (veiligheidscheck).

@SpirvType toegevoegd

Voor SPIR-V targets kunnen nu types zoals images en samplers worden gedeclareerd die geen equivalent hebben in het normale Zig-type-systeem.

Verwijdering Array Vermenigvuldigingssyntax

De syntax a ** b is verwijderd. Gebruik nu @splat.

Migratie:

  • Oud: var result = [1]u8{0} ** window_size;
  • Nieuw: var result: [window_size]u8 = @splat(0);

@divCeil toegevoegd

De nieuwe @divCeil builtin voert integer-deling uit afgerond naar positieve oneindigheid. Voorbeeld: @divCeil(5, 3) == 2 en @divCeil(-5, 3) == -1.

Wijziging in @hasDecl

@hasDecl geeft nu alleen true terug voor publieke declaraties, ongeacht in welk bestand de controle wordt uitgevoerd.

Slices en Array Pointers

Het is nu toegestaan om een slice te derefereren of te coercen naar een array pointer van comptime lengte.

const slice: []const u16 = &.{ 1, 2, 3 };
const array: [3]u16 = slice.*;
const array_ptr: *const [3]u16 = slice;

Overige taalwijzigingen

  • void{} syntax verwijderd: Gebruik {}.
  • errdefer capture verwijderd: De capture |err| is niet langer toegestaan. Splits de functie in twee delen om de fout afzonderlijk af te handelen.
  • i0 verwijderd: Dit type was onzinnig; vervang het door u0.
  • Global Linkage: internal en link_once tags van std.lang.GlobalLinkage zijn verwijderd.

Standard Library

Nieuwe functies en verbeteringen

  • f128 ondersteuning voor @exp en @exp2.
  • std.Io.Semaphore.waitTimeout toegevoegd.
  • std.spirv helpers voor images toegevoegd.
  • ArrayHashMap.setKey optimalisatie (herberekent niet langer de volledige index).
  • std.Target.parseCpuModel geeft nu een optional terug in plaats van een error.
  • std.debug.Pdb: deduplicatie van inline bronlocaties.
  • std.fs.path: appending varianten voor relative en resolve toegevoegd.

Deprecations

  • std.heap.memorypool.AlignedManaged $\to$ std.heap.memorypool.Aligned.
  • std.heap.memorypool.ExtraManaged $\to$ std.heap.memorypool.Extra.
  • std.builtin $\to$ std.lang.
  • std.meta.fieldInfo, fieldNames, fieldTypes $\to$ @typeInfo.
  • std.DoublyLinkedList.pop $\to$ std.DoublyLinkedList.popLast.
  • std.gpu $\to$ std.spirv.
  • Diverse std.ascii en std.bit_set functies zijn hernoemd of verwijderd ten gunste van modernere varianten.

StackFallbackAllocator Herzien

StackFallbackAllocator is nu flexibeler. De buffer wordt nu als argument meegegeven in plaats van via een generiek type.

Migratie:

  • Oud: var stack = std.heap.StackFallbackAllocator(Size).init(gpa);
  • Nieuw: var stackbuf: [Size]Item = undefined; var stack = std.heap.StackFallbackAllocator.init(@ptrCast(&stackbuf), gpa);

Introductie SafeAllocator

std.heap.DebugAllocator is vervangen door SafeAllocator, een thread-safe allocator met garanties tegen leaks, double frees en memory corruption. Elke allocatie wordt gevolgd door een AllocFooter met metadata en checksums.

ArrayList Wijzigingen

  • getLastOrNull $\to$ last.
  • getLast $\to$ last in combinatie met .?.
  • lastPtr toegevoegd (retourneert ?*T).

Overige Std Lib wijzigingen

  • debug.SafetyLock: Ondersteuning voor shared locking toegevoegd (lockShared / unlockShared).
  • fmt.allocPrint: Verplaatst naar mem.Allocator (nu arena.print).
  • Formatted Printing: {q} specifier heeft nu relaxed escaping voor UTF-8; {qf} is geïntroduceerd voor het ontsnappen van format() output.
  • std.zon.parse: Herzien om struct-args te gebruiken en resultaten vanuit een arena te alloceren.
  • bit_set: Types hernoemd voor consistentie (bijv. IntegerBitSet $\to$ Integer).
  • std.lang.Type: Gebruikt nu Struct-Of-Arrays stijl bij type-reflectie.
  • lang.OptimizeMode: Hernoemd naar lang.Optimize (bijv. ReleaseSafe $\to$ safe).
  • @import("builtin"): Constanten zoals cpu, os en abi zijn deprecated; gebruik target.cpu, target.os, etc.
  • mem.eql en mem.findDiff: Correcte afhandeling van floats (geen short-circuiting meer bij NaN).
  • Uri en net.HostName: Ontkoppeld. Uri.getHost is verplaatst naar HostName.fromUri.

Build Systeem

Maker en Configurer Processen

zig build draait de build.zig code nu in een apart executable (het "maker" proces), gescheiden van het proces dat package management en de build graph uitvoert. Dit maakt zig build sneller.

Herzien Cache-systeem

  • Directory ondersteuning: Wijzigingen in directories kunnen nu een cache-miss veroorzaken.
  • Metadata mode: Cache-miss op basis van grootte, inode of mtime, ongeacht de inhoud.
  • Binair formaat: Gebruikt nu een binair formaat, wat resulteert in $\approx 25\%$ kleinere bestanden en snellere cache-hits (5-10%).

Configure Cache Poisoning

Het concept "cache poisoning" is geïntroduceerd voor situaties waarin de configuratie-logica side-effects heeft die niet door het cachesysteem gevolgd kunnen worden (bijv. het aanroepen van findProgram). Gebruik std.Build.dependOnFileContents als alternatief.

findProgram en findProgramLazy

  • findProgram: Zoekt direct tijdens de configuratiefase (vergiftigt de cache).
  • findProgramLazy: Cre