Zig обновился до версии 0.9.0
2026-02-21 03:13 Diff

Любитель научной фантастики и технологического прогресса. Хорошо сочетает в себе заумного технаря и утончённого гуманитария. Пишет про IT и радуется этому.

Спустя шесть месяцев работы и 2023 коммитов команда разработчиков Zig выпустила обновление 0.9.0. Теперь Toolchain работает лучше, Self-Hosted Compiler завершён на 44 процента, Support Table расширена, а Standard Library стал более полезным.

Одно из главных изменений языка — возможность выделить для указателя или переменной определённое адресное пространство. Делается это с помощью ключевого слова addrspace.

pub const will_be_placed_in_flash: i32 addrspace(.flash) = 123; pub fn readFlash(ptr: *addrspace(.flash) i32) i32 { return ptr.*; }

Теперь @tagName, @errorName, @typeName и @embedFile являются *[N: 0]const u8, а не []const u8. Это означает, что они могут использоваться везде, где допустим строковый литерал. Другими словами, их можно привести к одному из следующих типов:

[]const u8 [*:0]const u8 [:0]const u8

Добавлены @minimum и @maximum. Они могут принимать целые и дробные числа, а также векторы. В последнем случае сравнение происходит поэлементно.

@minimum(a: T, b: T) T

Удалили ключевые слова true, false, undefined и null. Теперь они являются примитивами, такими как void, u32 и прочие. Их можно использовать, например, в качестве имён для свойств структур:

const Foo = struct { true: i32, false: i32, undefined: i32, null: i32, };<

В Zig появился синтаксис, который позволяет производить безопасные арифметические операции. Если результат не помещается в переменную определённого типа, то значение будет приведено к минимуму или максимуму.

const std = @import("std"); const expect = std.testing.expect; test "example" { var x: u8 = 200; var y: u8 = 100; try expect(x +| y == 255); try expect(y -| x == 0); try expect(y *| x == 255); try expect(y <<| x == 255)$ zig test saturating_arithmetic.zig 1/1 test "example"... OK All 1 tests passed.

Теперь компилятор выдаёт ошибки для неиспользуемых локальных переменных или параметров.

test "example" { var x: i32 = 1234; }$ zig test test.zig docgen_tmp/test.zig:2:9: error: unused local variable var x: i32 = 1234; ^

А ещё добавили @select. Он выбирает значения поэлементно из векторов a и b по предикату pred. Если pred[i] истинно, то результатом будет a[i], иначе b[i].

@select(comptime T: type, pred: @Vector(len, bool), a: @Vector(len, T), b: @Vector(len, T)) @Vector(len, T)

Разработчики рассказали, что следующее мажорное обновление — 0.10.0 — будет включать стабилизацию языка, первый драфт спецификации, а также завершённый компилятор.

Полный список изменений можно посмотреть на официальном сайте.

Бесплатный курс по Python ➞
Мини-курс для новичков и для опытных кодеров. 4 крутых проекта в портфолио, живое общение со спикером. Кликните и узнайте, чему можно научиться на курсе. Смотреть программу