Zig 0.16 переписывает контракт между кодом и вводом-выводом, ускоряет инкрементальную сборку за счёт смены модели зависимостей компилятора — и в очередной раз демонстрирует, что версия 1.0 для команды не цель квартала, а вопрос принципа.
Главное изменение релиза — std.Io как интерфейс, а не встроенный в язык примитив, подчеркивает xrust. Раньше в большинстве языков с async/await действует деление функций на «цветные»: обычная функция не может напрямую вызвать асинхронную, и наоборот, без обвязки. Zig решает это иначе: I/O передаётся как обычный параметр, наравне с аллокатором.
zig
pub fn main(init: std.process.Init) !void {
const gpa = init.gpa;
const io = init.io;
std.log.info("{d} env vars", .{init.environ_map.count()});
}
Это и есть «Juicy Main» — dependency injection для точки входа программы: один параметр process.Init даёт доступ к general-purpose аллокатору, реализации Io, карте переменных окружения и CLI-аргументам без ручной инициализации каждого куска рантайма отдельно.
Практическое следствие: один и тот же код с std.Io может исполняться и на потоковом бэкенде, и на событийном — io_uring на Linux, Grand Central Dispatch на macOS — без переписывания сигнатур функций. Выбор реализации остаётся на стороне вызывающего кода, а не диктуется языком через async/await как отдельную синтаксическую сущность.
В марте Мэттью Лагг влил правку на 30 000 строк, переработавшую внутренний граф зависимостей компилятора — из цикличной структуры в направленный ациклический граф (DAG). До этого граф допускал циклы, что усложняло анализ и тормозило инкрементальные пересборки. DAG даёт две вещи: компилятору проще определить, что действительно нужно пересчитать при правке файла, и при обнаружении циклической зависимости в пользовательском коде сообщение об ошибке становится читаемым, а не абстрактной трассировкой через десяток промежуточных узлов.
Отдельно упрощена работа с зависимостями пакетов — они переехали в локальную директорию проекта вместо глобального кеша, что снижает количество сюрпризов при разворачивании чужого проекта на новой машине.
Требование для post-1.0 релизов зафиксировано прямо в release notes: у Tier 1 платформ должно быть ноль отключённых тестов. Пока это не выполнено — и, соответственно, не выполнено условие для 1.0.
Позиция команды подробно разобрана в июньском материале JetBrains «Why Zig Isn't 1.0 (Yet)»: вопрос, который задают перед каждым потенциально необратимым решением — о чём команда пожалеет, если зафиксирует это в стандарте прямо сейчас. Эндрю Келли признаёт: ярлык 1.0 ускорил бы корпоративное усыновление языка, но сознательно не форсирует релиз. Zig существует на пожертвования через некоммерческий фонд, а не венчурные деньги — это даёт свободу, недоступную VC-backed конкурентам, которым нужно предъявлять инвесторам метрики роста здесь и сейчас.
Для практикующих разработчиков ключевой сигнал релиза — не conкретные фичи, а сам подход к async. Явный Io-параметр снимает классическую проблему функционального цвета, знакомую всем, кто писал на языках с обязательным async/await: невозможность красиво смешать синхронный и асинхронный код в одной кодовой базе. Решение Zig концептуально похоже на то, как язык уже поступил с управлением памятью — сделав аллокатор явным параметром вместо скрытого рантайма. Для системного программирования, embedded и высоконагруженных сервисов это осмысленный компромисс: чуть больше явного кода в сигнатурах в обмен на предсказуемость и отсутствие скрытых аллокаций.
Постоянный отказ от версии 1.0 при этом не мешает продакшн-использованию — сообщество на Хабре в отдельном хабе Zig регулярно обсуждает боевые кейсы, а собственный бэкенд компилятора (отказ от LLVM для части таргетов) снижает внешние зависимости языка. Rust шёл к 1.0 около девяти лет — на этом фоне текущий десятилетний путь Zig без релиза не выглядит аномалией, скорее продолжает традицию системных языков не спешить с фиксацией стандарта.
Пока Zig демонстративно тормозит, Mojo идёт в противоположном направлении: в начале мая вышла первая бета-версия Mojo 1.0, которую команда проекта оценивает как почти готовую к массовому использованию, а финальный стабильный релиз обещан уже этой осенью.
Источники: