Джарред Самнер использовал Claude Fable 5 и 64 оркестрированных AI-агента, чтобы переписать Bun с Zig на Rust — 6502 коммита, 128 исправленных багов и бинарник на 20% меньше. Вот как это произошло.
14 мая 2026 года Джарред Самнер объединил пул-реквест, который фундаментально изменил ландшафт JavaScript-рантаймов: Bun был переписан с Zig на Rust. Порт, завершённый за 11 дней, использовал предрелизную версию Claude Fable 5 (Mythos-модель Anthropic) с 64 AI-агентами, работавшими параллельно в 4 рабочих директориях.
Результат: 6502 коммита, 0 пропущенных или удалённых тестов, 128 исправленных багов, бинарник на 20% меньше, производительность на 2-5% выше и значительно сниженное потребление памяти. Bun v1.3.14 стал последней версией на Zig; v1.4.0 — первый релиз на Rust, доступный в canary прямо сейчас.
Bun начинался как построчный порт транспилятора esbuild с Go на Zig. Джарред Самнер
написал свою первую строку на Zig 16 апреля 2021, вдохновившись одностраничной
документацией языка и его контролем над производительностью. Без Zig Bun никогда не
был бы создан — простота языка и comptime позволили одному разработчику
за год создать массивный рантайм до эры LLM.
Масштаб Bun был огромен с самого старта: транспилятор JavaScript, TypeScript и CSS; минификатор и бандлер; npm-совместимый пакетный менеджер; тест-раннер как Jest; Node.js-совместимое разрешение модулей; HTTP/1.1 и WebSocket клиент; десятки реализаций Node.js API. Сегодня CLI Bun получает более 22 млн загрузок в месяц, а Claude Code и OpenCode используют его как рантайм.
Проблемы стабильности Bun коренились в фундаментальном противоречии: JavaScript управляется сборщиком мусора, а Zig (как C) не управляет памятью автоматически. Смешение этих двух парадигм в одном проекте настолько редкое явление, что ни один язык не проектируется для него. Результатом стал постоянный поток багов памяти, которые не могли полностью предотвратить никакие инструменты.
Вот лишь несколько примеров багов, исправленных в Bun v1.3.14:
node:zlib при вызове .reset() во время асинхронной .write()node:http2 при реентерабельных JS-колбэках, вызывающих перехеширование хеш-таблицUDPSocket.send(), где колбэки valueOf() отключали ArrayBuffer во время отправкиtlsSocket.setSession() — каждый вызов терял одну SSL_SESSION (~6.5 KB)background-clipMessageEvent с torn-вариантами при конкурентном доступеfs.watch() — вотчеры не удалялись после .close()UDPSocket.sendMany() при изменении состояния соединенияКоманда уже делала больше, чем многие проекты: патчила Zig для поддержки Address Sanitizer, выпускала ReleaseSafe-сборки на Windows, круглосуточно фаззила Fuzzilli и проводила всесторонние тесты утечек памяти. Но, как сказал Джарред: «Я устал ложиться спать и беспокоиться о крашах Bun».
Решение портировать на Rust — а не на C++ (который уже составлял 20% кодовой базы Bun) — сводилось к одному: гарантии на этапе компиляции вместо руководств по стилю.
В Zig очистка ресурсов полагается на defer и errdefer в каждом
месте вызова. В Rust трейт Drop выполняется автоматически при выходе значения
из области видимости. Разница фундаментальна: Zig требует помнить о добавлении
кода очистки; Rust гарантирует его выполнение каждый раз. Для кодовой базы,
смешивающей GC-управляемую и ручную память, такая систематическая гарантия устраняет
целые категории багов.
| Язык | Механизм очистки | Контроль | Влияние на стабильность |
|---|---|---|---|
| Zig | defer, errdefer |
Вручную на каждом вызове | Легко забыть или выполнить дважды |
| C++ | ~Destructor, &&Move | Автоматически через RAII | Лучше, но всё ещё есть пробелы |
| Rust | Drop |
Гарантируется компилятором | Use-after-free и double-free — ошибки компиляции |
Кроме Drop, Rust даёт команде Bun: борроу-чекер
(безопасность памяти на этапе компиляции), Miri (экспериментальный
интерпретатор для обнаружения неопределённого поведения) и LeakSanitizer
(отслеживание всех аллокаций нативного кода). Эти инструменты работают в CI и ловят
проблемы до того, как они попадут в продакшен.
Изначально Джарред планировал добавить вдохновлённые Rust умные указатели в Zig-код Bun. Но после размышлений об эргономике он решил потратить неделю на тестирование возможности переписать Bun на Rust через новую модель Anthropic. Через несколько дней значительная часть тестов начала проходить, и мнение сменилось с «стоит попробовать» на «я это объединю».
Перед написанием кода Джарред потратил около 3 часов на обсуждение с Claude того,
как отображать Zig-паттерны на Rust. Результат был сериализован в PORTING.md,
который позже попал на Hacker News. Затем динамический воркфлоу проанализировал каждое
поле каждой структуры во всей кодовой базе, отследил поток управления, предложил
времени жизни и отправил каждое предложение на проверку 2 состязательным ревьюерам.
Результат: LIFETIMES.tsv — структурированная спецификация времён жизни
для всей кодовой базы.
Ключевая идея порта — представление инженерной работы как цикла:
Около 50 динамических воркфлоу работали непрерывно в течение 11 дней. Каждый воркфлоу
был циклом для конкретной цели: генерация руководства по портированию, механический
перевод .zig в .rs, исправление ошибок компилятора, запуск
подкоманд, прохождение тестов. Джарред мониторил воркфлоу — читал выводы, проверял
наличие проблем и редактировал циклы, когда что-то шло не так.
Самая инновационная часть подхода — паттерн состязательного ревью с раздельными окнами. Для каждой задачи портирования:
Разделение предотвращает предвзятость подтверждения, возникающую, когда один и тот же агент пишет и ревьюит код. Ревьюеры ловили реальные баги, которые компилировались чисто и выглядели корректно:
Box<uv::Pipe> удалялся в конце ветки match, но uv_close асинхронен. Исправление: Box::leak(pipe).t.trunc() на отрицательных временах создавал отрицательные наносекунды. Исправление: t.floor().unwrap_or(eager_expr) вызывал панику даже когда значение было Some. Исправление: unwrap_or_else.
На пике перезапись использовала 16 Claude на воркфлоу, в 4 отдельных git worktree —
всего 64. Первая попытка провалилась, потому что Claude мешали друг другу командами
git stash и git reset. Джарред добавил правило: никаких
git-команд, кроме фиксации конкретного файла за раз. Никакого cargo. Никаких медленных
команд.
На пике пропускной способности Claude писал около 1300 строк кода в минуту. Каждая строка проверялась двумя состязательными ревьюерами перед коммитом. Самый активный час: 695 коммитов.
После написания всего кода следующей задачей было исправление ~16 000 ошибок
компиляции. Подход был элегантно прост: каждая ошибка компилятора — задача в очереди
работ. cargo check записывал ошибки в файл, сгруппированные по крейтам.
64 Claude распределяли их между 4 worktree.
Самыми сложными были циклические зависимости. Zig-кодовая база была одной единицей компиляции (фактически одним крейтом), но Rust нужно было ~100 крейтов для быстрой компиляции. Воркфлоу классифицировал, куда должен идти код с циклическими зависимостями, а затем другой воркфлоу выполнял рефакторинг. Это выявило ~16 000 ошибок — огромное число для одного человека, но не проблема для 64 Claude.
Несколько ложных стартов потребовали корректировки промптов:
grep заморозила чтение с диска на минуты. Исправление: увеличение лимита IOPS.systemd-run (cgroups) для изоляции.
Bun v1.4.0 исправляет 128 багов, воспроизводимых в v1.3.14 — от утечек памяти и крашей
до некорректного цвета текста. Самое значительное — утечка памяти в Bun.build():
| Сборок | Bun v1.3.14 (Zig) | Bun v1.4.0 (Rust) |
|---|---|---|
| 500 | 1 914 MB | 526 MB |
| 1 000 | 3 506 MB | 586 MB |
| 1 500 | 5 097 MB | 608 MB |
| 2 000 | 6 745 MB | 609 MB |
В v1.3.14 каждая Bun.build() теряет ~3 MB — dev-серверы, собирающие проект
на каждый запрос, со временем исчерпывают память. В v1.4.0 память стабилизируется на
~600 MB. Предыдущая попытка исправить это в Zig не была объединена — отсутствие
аналога Drop делало это слишком рискованным.
Порт на Rust в сочетании с изменениями ICU и Identical Code Folding уменьшил бинарник Bun примерно на 20%:
| Платформа | Bun v1.3.14 (Zig) | Bun v1.4.0 (Rust) | Уменьшение |
|---|---|---|---|
| Linux | 88 MB | 70 MB | ~20% |
| Windows | 94 MB | 76 MB | ~19% |
Rust поддерживает кросс-языковую LTO между C/C++ и Rust, что позволяет встраивать код между языками — возможность, которой не было в Zig.
| Бенчмарк | Bun v1.3.14 | Bun v1.4.0 | Δ |
|---|---|---|---|
| Bun.serve (HTTP) | 169.6k req/s | 177.7k req/s | +4.8% |
| node:http | 103.8k req/s | 108.5k req/s | +4.5% |
| next build | 13.62 с | 13.03 с | +4.5% |
| vite build | 1.69 с | 1.65 с | +2.2% |
| tsc -b --force | 0.94 с | 0.89 с | +4.7% |
Порт Bun на Rust — landmark в AI-ассистированной разработке ПО. Цифры говорят сами за себя:
Реалистичная альтернатива была — ничего не делать, продолжать чинить баги вечно. Вместо этого Bun выходит с кодовой базой, имеющей систематически лучшие гарантии стабильности. Как сказал Джарред: «Один инженер может сделать гораздо больше сегодня, чем год назад».
Это тот же паттерн, который мы видели с портом React Compiler на Rust, где AI сгенерировал большинство из 435 коммитов для перевода TypeScript-компилятора на Rust. Разница в масштабе: порт Bun использовал 64 конкурентных агента с состязательным ревью, тогда как порт React Compiler — более обычный AI-ассистированный воркфлоу. Оба демонстрируют, что AI-ассистированное портирование кода жизнеспособно для ключевой инфраструктуры.
Похожие темы AI-генерированного кода в масштабе я разбираю в статье о запрете Fable 5 в open-source.
Экосистема JavaScript развивается быстрее, чем когда-либо — от AI-ассистированных переписей ключевых рантаймов до расширяющегося инструментария на Rust. Навигация по этим изменениям требует разработчика, который отслеживает экосистему и понимает, как выбирать правильные инструменты для вашего проекта.
Я — full-stack веб-разработчик с 20+ годами опыта создания production-приложений. Оцениваете ли вы Bun для своего проекта, мигрируете существующую кодовую базу или нуждаетесь в консультации по современной JavaScript- экосистеме — я готов помочь. Свяжитесь со мной для бесплатной первичной консультации.
Я также пишу детальные технические статьи об инструментах и фреймворках, которые имеют значение — следите за моими статьями.
Нужен веб-разработчик, который разбирается в современной экосистеме? Расскажите о проекте — я дам честную рекомендацию и предварительную оценку. Бесплатно.