Рекомендуем
VPS на Windows и Linux — от 49 ₽ за 7 дней Быстрый запуск сервера на NVMe для сайтов, ботов и других задач.
Выбрать VPS

Zig 0.17.0 ускоряет сборку проектов и приближает язык к версии 1.0

Zig 0.17.0 оказался крупнее, чем планировали разработчики: за пять месяцев в него вошли 925 коммитов от 206 участников. Релиз перестроил систему zig build, добавил Build Server Protocol и заметно продвинул инкрементальную компиляцию для x86_64 Linux, одновременно приблизив язык к стабилизации перед 1.0.

Zig 0.17.0 ускоряет сборку проектов
Zig 0.17.0 ускоряет сборку проектов

Zig 0.17.0 меняет архитектуру zig build

Стабильные сборки Zig 0.17.0 появились на официальной странице загрузок 1 октября 2026 года, а отдельная публикация о релизе вышла 2 октября. Цикл разработки занял пять месяцев: 206 участников внесли изменения через 925 коммитов. Для версии с номером 0.17 это получился заметно более крупный цикл, чем команда изначально ожидала.

Самое глубокое изменение спрятано внутри системы сборки. В Zig 0.17.0 выполнение build.zig отделили от процесса, который управляет пакетами и выполняет граф сборки. Архитектура теперь разделена на configurer, который формирует конфигурацию, и maker, который выполняет саму работу.

У такого разделения есть вполне осязаемый эффект. Исполняемый файл maker после установки Zig можно собрать один раз, изменения в build.zig больше не требуют пересборки этого компонента. Логику конфигурации в некоторых сценариях можно пропустить полностью, а описание проекта сериализуется в компактный бинарный формат.

Именно этот формат стал фундаментом нового Build Server Protocol. При запуске zig build с параметром --listen=- внешние инструменты могут получить структуру графа сборки, отслеживать начало и завершение отдельных шагов, видеть ошибки и созданные файлы, а также запрашивать выполнение конкретных этапов.

Здесь у релиза есть заметная шероховатость. Разделение configurer и maker ломает совместимость ZLS с Zig 0.17.0. Команды Zig и ZLS уже работают над расширением протокола, чтобы языковой сервер снова получил доступ к данным сборки и в дальнейшем мог использовать больше возможностей, чем раньше.

Инкрементальная компиляция стала практичнее на x86_64 Linux

В Zig несколько лет развивается инкрементальная компиляция — режим, при котором после изменения исходного кода компилятор повторно обрабатывает только затронутые части проекта. В 0.17.0 команда исправила множество связанных ошибок и серьёзно продвинула новый ELF-линкер.

Для большинства проектов под x86_64-linux этот режим теперь можно использовать через команду:

zig build -fincremental --watch

После запуска система сборки следит за изменениями исходных файлов и выполняет инкрементальную пересборку. В release notes команда описывает цель этого механизма как возможность получать почти мгновенные пересборки после правок кода.

Связка работает благодаря новому ELF-линкеру. В 0.17.0 он получил полноценную поддержку x86_64 и SPARC64, генерацию статических и динамических библиотек, GNU symbol versioning, DWARF debug information, таблицы хешей символов и другие функции. По оценке разработчиков Zig, новый линкер уже способен собирать подавляющее большинство Zig-проектов под x86_64-linux.

При этом старый ELF-линкер пока сохраняется, поскольку новая реализация ещё не достигла полного функционального паритета. В следующем цикле разработчики рассчитывают окончательно перейти на новый вариант.

Build Server Protocol готовит Zig к более тесной интеграции с IDE

Build Server Protocol интересен шире самой команды zig build. Он создаёт единый канал, через который IDE и другие инструменты могут понимать структуру проекта без собственного разбора внутренних механизмов системы сборки.

Сейчас протокол позволяет получить статическую информацию о графе сборки, доступных шагах, параметрах и зависимостях. Клиенты получают события о запуске и завершении операций, включая сведения об ошибках и сгенерированных файлах.

В дальнейшем команда Zig планирует через этот же сервер передавать возможности compiler server protocol. В опубликованной дорожной карте упоминаются данные системы типов, рефакторинг и другие функции редактора. Такой подход особенно важен для ZLS: после архитектурных изменений 0.17.0 языковой сервер должен перейти на новый механизм взаимодействия с системой сборки.

Язык приблизился к стабилизации перед Zig 1.0

У Zig 0.17.0 есть менее заметная снаружи, но стратегически крупная часть — работа над окончательной формой языка. После версии 0.16.0 разработчики рассмотрели множество предложений: около 25 приняли, около 125 отклонили.

На момент подготовки release notes в Codeberg оставалось 23 нерешённых предложения по языку, ещё 61 находилось в старом GitHub-трекере. Стабилизация синтаксиса и семантики входит в перечень обязательных этапов перед выпуском Zig 1.0.

