← На главную

Roc переписал 300k строк Rust в Zig — компилятор вдвое легче, сборка 35 мс

16.07.2026 11:39 · hackernews

Команда компилятора Roc за полтора года переписала 300 000 строк Rust в Zig и достигла паритета по функциям. Чтобы это стало возможным, переписали почти весь компилятор: парсер, проверку типов, систему разрешения лямбда-сетов. Первым, кто запустили на новой версии, стала игра Rocci Bird — готовая сборка под WebAssembly весит 31 КБ, вдвое меньше, чем у старого компилятора.

Главная новая фишка Roc — горячая замена кода без перезапуска. Можно запустить веб-сервер, поменять код на ходу, и следующий запрос обработается уже новой версией. При этом Roc не интерпретируемый язык, а компилируемый с оптимизацией через LLVM. В новом компиляторе появилась интерполяция строк внутри pattern matching — она работает без единой аллокации в куче, с проверкой типов на этапе компиляции и нулевыми накладными расходами на память.

Почему ушли с Rust? Основные причины: долгая сборка (инкрементальная перекомпиляция занимала секунды, сейчас в Zig — 35 миллисекунд), неудобная работа с аренами и структурами массивов (в Rust экосистема завязана на глобальный аллокатор, а в Zig — на гранулярные), и, самое важное, особенности работы с небезопасным кодом. Компиляторы редко обходятся без unsafe — им нужно эмитировать машинные инструкции, парсить LLVM-биткод, манипулировать низкоуровневым представлением данных. В Roc было 1200 использований unsafe на 300 КБ кода. Rust-сообщество считает unsafe редким исключением и не даёт инструментов для его массового применения. Zig же предлагает ReleaseSafe — проверки use-after-free на этапе выполнения. Это не заменяет borrow checker, но для компилятора с ареновой моделью памяти оказалось практичнее.

Сравнение: за 18 месяцев в Rust-версии нашлось 21 баг с повреждением памяти (все — результат неверной генерации кода, не в самом компиляторе), в Zig — 10, из которых два use-after-free в самом компиляторе (оба проявлялись в виде битых имён файлов в сообщениях об ошибках). С точки зрения пользователя разница близка к нулю.

Инкрементальная сборка сейчас работает только на ночной версии Zig 0.17.0 из-за бага в стабильной 0.16.0. Когда исправление войдёт в релиз, пересборка после правки 450 тысяч строк будет занимать 35 миллисекунд на x86-64. Rust за то же время улучшил свои показатели с 10 до 3,4 секунды, но 35 мс — это принципиально другой уровень.

Ещё одна вещь, которую удалось взять из экосистемы Zig — рукописный сериализатор LLVM-биткода. Он позволяет не зависеть от ломающих изменений в API LLVM. В ближайших планах — выпустить Roc 0.1.0 до конца года.

Читать оригинал →