Разработчики Zig подвезли сразу несколько крупных изменений. Мэттью Лагг (Matthew Lugg) запустил новую реализацию ELF-линкера, которая дебютировала в Zig 0.16.0 и по умолчанию отключена (включается флагом -fnew-linker). Главная фишка — быстрая инкрементальная компиляция. На x86_64 Linux она теперь работает даже при линковке внешних библиотек и C-кода — без потери производительности. Лагг показал, как правки в клоне «Тетриса» Эндрю Келли (Andrew Kelley) собираются за 30 миллисекунд, а сам компилятор Zig пересобирается за 200–300 мс вместо 36 секунд. Пока линкер не умеет генерировать DWARF-отладочную информацию, но для быстрой итерации это не критично.
Эндрю Келли переработал систему сборки. Раньше build.zig и раннер выполнялись в одном монолитном процессе в Debug-режиме. Теперь сборка разделена на два процесса: маленький «configurer», который строит граф сборки и сериализует его в бинарный конфиг, и «maker», который исполняет этот граф в Release-режиме. Результат — zig build --help выполняется за 14 мс вместо 150 мс, потребляя в 24 раза меньше инструкций CPU. Важно: при изменении аргументов --help build.zig больше не нужно перекомпилировать. Для сторонних инструментов вроде ZLS упрощается интеграция — они могут читать сериализованный конфиг вместо форка раннера.
Лагг также доработал LLVM-кодогенерацию: инкрементальная компиляция заработала и с LLVM-бэкендом. Она не ускоряет сам «LLVM Emit Object» (это упирается в LLVM), но резко сокращает время на выдачу ошибок компиляции — теперь ошибки приходят за миллисекунды, а не секунды.
Ещё один большой PR от Лагга — переработка системы разрешения типов (30 000 строк). Компилятор стал ленивее анализировать поля типов: если тип не инициализируется, Zig не смотрит, что внутри. Раньше код с @compileError внутри неиспользуемого поля вызывал ошибку — теперь работает. Сообщения о зависимостях (dependency loop) стали подробными: компилятор показывает, какие типы зациклены и какой шаг нужно убрать. Кроме того, почти устранены проблемы с «over-analysis» — инкрементальная компиляция стала значительно быстрее.
Наконец, Келли добавил флаг --fork=[путь] для zig build. Он позволяет переопределить любой пакет в дереве зависимостей локальной копией исходников. Удобно для тестирования форков: вы работаете в своём репозитории, а флаг делает подмену временно — убрали флаг, вернулись к оригиналу. Пакеты теперь хранятся локально в zig-pkg/ (рядом с build.zig), что упрощает офлайн-сборку и архивацию, а в глобальном кеше лежат сжатые архивы — в будущем это позволит раздавать пакеты через p2p-торренты.