В Zig глобально перекроили систему сборки. Раньше zig build запускал один процесс, который компилировал build.zig и сразу выполнял план сборки. Теперь логику разделили: configurer обрабатывает скрипт пользователя в Debug-режиме и сериализует конфиг, а maker выполняет сборку в ReleaseSafe. Разделение позволило избавиться от перекомпиляции всей инфраструктуры при каждом изменении build.zig. Бенчмарки показывают драматический прирост: zig build --help теперь выполняется за 14 мс вместо 150, и это без перезапуска maker при изменении флагов. API сломалось только в мелочах — например, b.args больше не доступен скриптам, зато аргументы можно менять без пересборки. Кстати, пакетный менеджер теперь живёт внутри maker, а HTTP-клиент, TLS, Git-протокол и парсеры архивов поставляются в исходниках — их можно патчить без пересборки компилятора.
Серьёзно обновили SPIR-V бэкенд. Ввели встроенную функцию @SpirvType — она позволяет описывать типы шейдеров, которые не выразить в обычной Zig-системе типов (сэмплеры, изображения, runtime-массивы). Информацию о режиме выполнения теперь передают через calling convention, а не через inline assembly. Добавили конвенции spirv_task и spirv_mesh для mesh shading. Capabilities и extensions теперь управляются через наборы CPU-фич, как на других таргетах. Многопоточный кодген перевёл SPIR-V на общую архитектуру Mir — это ускорило сборку и вернуло проходы dedup_types и prune_unused. Объектные файлы .spv теперь линкуются как обычные объектники. Количество проходящих behaviour-тестов подросло на 10% (до 49%).
Мэтью Лагг переопределил @bitCast. Раньше он работал через reinterpretation памяти, что давало разные результаты на big- и little-endian. Теперь @bitCast оперирует «логическими битами»: для массивов и векторов порядок элементов всегда little-endian — первый элемент становится младшими битами. Это позволило, например, превращать [2]u3 в @Vector(3, u2), а целые числа разбирать на вектор битов. Новую семантику уже поддерживает self-hosted x86_64 бэкенд, а сам компилятор выиграл ~5% производительности за счёт того, что LLVM лучше оптимизирует @bitCast. Заодно запретили @bitCast для векторов указателей и разрешили для enum'ов.
Инкрементальная компиляция наконец-то заработала и с LLVM-бэкендом. Пока это не ускоряет генерацию объектного кода LLVM, но ошибки компиляции теперь вылетают за миллисекунды. Фичу можно включить флагами -fincremental --watch.
Новый ELF-линковщик (по умолчанию выключен, включается -fnew-linker) дорос до компиляции самого Zig с LLVM и LLD. Главная фишка — быстрые инкрементальные пересборки с внешними библиотеками. На x86_64 Linux время пересборки компилятора упало с 36 секунд до ~250 мс. Пока не поддерживает DWARF-отладку, но это следующий приоритет.
Переписана логика разрешения типов. Компилятор стал ленивее: если поле структуры не используется, Zig не анализирует его содержимое — так, @compileError в неиспользуемом поле больше не ломает сборку. Диагностика циклических зависимостей стала намного понятнее — показывает цепочку с точными ссылками. Инкрементальная компиляция тоже выиграла: исправлены «over-analysis» баги, при которых система делала лишнюю работу.
В преддверии релиза Zig 0.17.0 (ожидается в ближайшие недели) в мастер добавили также экспериментальный std.Io.Evented — стеклопереключаемые корутины (fibers, green threads). Пока рановато для продакшена, но уже можно пробовать. Релиз обещает быть насыщенным.