← На главную

Zig 0.17.0 ускорил компиляцию, добавил SPIR-V и io_uring

25.06.2026 22:03 · hackernews

Компилятор Zig получил крупную порцию обновлений. Разработчики переписали внутреннюю логику разрешения типов, что ускорило инкрементальную компиляцию и улучшило диагностику. Если раньше компилятор пытался анализировать поля структуры даже тогда, когда они не нужны, теперь он ленится — тип с @compileError внутри не вызовет ошибку, пока до него реально не дойдёт дело. Сообщения о циклических зависимостях стали внятными: Zig теперь показывает точную цепочку, где и почему возник цикл.

SPIR-V бэкенд тоже догнали. Появился новый встроенный @SpirvType — он позволяет описывать типы вроде сэмплеров и изображений, которые раньше невозможно было выразить в системе типов Zig. Режимы выполнения шейдеров теперь передаются через calling convention, а не через inline assembly. Добавлены соглашения spirv_task и spirv_mesh для mesh shading. SPIR-V бэкенд наконец-то получил многопоточный кодогенератор, как у остальных бэкендов, и научился линковать .spv файлы как объектные.

Серьёзно переработали LLVM бэкенд. Zig перестал использовать бит-инты в памяти для целых нестандартной битности — теперь они расширяются до ABI-совместимых типов. Это закрыло проблему с плохой оптимизацией и редкими miscompilation'ами. Заодно переопределили семантику @bitCast. Раньше он работал через reinterpretation байтов в памяти и зависел от endianness. Теперь он оперирует «логическими битами» — порядок бит фиксирован, и поведение одинаково на любом железе. Для LLVM и C бэкендов наконец имплементировали новые правила, которые уже работали в x86_64 бэкенде.

Новый ELF линкер, дебютировавший в версии 0.16.0, теперь умеет собирать сам компилятор Zig с LLVM и LLD. Главная фишка — быстрая инкрементальная пересборка: на x86_64 Linux ребилд проекта занимает миллисекунды, даже с внешними библиотеками. Пока не хватает DWARF-отладочной информации, но это в приоритете.

Система сборки zig build получила архитектурное изменение: процесс разделили на «конфигуратор» и «исполнитель». build.zig компилируется в лёгкий процесс, сериализует граф сборки в бинарный файл, а тяжёлая работа делается отдельным процессом, собранным в релизном режиме. zig build --help стал работать в 10 раз быстрее, а изменение аргументов командной строки больше не требует перекомпиляции скрипта сборки.

И наконец, std.Io.Evented — экспериментальная реализация ввода-вывода на userspace-переключении стеков (зелёные потоки). Код приложения не меняется, достаточно заменить std.Io.Threaded на std.Io.Evented, и весь I/O начинает работать через io_uring. Компилятор Zig уже нормально работает поверх Evented. Релиз 0.17.0 ожидается со дня на день.

Читать оригинал →