Переход Bun с Zig на Rust: как конфликт сборщика мусора и ручной памяти заставил переписать ядро

Инструмент для JavaScript-экосистемы Bun меняет базовый язык с Zig на Rust. Проект с 22 млн ежемесячных загрузок вырос из простого транспайлера в бандлер, пакетный менеджер и полноценный рантайм. Команда признала, что масштабировать такую кодовую базу на Zig стало невыполнимой задачей. Часть рутинного переписывания кода доверили предрелизной модели Claude Fable 5 — авторы проекта с конца 2025 года работают в Anthropic.
Главная техническая проблема — стык двух парадигм работы с памятью. Движок JavaScriptCore полагается на сборщик мусора (GC), тогда как Zig требует ручного управления через defer. Смешивание этих подходов спровоцировало десятки критических уязвимостей. Только в патче 1.3.14 команде пришлось закрывать серию use-after-free и double-free крашей в модулях node:zlib и node:http2. Жизненный цикл объектов терялся при передаче указателей между GC и ручной памятью.
Практики вроде постоянного фаззинга через Fuzzilli и прогона тестов с Address Sanitizer перестали справляться. Вместо внедрения жестких стайлгайдов для ручного подсчета ссылок команда выбрала архитектурное решение. Rust закрывает этот класс уязвимостей на этапе компиляции благодаря системе владения и неявному вызову Drop для автоматической очистки ресурсов. Для рантайма со сложной логикой управления памятью строгий компилятор оказался надежнее ручного контроля.
Поделиться:
Ещё из архива
Все публикации
Интервью с Владимиром Аюевым: графический язык бигтеха, студия SASHA и дизайн-образование
1 месяц назад
Jockey от TwelveLabs: ИИ-агент для семантического поиска по видеоархивам и извлечения метаданных
1 месяц назад
Архитектура винной этикетки: баланс наборного шрифта и каллиграфии в кейсе Winecraft
1 месяц назад
Оптимизация контекста в Claude Code: как работает кэширование промптов и за что мы платим
1 месяц назад
Архитектура памяти для LLM-агентов: от базового SQLite до Graph RAG
1 месяц назад