Команда заодно устранила давнюю проблему с формальным описанием грамматики. Файл grammar.peg исторически расходился с реальным рукописным парсером Zig. Теперь на его основе генерируется отдельный parser-oracle, а результаты сравниваются с std.zig.Ast.parse() через fuzz-тестирование. Это создаёт единый источник истины для будущих изменений грамматики и спецификации языка.

Релиз приносит и ряд несовместимых изменений. Из языка удалён уже устаревший @cImport, а std.Build.Step.TranslateC переводится в сторону официального внешнего пакета translate-c. Синтаксис умножения массивов через a ** b заменён на @splat, выражение void{} удалено, захват ошибки в errdefer больше не поддерживается. Одновременно появился builtin @divCeil для целочисленного деления с округлением к положительной бесконечности.

SafeAllocator усиливает поиск ошибок работы с памятью

В стандартной библиотеке Zig появился std.heap.SafeAllocator, который заменяет std.heap.DebugAllocator. Новый allocator потокобезопасен и ориентирован на выявление ошибок управления памятью.

Он сообщает об утечках при deinit, отслеживает несовпадения операций выделения и освобождения памяти, выявляет повторные освобождения и гонки при resize, remap и free. Метаданные каждой аллокации дополняются контрольной суммой и stack trace, что помогает обнаруживать повреждение памяти.

Разработчики добавили для allocator два fuzz-теста, включая многопоточный вариант. В опубликованном бенчмарке сборка тестов стандартной библиотеки с отладочным allocator сократилась с 29,4 до 22,1 секунды, а пиковое потребление памяти снизилось с 2,24 до 1,11 ГБ. Эти числа относятся к конкретному тестовому сценарию из release notes и показывают масштаб изменений именно в этой конфигурации.

Zig 0.17.0 обновил LLVM, libc и системные заголовки

В состав toolchain теперь входит LLVM 22.1.8. Вместе с ним обновились связанные компоненты, включая Clang, libc++, libc++abi, libunwind и libtsan.

Для кросс-компиляции Zig 0.17.0 добавляет glibc 2.44 и NetBSD libc 11.0. Поставляемая версия musl остаётся на 1.2.5, при этом в неё включены перенесённые исправления безопасности и переносимости. В toolchain появились заголовки Linux 7.2 и macOS 27.0.

У LLVM сохраняется один технический компромисс. Векторизация циклов остаётся отключённой из-за известной ошибки LLVM. Исправление уже попало в основную ветку LLVM, но отсутствует в LLVM 22; команда Zig рассчитывает вернуться к этой оптимизации после перехода на LLVM 23 в Zig 0.18.0.

Поддержка платформ расширилась до новых архитектур и систем

Zig 0.17.0 расширяет список проверяемых и экспериментальных целей. aarch64-openbsd теперь тестируется нативно в CI, а задания для aarch64-freebsd и aarch64-netbsd выполняются и для pull request.

Добавлена поддержка целей loongarch32-linux-gnu[sf], заметно улучшена работа с 64-битным SPARC, появились сведения о целях для Nintendo Switch, Game Boy Advance, PlayStation и Wii U. Ранний вариант xtensa-linux пока ограничен C backend и экспериментальным LLVM backend.

Отдельно развивается WebAssembly backend. В release notes указано прохождение полного набора сравниваемых behavior tests относительно LLVM backend, хотя в debug-режиме он пока не используется по умолчанию из-за отсутствия поддержки debug information.

Известные регрессии показывают статус Zig до версии 1.0

Команда Zig прямо перечисляет проблемы, которые уже известны в 0.17.0. Среди них сбой сборки compiler-rt для soft float на x86, проблема со std.debug.simple_panic, сложности с переопределением weak-символов Zig libc, поломка некоторых response-file сценариев в std.Build.Step.Run и регрессии SPIR-V backend.

Авторы release notes отдельно напоминают, что в ветке 0.17.x остаются известные bugs, miscompilations и regressions. Для крупных проектов работа с Zig всё ещё может пересекаться с самим процессом разработки компилятора. Более строгая политика качества для Tier 1 должна стать частью требований после достижения версии 1.0.

Zig 0.17.0 стал контрольной точкой в развитии проекта: система сборки получила новую архитектуру, инкрементальная компиляция стала доступнее для x86_64 Linux, а список нерешённых решений по дизайну языка продолжает сокращаться. До Zig 1.0 всё ещё остаются задачи вокруг ZLS, backends, линкеров, package management и стабилизации языка — именно они уже перечислены в официальной дорожной карте проекта.

Источники

При использовании материалов сайта необходимо указывать ссылку на TGLand.ru. Если вы копируете фрагменты текста в интернете, прямая гиперссылка, доступная для индексации поисковыми системами, должна быть размещена в начале материала.

Вам также может понравиться