Назад
Переписування компілятора Roc з Rust на Zig досягло паритету за 487 днів
SiTech AI Team3 წთ. საკითხავი

Переписування компілятора Roc з Rust на Zig досягло паритету за 487 днів

Команда мови програмування Roc переписала компілятор на 300 000 рядків із Rust на Zig і досягла функціонального паритету з оригіналом за 487 днів. У статті порівнюють час збірки, безпеку пам'яті та екосистему.

Команда мови програмування Roc за півтора року переписала близько 300 000 рядків коду з Rust на Zig і тепер досягла функціонального паритету з початковим компілятором. Це не офіційний реліз — версію 0.1.0, перший нумерований випуск Roc, планують на кінець року — але новий компілятор уже здатен збирати й запускати справжні програми.

Одним із перших тестів стала Rocci Bird — гра для WASM-4, написана менш ніж у тисячу рядків Roc. З новим компілятором roc build --opt=size створює 31-кілобайтний бінарник WebAssembly, тобто менш ніж половину того, що видавав попередній компілятор. Щоб гра взагалі запустилася, довелося завершити чимало функцій компілятора.

Переписування за 487 днів

Переписування тривало 487 днів, тоді як портування Bun у зворотному напрямку — близько 500 000 рядків Zig на Rust — зайняло 11 днів. Автор називає таке порівняння оманливим: у Bun це був прямий порт, а Roc обрав переписування з нуля саме тому, що більша частина компілятора мала змінитися. Рішення виникло через архітектурну проблему в системі спеціалізації lambda set у Roc, яка охоплювала кілька фаз компілятора.

Чому Zig і що сталося з безпекою пам'яті

Вибір визначили чотири міркування: час збірки, контроль над пам'яттю — Roc використовує арени та структуру масивів, тоді як екосистема Zig передає алокатори, а не покладається на один глобальний — відповідність екосистеми та допомога з кодом, небезпечним для пам'яті. У компіляторі на Rust було близько 1 200 використань unsafe на 300 000 рядків, і команда очікувала й надалі писати такий код.

На практиці перехід не зашкодив. Звіти про помилки, класифіковані Claude Opus 4.8, показують 2 596 помилок у компіляторі на Rust, 21 з них пов'язана з пошкодженням пам'яті, проти 431 у компіляторі на Zig, де таких 10. Вісім із десяти були помилками компіляції; решта дві — use-after-free у звітуванні про помилки, через які імена файлів відображалися символами заміни в roc check і roc bundle.

Час збірки та що далі

На настільному комп'ютері Intel з Ubuntu 26 компілятор на Rust обсягом 354 тисячі рядків витрачав 25,4 секунди на холодну збірку та 3,4 секунди на інкрементальну. Переписаний на Zig варіант на 464 тисячі рядків витрачає 32,1 секунди на холодну та близько 35 мілісекунд на інкрементальну — але лише на Zig 0.17.0, бо помилка в стабільній версії 0.16.0 ламає інкрементальні збірки на цій кодовій базі. Замість залежності від nightly-компілятора команда чекає на наступний стабільний випуск.

Компілятор також кешує роботу на диску за допомогою десеріалізації без парсингу: його структури даних — це масиви 32-бітних індексів замість вказівників, тож кешовані результати завантажуються в пам'ять без розбору. Два запуски roc check поспіль використовують результати попереднього запуску приблизно зі швидкістю memcpy.

SSiTech

SiTech — веброзробка з підтримкою AI

Створюємо швидкі та сучасні сайти й інтегруємо AI у бізнес-процеси. Маєте проєкт чи запитання? Із задоволенням допоможемо.