Язык Zig (канал)
173 subscribers
26 photos
3 videos
6 files
239 links
Download Telegram
Язык Zig (канал)
0.11.0 тудум тудум 🥳🥳 #upstream
Выпуск Zig 0.12.0 🎉🎉🎉
И снова жирнющий релиз получился
https://ziglang.org/download/0.12.0/release-notes.html

#upstream

p.s. странно, что стрима не было
🔥13👎1
Эндрю планирует выпустить 0.13.0 и 0.12.1 в понедельник... так что отправляйте свои пулл-реквесты, пока не поздно.
I'm planning to release 0.13.0 and 0.12.1 on Monday, primarily featuring the LLVM 18 upgrade and musl 1.2.5 upgrade. If there are any other impactful changes you want to land, you have 5 days to get them in. 0.12.1 will be the last release in the 0.12.x series.


Говорит, такой быстрый выпуск чтобы дистрибутивы могли LLVM 18 спокойно использовать:
the release is primarily aimed at helping distributions package zig since it updates to LLVM 18. distros which have llvm 17 can package zig 0.12.1; distros that have llvm 18 can package 0.13.0


#upstream
🔥5🤯2
Как новый std.Progress будет выглядеть в режиме дерева (как у zig build --summary all):

https://asciinema.org/a/gDna9RnicwYjDRIDn4e07NFSc

#upstream
Неофициальная неполная таблица от matu3ba с функциями из compiler_rt для разных архитектур, плюс галочка реализовано или нет в Zig.

Если у вас во время компиляции появилась ошибка по типу:
ld.lld: error: undefined symbol: _bla_bla

То скорее всего эту функцию ещё не портировали на Zig, можете свериться с таблицей.

https://github.com/matu3ba/zig_unofficial_compiler_rt_docs
Ещё одна библиотека для корутин и асинхронного I/O (на этот раз два-в-одном, а не раздельно как с zigcoro + libxev):
https://cloudef.github.io/zig-aio
https://github.com/Cloudef/zig-aio

#библиотеки
https://ziggy-lang.io/
https://github.com/kristoff-it/ziggy

Ещё одна (если считать ZON) зигоподобная альтернатива JSON/YAML/TOML/т.д. . В отличии от ZON, синтаксис вдохновлен Зиг, но не копирует его (поэтому есть прикольные новые фичи, которых не в Zig и ZON):
.id = @uuid("..."),
.time = 1710085168,
.payload = Command {
.do = @action("clear_chat"),
.sender = "kristoff-it",
.roles = ["admin", "mod"],
.extra = {
"agent": "Mozilla/5.0",
"os": "Linux/x64",
},
}
👀4🔥2
Язык Zig (канал)
Экспериментальная поддержка Zig в re2c (генераторе лексера, юзается в ninja, php, т.д.), это вдобавок к C/C++/Rust. https://github.com/skvadrik/re2c/commit/5cd48a8ffb1bfc82b17bd7f381437efd1678b188 https://github.com/skvadrik/re2c/issues/451#issuecomment-2229461380
Пример:

// re2zig $INPUT -o $OUTPUT

const std = @import("std");

fn lex(yyinput: [:0]const u8) bool {
var yycursor: u32 = 0;
/*!re2c
re2c:define:YYCTYPE = u8;
re2c:yyfill:enable = 0;

number = [1-9][0-9]*;

number { return true; }
* { return false; }
*/
}

test {
try std.testing.expect(lex("1234"));
}

Конвертируется в:
// Generated by re2c
// re2zig $INPUT -o $OUTPUT

const std = @import("std");

fn lex(yyinput: [:0]const u8) bool {
var yycursor: u32 = 0;

var yych: u8 = 0;
var yystate: u32 = 0;
while (true) {
switch (yystate) {
0 => {
yych = yyinput[yycursor];
yycursor += 1;
switch (yych) {
0x31...0x39 => {
yystate = 2;
continue;
},
else => {
yystate = 1;
continue;
},
}
},
1 => { return false; },
2 => {
yych = yyinput[yycursor];
switch (yych) {
0x30...0x39 => {
yycursor += 1;
yystate = 2;
continue;
},
else => {
yystate = 3;
continue;
},
}
},
3 => { return true; },
else => { @panic("internal lexer error"); },
}
}

}

test {
try std.testing.expect(lex("1234"));
}
👍1
Язык Zig (канал)
Пример: // re2zig $INPUT -o $OUTPUT const std = @import("std"); fn lex(yyinput: [:0]const u8) bool { var yycursor: u32 = 0; /*!re2c re2c:define:YYCTYPE = u8; re2c:yyfill:enable = 0; number = [1-9][0-9]*; number…
с labeled switch было бы ещё легче, но тот PR пока не смержили, так шо вот... тут та же стратегия что и в Rust версии используется емнип, в C/C++ как раз goto-шный switch (на который похож наш будущий labeled switch), чет тип такого:
state: switch (yystate) {
    0 => {
        yych = yyinput[yycursor];
        yycursor += 1;
        switch (yych) {
            '1'...'9' => continue :state 2,
            else => continue :state 1
        }
    },
    1 => { return false; },
    2 => {
        yych = yyinput[yycursor];
        switch (yych) {
            '0'...'9' => {
                yycursor += 1;
                continue :state 2;
            },
            else => continue :state 3,
        }
    },
    3 => { return true; },
    else => { @panic("internal lexer error"); },
}