LINUX.ORG.RU

Bun завершил перенос с Zig на Rust, после чего разработчики проектов публично разругались

 , , ,


0

4

Команда Bun завершила перенос основной кодовой базы среды исполнения JavaScript и TypeScript с Zig на Rust. Изменения были влиты в main 14 мая 2026 года, а 8 июля руководитель проекта Джарред Самнер опубликовал отчёт о миграции. Последней стабильной версией на Zig пока остаётся Bun 1.3.14, тогда как Rust-реализация доступна в Bun 1.4 Canary. Порт уже используется в Claude Code начиная с версии 2.1.181 и в публичной бете Prisma Compute.

Перенос затронул 535 496 строк Zig-кода и занял 11 дней. Самнер задействовал около 50 автоматизированных процессов Claude Code, одновременно запускавших до 64 экземпляров Claude. Итоговый diff добавил более миллиона строк и включил 6502 коммита без учёта слияний. По оценке автора, запросы обошлись бы примерно в 165 тысяч долларов по тарифам API; вручную работа потребовала бы трёх разработчиков и около года.

Один ИИ-агент создавал код, два других искали ошибки, ещё один применял исправления. Перед слиянием прежний набор тестов полностью прошёл на шести платформах, причём тесты не удалялись и не пропускались. После переноса команда провела 11 циклов проверки безопасности и запустила непрерывный фаззинг парсеров.

Причиной миграции разработчики называют не недостатки Zig как такового, а устройство Bun. Среда объединяет JavaScriptCore со сборкой мусора и нативный код с ручным управлением памятью, что приводило к утечкам, use-after-free и double-free. Rust позволяет обнаруживать часть таких ошибок раньше и освобождать ресурсы через Drop. По данным команды, Bun 1.4 исправляет 128 ошибок из 1.3.14, уменьшает бинарник примерно на 20% в Linux и Windows и в отдельных тестах работает на 2–5% быстрее.

Порт пока далёк от идиоматического Rust: около 4% кода находится внутри unsafe — примерно 27 тысяч строк и 13 тысяч употреблений ключевого слова. Кроме того, были обнаружены 19 известных регрессий, которые, по утверждению разработчиков, уже исправлены.

На следующий день основатель Zig Эндрю Келли опубликовал резкий ответ. По его мнению, проблемы Bun возникли не из-за модели памяти Zig, а из-за инженерной культуры проекта: слишком быстрого добавления функций, накопления технического долга и злоупотребления comptime и assert. Келли утверждает, что Zig Software Foundation неоднократно пыталась обратить внимание команды Bun на качество кода.

Келли поставил под сомнение и проверку миллиона строк автоматически созданного кода. Если прежний набор тестов пропускал ошибки Zig-версии, считает он, то этот же набор не доказывает отсутствие ошибок в Rust-порте. Команда Bun указывает на проверку несколькими ИИ-агентами, тестирование, фаззинг и частичное ручное чтение. Традиционного построчного рецензирования людьми не было, но и полностью непроверенным перенос назвать нельзя.

Другие претензии касаются результатов. Келли отметил, что прирост скорости связывается с межъязыковой LTO, хотя Zig тоже поддерживает LTO. Сокращение бинарника частично обеспечили оптимизация ICU и настройки линковки, а сравнение времени компиляции в отчёте отсутствует. Он также увидел противоречие между рассказом о фаззинге и прежними разговорами, в которых команда Bun якобы сообщала, что фаззинг не используется.

Технический спор быстро перешёл в конфликт между проектами. По словам Келли, компания Oven перечисляла Zig Software Foundation около 60 тысяч долларов в год, но после покупки Bun компанией Anthropic выплаты прекратились, а представители Bun не пришли на регулярную встречу. Он также раскритиковал управленческий стиль Самнера, ссылаясь на рассказы бывших работников и соискателей. Независимых подтверждений этим обвинениям опубликовано не было.

Позднее Келли изменил заключение статьи и признал, что накопившаяся обида сделала текст похожим на личную атаку. Таким образом, перенос Bun на Rust технически завершён и уже применяется, хотя стабильный выпуск Bun 1.4 ещё впереди. Сам конфликт оказался не столько спором Zig против Rust, сколько столкновением взглядов на темп разработки, роль ИИ и способы обеспечения качества открытого проекта.

Bun – это среда выполнения ECMAScript / JavaScript, по многим параметрам аналогичная nodejs. Bun старается быть максимально совместимым с nodejs по опциям командной строки, поддерживает модули ECMAScript (ESM) и CommonJS. Управление пакетами npm и поддержка typescript встроены прямо в приложение как нативный код, и программы на typescript могут исполняться напрямую интерпретатором без предварительной конфигурации.

>>> Подробности

★★★★★

Проверено: hobbit ()
Последнее исправление: hobbit (всего исправлений: 4)
Ответ на: комментарий от LightDiver

когда видишь 380 строк так, где хватает 20 - я тут уже начинаю материться и пишу вручную.

Всего-то надо попросить убрать лишние проверки или писать в парадигме let it crash

goingUp ★★★★★
()
Последнее исправление: goingUp (всего исправлений: 1)
Ответ на: комментарий от goingUp

Ага.. я много раз просил. В итоге получается еще больше кода! Я тут первую версию паучка чисто нагенерил на 3200 строк. Понял, что это херня. Попросил сократить. Оптимизировал, переписывали часа 2. Получилось 4800 строк…

Плюнул, переделал архитектуру вручную, прошу только отдельне функции доделать.

LightDiver ★★★★★
()

А я правильно понимаю, что разработчики между тем линяют с bun на node? Или я плохо осведомлен?

den73 ★★★★★
()
Ответ на: комментарий от den73

Gemini:

Переписанная на Rust версия (ожидаемая как Bun 1.4) на данный момент является экспериментальной и полноценно поддерживает только Linux x64. В стабильных релизах Bun все еще работает старый код на Zig, поэтому технического повода для паники или миграции у разработчиков нет.

Пока сидим на стабильной дальше посмотрим. Вариант по сути на форки, если взлетят, ну либо на node да.

necromant ★★★
()
Ответ на: комментарий от den73

А зачем вообще этот bun был изначально нужен, чем node не угодил?

На момент принятия решения была лучшая производительность и «всё в одном» (меньше сторонних утилит и зависимостей), ну и нативная поддержка TypeScript-а. Плюс перспективный Zig - язык выглядит адекватным развитием низкоуровневых языков.

Опять же это новые проекты, которые с нуля. Для старых следовали принципу: работает - не трожь.

necromant ★★★
()
Ответ на: комментарий от LightDiver

В среднем код на раст должен быть процентов на 10-15 больше из за особенностей, но не в два же раза.

Откуда такая информация, я вот глянул на раст «из далека» в свое время и понял, что если, например, с Си переписывать что-то на него, то как раз где-то в 2 раза разница и получится, т.к. там много конструкций, которые больше для «защиты от дурака» и для «чтоб удобнее читать было несведущему» + еще по-мелочи… Короче, это ж язык для Пейсателей выходит, вон ЫЫ-шке такое бы подошло, чтоб перманентно УБ не получить, или «начинающему пейсателю», да и можно всегда «большим количеством строк» отчитаться, а не выдумывать оптимальные читабельные и краткие…

Вон Торвальдс недавно код драйвера отлаживал под свою интелловскую карту при помощи ЫЫ, так это чудо ему всю дорогу утверждало, что задача не решаема и надо все переделывать, а в итоге все пофиксилось корректировкой одной строчки с округлением. А представь, что было бы, если б он ЫЫ попросил драйвер на расте переписать - можно было б тогда интелловские карты закапывать окончательно, т.к. у них и так со стороны софта проблемы одна за другой…

Sm0ke85
()
Ответ на: комментарий от Sm0ke85

если, например, с Си переписывать что-то на него, то как раз где-то в 2 раза разница и получится, т.к. там много конструкций, которые больше для «защиты от дурака»

Нет так никаких лишних структур. Если нормально писать на си, тебе придется все то же предусмотреть все варианты закрыть. Иначе будет бо бо. Просто в раст нельзя на это забить.

а в итоге все пофиксилось корректировкой одной строчки с округлением

Мне как то подсунули модуль для регулировки громкости звука от чатгпт5. С первого взгляда красивый код, убедительный и даже все работало кажись. А потом я две недели искал в другом месте где же у меня все сломалось. Переписывал, переделывал. Читал построчно. Оказалось, как раз проблема в одной строке. Эта падла всегда дает убедительный код, который всегда все ломает. Это нормально. И главное так хитро делает, что хрен ты поймешь что не так.

LightDiver ★★★★★
()
Ответ на: комментарий от LightDiver

Нет так никаких лишних структур. Если нормально писать на си, тебе придется все то же предусмотреть все варианты закрыть. Иначе будет бо бо. Просто в раст нельзя на это забить.

Я в основном про то, что раст все таки предполагает отсутствие блоков unsafe (на мой взгляд) и безопасную работу с указателями, в Си же я просто передал указатель и размер данных (правда порой приходится еще компилятору рассказывать как паковать эту дату, но это минорная история) - это сильно увеличивает код раста, особенно может быть неприятно, если вдруг все таки заезжают в код какие-то ненужные логически проверки (избыточные), но тут я возможно голословно фантазирую и великий раст это дело регулирует вполне здраво… Все таки очень напрягает, когда компилятор пытается быть умнее программиста…

Sm0ke85
()
Ответ на: комментарий от Sm0ke85

Все таки очень напрягает, когда компилятор пытается быть умнее программиста…

Он не умнее. Он предусмотрительнее. Он просто все заранее проверит и подскажет, если ты где что упустил.

А умничают они все на самом деле. Бывает даже излишне. Но это уже вообще о другом.

LightDiver ★★★★★
()
Ответ на: комментарий от LightDiver

Тут в 2017м уже были треды про «предусмотрительные компиляторы». Которые оптимизируют UB так что программа нафиг ломается в непредсказуемый момент. И рукожопые головожопы прямо тут рассказывали что «ты не понимаешь», «компилятору виднее», и т.д. А то что

int x=...
y = arr[x & 8191]; //массив размером 8192

ломается потому что x & 8191 внезапно оказалось меньше нуля, их вообще не волнует. «мы оптимизировали кококо это UB». Рукожопых не волнует что компилятор «дооптимизировался» до невозможных значений. А потом этим же самым рукожопым головожопам С++ в штаны срет и «дайте нам раст» потому он безопасный. Буквально же одни и те же придурки за UB и за раст топили.

ckotctvo
()
Ответ на: комментарий от ckotctvo

Совсем недавно мы тут ассемблернй код смотрели. Я ради интереса написал его на раст и тот порвал ассемблер, как тузик грелку.

Дизассемблировал код, а оказалось раст в принципе решил ничего не вычислять. Он весь цикл развернул и сразу в конце выводил нужные результаты. Без цикла, без проверок. Такой вот молодец. Формально программа работала штатно и за 0мс отрабатывала.

LightDiver ★★★★★
()
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от LightDiver

Ну работает cse. Я про техноеретиков которые 10 лет назад шатали компиляторы а теперь шатают ии и раст.

ckotctvo
()
Ответ на: комментарий от Sm0ke85

Все таки очень напрягает, когда компилятор пытается быть умнее программиста…

У раста компилятор тупой, как пробка.

bbc69
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.