Код
#новости

Zig обновился до версии 0.9.0

Пофиксили баги, улучшили компилятор, расширили количество поддерживаемых систем и добавили новые фичи в язык.

Спустя шесть месяцев работы и 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 — будет включать стабилизацию языка, первый драфт спецификации, а также завершённый компилятор.

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


Жизнь можно сделать лучше!
Освойте востребованную профессию, зарабатывайте больше и получайте от работы удовольствие.
Каталог возможностей
Понравилась статья?
Да

Пользуясь нашим сайтом, вы соглашаетесь с тем, что мы используем cookies 🍪

Ссылка скопирована