Zig выкинул менеджер пакетов из компилятора
Знаете, что бесит в большинстве компиляторов? Они пытаются быть всем сразу — и парсить код, и оптимизировать, и даже тянуть зависимости из интернета. Zig шёл этим путём, пока Эндрю Келли не решил, что хватит.
30 июня 2026 года он сделал вещь, которая на первый взгляд кажется странной: вынес всю логику управления пакетами из компилятора в систему сборки. Теперь zig build, zig fetch, zig init и zig libc — это не часть компилятора, а часть процесса maker.
Что изменилось и почему это важно
Раньше архитектура выглядела так:
БЫЛО: До разделения процессов
───────────────────────────────────────────────────
zig build
└── builder
├── загрузка пакетов
├── логика build.zig
└── система сборки
⚠️ Любое изменение build.zig → полный рестарт
Это создавало проблему: когда пользователь менял build.zig, приходилось перезапускать весь процесс, включая управление зависимостями. Неэффективно и неудобно.
Теперь процесс разделён на два отдельных:
СТАЛО: После разделения
───────────────────────────────────────────────────
zig build (компилятор)
└── maker (сборка + пакеты) ← живёт постоянно
└── configurer (build.zig) ← перезапускается при
изменении
✅ Изменился build.zig → перезапустился только
configurer, maker продолжает работу
Поменялся build.zig? Перезапустится только configurer, а maker продолжит работу. Для режима --watch это особенно важно: не надо переподключаться к серверу и заново выкачивать пакеты.
Что конкретно уехало из компилятора
Вот что теперь поставляется в исходниках, а не внутри бинарника:
- Логика загрузки пакетов
- HTTP-клиент и сетевая часть
- TLS и криптография
- Git-протокол
- Парсинг архивов: xz, gzip, zstd, flate, zip
- Работа с
build.zig.zonфайлами
Это означает две вещи. Во-первых, можно патчить уязвимости без пересборки компилятора. Во-вторых, код работает в режиме ReleaseSafe, то есть с проверками безопасности вместо голой оптимизации.
Практические последствия для разработчиков
Размер бинарника уменьшился на 4% — с 14.1 до 13.5 MiB. Не космос, но приятно. Флаг --maker-opt заменили на переменную окружения ZIG_DEBUG_MAKER, --zig-lib-dir — на ZIG_LIB_DIR. Это небольшие, но ломающие изменения, о которых стоит помнить, если у вас есть скрипты.
Главное же — это шаг к build server protocol, который должен упростить работу ZLS. До этого IDE-клиент должен был переподключаться при каждом изменении build.zig. Теперь сервер сможет сообщать клиенту об изменениях конфигурации без разрыва соединения.
Ещё один эффект — возможность оптимизировать криптографию под конкретный CPU. Редкие инструкции, которые нельзя использовать при дистрибуции, теперь можно задействовать при локальной сборке. Автор называет это «AOT cake and eat JIT too» — и смысл тут простой: и скорость дистрибуции, и локальная оптимизация.
Что дальше
Фича почти готова, но до тега 0.17.0 осталось три вещи:
- Build server protocol MVP
- Поддержка path dependencies для скрипта сборки
- Исправление для
zig build --watch, чтобы он детектил измененияbuild.zig
Эндрю обещает закончить к августу, но признаёт, что июльские конференции могут помешать. Он также просит помощи сообщества — и это вполне нормальная практика для open source.
Выводы
Zig упростил архитектуру: компилятор стал меньше, а система сборки — умнее. Это снижает связность, облегчает обновления и делает watch-режим заметно удобнее.
Итог простой: меньше кода внутри бинарника, больше гибкости снаружи, и хороший фундамент для следующего поколения инструментов вокруг Zig.
Ссылки
- Оригинальная запись в Zig Devlog — Andrew Kelley
- Репозиторий Zig — исходный код компилятора и системы сборки
- ZLS — Language Server для Zig — сервер языка для редакторов кода
Дмитрий Полухин — продуктовый дизайнер. Пишу про разработку, AI и дизайн интерфейсов. Обо мне, контакты и профили.