Урокі з перакладу Bun на базе AI: практычная робота — це перакранчэнне
Как рух Бана пад дапамогай агента з Zig у Rust дае магчымасць зрозумець, як тэстовыя комплекты можаць выступаць як кантракты, якія служыяй падказкамі для пераносу коду, проблемы небезпечнага коду, і чаму сэртыфікацыя зараз обмежвае можлівасці кодавання ай-інтэлектам.
Крыніцы: Bun Rewrote Its Runtime in Rust With AI. The Real Story Is Bigger Than the Code
Большасць інжынерных каманд стараюцца ухілівацца ад перапісву мовы ў велікіх працуючых системах на якомога дальшы час. Bun, рантайм і набір з’ядра для JavaScript і TypeScript, як паведамляецца, перанесаў свою рэалізацыю з Zig на Rust, пры чым большую частку перакладу выканалі агенты для кодавання на базе AI, і цыфры ў статтях пра гэта прываблівыя. Аднак болей значным ў ціх статтях не яўляецца колькісна велічына коду, які створылі агенты, а тое, як процес, які іх абслужвае, вяршыў выбор, кой код можна ўважаць надзеяным. У цій статты разбіраецца гэты процес і практыкуець яго ў формате методаў, якія можна застосаваць у сопрацоўчыных з AI процесах перапісву і міграцый.
Чаму зазвычай ухіляюцца ад перапісву
Перапісваўванне мовы супакоўвае звычны список рызыкаў. Яно можа прывести да тонкіх регрэсій, якія ніхто не зазначае прыблізна месцы, спрычыніць змяну выконвальных характэрыстыкаў у неспадзяваных напрамках, зламаць платформу, якой выкарыстоўваецца толькі калькі корыстувачаў, а таксама зайняць большую частку можлівасцяў каманды. У найгоршым случае каманда вынужана падтрымваць старую і новую реалізацыю паралельна, платячы два разы за кожны вылечэння бага.
Саме таму міграцыя на Bun прывертае увагу. На момент напісання даных проектны репазітарый апісвае Bun як JavaScript-рантайм на базе Rust, створаны на JavaScriptCore, а компанія Anthropic анунцавала пра прабуття ў власнасць Bun у грудзені 2025 года. У публічных звястках паведамляецца, што пераклад складае або-ма 535 000 ліній коду на мове Zig, які былі перакладзены за апошнія 11 дня, пры чым агенты виконваюць большую частку роботы з реалізацыі в межах частка адгукаванага процесу.
Існуе прагненне спрыяць гэтам як да ўжо аднаму з такіх загалоў «AI напісала велічзю коду». Але кращы вопыт — іншы: чы можа AI-сістэма здзейсніць вельмі большыя змены, калі людзі ствараюць надзеяны механізм для пераканання, чы рэзультат правільны? Гэты вопыт мае набагато большое значэнне для таго, як будуецца ствараць програмнае забезпечэнне прыбліжна ў наступныя калькі гадоў.
Пераклад, а не перадзял
Bun спачатку быў напісан прыголасна на мове Zig — сістэмнай мове, якая ценіцца за можласць низкага рэгулювання і прыказуемую продуктыўнасць. Міграцыя не была розглядвана як чыстая перачатка. Їе мета была навмесна вузкая: захаваць існуючую архітектуру і спостатэльнае паведанне, а зменіць толькі мову, на якой напісана рэалізацыя.
Гэты падход ёсць ключовым рашэннем у дизайне. Канвенцыйны падход перапісу прывабляе інжынераў да таго, каб яны перадзеяла дызайн на ходу: змінялі структуры дадзеных, пераранжавалі модулі, дадаўалі абстракцыі і налаштоввалі API. Кожны з гэтых выбораў ёсць новым джерелам рызыку і новай рэчы, якую трэба пераглядаць. Выключыўшы большасць з іх, каманда Bun ператворыла адкрытыя творчыя заведаменні на механічныя з ясным пунктом аднароджэння — чынным рэалізаваннем і тестамі, якія яго описваюць.
Колькасць лінакоў здаецца сложным аспектам, але гэта не так. Стварыць синтаксічна правільны код на Rust ў порэванні з іншымі мовамі ёсць стомкай задачай. Але сама сложнасць крыўцяецца ў тым, каб гарантаваць, што код на Rust будзе працаваць абоўсюды так сама, як і код на Zig, які ён заменяе.
Набор тэстаў як дакумент прыемнасі працы
Уявіце агента, якій даюць толькі інструкцыю «перапісаць гэты код у Rust». Што такая інструкцыя залишае без адказу — калі можна зменіць якія-небудзь часты, а калі ўсе павінна застацца такімі ж? Калі допускаюцься якіясь скорысты, а калі ні? Калі саме параметры працы памяці маюць значэнне? І, галоўнае — як можна будзе з’ясавіць, чы рэзультат правільны?
Bun вялікі час мела адказ на пасляпэўную запытанне: большую, вырастаючую сэтку тэстоў. Калі тэсты стаюць часткай кантракту, агент больш не стварае імплементацыю сам — ён проста відтварае поведзенне, якое ўжо зафіксаванае у виконвальнай форме, і кожны файл, які ён стварае, або падтрымлівае гэты кантракт, або ні.
Што можу і не могу обяцваць тэсты
Набор тэстаў не ўтварае доказа правільнасці. Ён толькі пераканальваецца ў тым, што было запланавана адзначыць у коде, і перакладзены файл можа праявіцца ўсіх тэстаў, заставаючыся розным у шляху, які ніхто не выкарыстоўваў. Тэсты ж ствараюць цікл адзначэння, які ў дзесяткі разоў сильнейшы за просьбу да модэлю ацэніць свой саўстанак. Без іх генераваны перапіс можа выглядаць абсалютна правдопадобным, тым часам таятком зменяючы сэмантыку. З іхі ў кожной генераванай змяне трэба даказаць свою неабходнасць.
У заданым процесе Bun нарадзіліся калькі ўскладненняў: компіляцыя, набор тэстаў, пераканальвання на падтрымліванных платформах, перагляд коду і дальнейшая верыфікацыя. Модэль генераваў кандыдатавакі; інжынерны процес вялікім чыннікам выбіраў, калія з іх застаюцца. Гэты разпад працы ёсць галоўная ідея, яку трэба запам’ятаваць.
Чаму кансультатывны дапамога па переносе была настолькі ж важная, як і сам модэль
Як паведамляецца, прытым часам, перш чым агенты заспрабавалі працаваць з тыячамі файлоў, у проекте была створана дакладная інструкцыя па переносе, якая апісвала, як структуры Zig трэба выражаць у Rust. У яй былі рассмотрены карэткія межы типаў, правілы называння, часта з’являючыся шаблоны перакладу, способы карыстоўвання залежнасцямі і часткавыя абмежэння ў там, што агенты маглі робіць.
Рэзультатам яе ўжыццёваўання стала замена нечыстае запатэнка (“запісаць гэты файл на Rust”) на абмежаную: перакласты файл за дапамогою узгадваных карэткіяў, захаваць його спостерагаемую працэздатнасць незменнай і не чыніць змян у архітэктуре. Агенты працуюць набліжна лепш у такой средзе, калі прастор допускніх адпаведзей є малым і часткава вялікі.
Інструкцыя таксама спрыяе лёгкай пераглядке. Уместо нечыстае запатэнка “ці гэта вялікі?” пераглядач можа задаць два конкрэтныя запыты:
- Чы гэты код на Rust паводзіцца так сама, як і Zig, які ён заменяе?
- Чы агент следав правілам перакладу, якіх дасягнуліся у проекте?
Да обыдвум запитанням ёсць адпаведныя адказы, якія можна пераканаць, і гэта самэ ўсё, што патрэбна процедура адзінакоўкі, калі колькасць змян вельмі велика.
Што мае мясцовы практычны кансэльнік
Якщо вы плануеце адпоўнага пераводу, нават у значна меньшым масштабе, такі кансэльнік зазвычай паводзіць:
- як кожны тип дадзеных, контэйнер і механізм адказаў пераводзяцца на цэльвую мову
- правіла называння, каб створанный код быў аднаковым у всіх файлах і агентах
- якія залежнасці можна адначасова включыць, а якія заборанены
- штампы, якія агент не павінен вжываць, нават якщо ўнаследак гэтага файл будзе скомпілявацца
- шта лягае ў основу падзначэння, што адны файл чы модуль „завершаны“
Шырэйшая нарада паслужыць корыстна не толькі для Bun: система інструкцыйяў для агента можа значна паўлінаваць якасць рэзультата, прыбліжна настолькі ж, як і выбор модэлю. Команды, якія вже стварылі файлы інструкцыйяў для агента, распазнаюць гэты прынцып; наша інструкцыя па стварэнні эфектываў файла CLAUDE.md раскрывае той самы прынцып для ўседзённай роботы.
Аддаковы Rust не завжды ёсць ідіаматычны Rust
Усе, хто спакушаюцца на тое, што перанесены код будзе выглядаць як проект, створаны з нуля на Rust, будуць разчароўваны, і гэта ўмышлена. Аддаковы пераклад должен выглядаць як тое, з чаго ён быў перанесены.
Это ствараець відчутны компроміс. Zig можа кароткая выражаць певныя операцыі низкага рэвэля, тады калі Rust зазвычай ўсё адначасова прыводзіць у відаўстве па типам, трымчасовасцях, правах на власнасць і межах небезпечнага коду. Таму кароткая функцыя на Zig можа ператворыцца на значна дэльнейшую функцыю на Rust. Штоячая дэльнасць — гэта наследкі оптымізацыі па аднаковасці працавання, а не па элегантнасці, і гэта не ўскладненне таго, што рэзультат не працуюць.
Дапамагае раздзеляць два тверджэння:
- "Гэта не той Rust, які я бы напісаў з нуля."
- "Гэты Rust ўскладненны.
Першае — гэта суджэнне па стылю; другаяе — гэта дыфект. Адносаванне іх як да аднаго розыгруе непатрэбную крітыку механічных перакладоў.
Спачатку пераклад, потым адчысценне
У описаным падчынным падходзе механічны пераклад і пасляэйшыя доработкі расследваліся як адзінаковыя фазы. Спачатку трэба змусіць Rust працаваць як Bun; пасля — удосконаліць сам Rust. Такое разделэнне роботы значыць, што каманда ніколі не мусі разважаць аб двух велікіх, взаімаўплываючых змянэннях адразу. Якщо падчас чысткі з’являецца регрэсія, яе можна апісаць як наследак чысткі, таму што базовая версія вже была перапрацавана на адных і тых жа тэстах.
Правільна чытанне блакоў unsafe
Спостерагачы, якія аналізавалі пераклад, зазначылі великую колькасць блакоў unsafe і спрыялі гэтаму як да знака низькай якосці Rust. Такая реакцыя зрозумела, але ігнаруе тое, як код такі стаў.
Rust выклекае, каб потэнцыяльна небезпечныя операцыі, такія як адказванне на необработаныя паказывачы чыста або вызов іншых функцый, былі чыста пазначаны з unsafe. У Zig няма адпаведнага пазначэння. Аўтантычны код Bun заполнены маніпуляцыямі памяцю на низкай ступені, работай з паказывачамі і вызовамі компонентаў на C і C++, таму аддаўнае перакладанне па-справжнему прыводзіць да таго, што вялікая частка гэтага становіцца unsafe у Rust. Да гэтага ў Bun ёсць JavaScriptCore і вузлёкі з іншымі натыўнымі бібліятэкамі, і межа межу між кодам Rust і C чыста C++ па свайму характару выклекае небезпечныя операцыі.
Іншымі словамі, пераклад не дадаў небезпекі; ён проста зробіў існуючую небезпеку видной. Чыстая колькасць блак unsafe мало што гаворыць пра якасць. Болей інформатывныя запытанні ў такіх пунктах:
- Чаму саме гэтая операцыя павінна быць небезпечной?
- Чы ў рэгіоне з небезпекай маракоўка, каб можна было яе аналізаваць?
Гэтыя запитанні таксама даюць чыткую схему для фазы адчысцэння: зменшыць небезпечныя регіоны, абгорнуць іх у безпечныя абстракцыі та задокументаваць інварыянты, на якіх кожна з іх спакоюецца.
Калі пераклад адкрывае можлівасці для палёгшэння
Буквальны пераклад усё ж можа адкрыць магчымасці, якія былі схованы ў первісным дизайне. Аднам з задокументаваных прыкладаў была сцэнарій, дзе реалізацыя на мове Zig выкарыстоўвала C++ для запрашэння дакументацыі. У Rust адпаведныя даны, якія знаходзяцца локальна для адпаведнага потока, можна было бы з’явіцца болей прымусова, ухіліўшыся ад гэтага проміжнага вызову.
Вывад не ў тым, што Rust перамагае Zig па швальнасці; такая загальназначная заключэнне не вытрымала б критычнага аналізу. Суть ў чымсь болей вузкаму і корыстнаму: перанесенне коду за межы ягоў вялікага языка вымушвае когосьці, або ўраджанне, уважна расследаваць кожны маршрут вызову, і такі аналіз часам выявляе роботу, якая ніколі не была неабходная. Такія нараджэнні заслуговаюць на адзінакавую оцэнку для кожнага случая, а не на включэнне ў дыялог пра выбор языка.
Куды перасунуліся інжынерныя зусилля
Міграцыя не пазбавіла інжынерных зусиль; яна толькі перасунула іх. У традыцыйнам развіцці большая частка часу разработчыка пайшла на напісанне коду рэалізацыі. У развіцці з дапамогою агентаў больш часу пераключаецца на:
- вызначэнне абмежэнняў і правіл перакладу
- проектаванне робочага процесу, у яком працуюць агенты
- апісанне і паўнейшэе апраноўкі тэстаў
- перагляд створаных змян
- діагностика несправнасцей
Інжынер становіцца адпаведальным за систему, якая стварае і перакантролюе код, а не за кожную лінію самога коду. Для большага проекту цыкл выглядае прыблізна так: спэцыфікацыя, потым стварэнне, потым компіляцыя, потым тэставанне, потым пераглед, потым карэкцыя, і зноў з самага пачатку. Модэль берае участак у калькі з гэтых крокаў, але дзейства цыклу вялікая мерай вялікія, чы рэзультат мае якую-небудзь ценнасць. Гэты рабочы процес, а не колькасць ліній коду, ёсць справжняя інновацыя.
Чаму Bun быў хорашым кандыдатам
Не кожны кодавая база падходзіць для такога падходу, і Bun меў калькі прыямоў:
- Рабочая рэалізацыя, якая можа служыць аднагою з баз
- Вядомая, стабільная архітэктура
- Паведамленне, якое можна было спазірваць за дапамою існуючага набора тэстаў
- Чыткая выбраная мова-цэль
- База коду, якая можа быць раздзелена на досыта незалежныя файлы і складовыя
- Адна, вимерная мета: захаваць програму, змяніўшы мову
Пораўняйце гэта з просьбай да агента спроекаваць новы продукт, дзе няма прыкладнай рэалізаціі, а тое, што ўважаецца „правильным“, — гэта пытанне дазволу. Загальная правіла такая: чым точней можна задаць бажанае паведамленне, тым больш часткі рэалізацыі можна автаматызаваць. Гэта не значыць, што агенты можна без парадкі брацца за будзь-які большы проект. Гэта значыць, што автаматызацыя працуе найэфектывней, калі цель можна вимерыць.
Што міграцыя не дазваляе падтвердзіць
Лёгкаа ўзнадтаецца такі рэзультат, таму варта чыткаа паказаць яго меры. Прыйом Bun не паказвае, што ШІ можа заменіць інжынероў програмнае апаратуры. Ён не паказвае, што кожны кодавая база можа быць перакладзена такім спосабам, што створаны код автаматычна ўтримываецца або што Rust завжды быстрейшы за Zig. І ён абавязкова не прабачвае злучэння вялічзеных запрошэнняў да змены, створаных ШІ, з звычным кодам продукту.
Якщо ўжо што, то ён паказвае працупаклад. Работа залежала ад строгіх тэстоў, чыткая правіл, параболізацыі, перагляду, адлучэння бягаў і сталай людзкай надзоры. Аналіз публікуемага рабочага процесу таксама паказвае, што агенты не заставаліся без нагляду; людзі стежылі за процэсам і нараджвалі яго, калі з’яўляліся проблемы. Інжынерскія рашэнні не сталі менш важлівымі. Яны сталі тым, на чым базаваўся весь іншы.
Параболізацыя стае вузкам местам
На працоўніх дзесятках гадоў напісанне коду вважалася повольным крокам у розрабоце. Падазроўваючы, што агент можа стварыць 10 000 ліній коду за той час, калі раней развіцелю трэбавалася 500, перша реакція — аплодаваць такой прышвартованасці, пакуль не з’яўляецца наступны вопыт: хто будзе пераканацца ў правільнасці тых 10 000 ліній?
Стварэнне коду зараз є дышаўна. Аднак перакананне ў його правільнасці застаецца дорогім, прычаму цяная роśnie значна для часу выканання, кампайляраў, баз дадзенаў, операцыйных систем і коду, чутлівага да безпекі, дзе невялікая памылка можа спрычыніць большую неудачу. Гэта вказвае на зростаючую ценнасць усіх тых элементаў, якія пераканваюць, а не ствараюць код: наборы тэстаў, можлівасці абзярнага спостерэння, статычны аналіз, методы фаззінгу, формальныя методы, сэндбоксы і адрасная пераглядка. Команды, якія больш за іншых выгадаюць ад агентаў для напісання коду, можаць быть тыя, якія маюць наймоцнейшыя системы пераканання, а не обав’язкова тыя, якія маюць доступ да найлепшага модэлю.
Практыкі, якія можна адаптаваць для сабецкіх змян за дапамою AI
Для прыменення эых практык не трэба проекту такога размеру, як у часе выконання. Яны таксама эфектывны праз перайменаванне службы між фрэймворкамі або праз пераканвертаванне базы коду на JavaScript у TypeScript.
Створыце тэсты даўна перад большымі змянамі
Рэшучы набор тэстаў — это выпанавальная спецыфікацыя. Чым больша частка функцыяналу можа быць перакантролавана аўтаматычна, тым большу частку роботы па рэалізацыі можна аддаць іншым. Якщо рэгламентаванне слабае, яго зміцненне — гэта першы крок у міграцыі, а не дадатковая задача.
Запісуйце правілы
Утрымайцеся ад запитоў на кшталт "перапісаць гэта". Указайце архітектуру, называнне элементаў, дазволеныя і забраныя залежнасці, шорткаты, якія не дазволеныя, аспекты карэнтавання памилак і критэрыя адзначэння якосці для кожнай часткі роботы.
Раздзеляйце процес стварэння і перагляду
Агент ніколы не павінен быць едыним таму, хто атрымлівае выводы сваёй роботы. Незалежны крок перагляду, чыя бы то ні было — людзь, другі агент з іншымі заведаменнямі або які-то іншы варыянт, — дае новую перспективу і дапамага выявіць проблэмы, якіх не бачыць сам крок стварэння.
Прабныце на невялікай, репрэзентатыўной частцы
Спачатку запускайце процес на калькі звычайных файлаў. Некоректныя прыпускі лёгка ўстраніць, калі яны вплываюць на дзесять файлаў, але ўжо вельмі дорага — калі яны павтарыліся ў дзесяць тысячах файлаў.
Спрыяйце да таго, каб створаны код вважалі ненадзеяным, пакуль не будзе аднойшае
Код, які компілюецца, — гэта не той код, який працуе. Компіляцыя — толькі адна з кантролюючых стадзій, а не доказ правильнасці.
Забяжыце, каб людзі неслі адпаведнае адказнасць за важлівыя рашэнні
Агенты можаюць дужа быстра аскарыстацца вялічынай можлівых способаў рэалізацыі. Рашэнне пра тое, што павінен робіць система, і пра тое, якія рызыкі є приемлівымі, застаецца адпаведнасцю чалавека.
За межамі дыялогу Zig проты Rust
Існуе падспрытна жаданне пракставіць гэтыя супернічання як борацтва Zig проты Rust, рукапіснага коду проты ШІ або людзей проты агентаў. Ніякі з такіх падходаў не дае значных адказоў. Порт Bun лепей разумецца як эксперымент з таго, як ствараецца програмнае забезпечэнне, калі стварэнне коду коштае практычна нічога. Калі система можа перакладаць сотні тысяў ліній коду, цэнтральны вопыт перастае быць «чаму магчыма рэалізаваць гэта?» і становіцца «чаму магчыма стварыць надзеяны процес, які пакажае, чы рэалізацыя правильная?» Это абсолютна разныя інжынерныя проблемы.
Як трэба ацэніваць рэзультат
Пачатковы пераклад — гэта толькі першы этап. Кодавую базу, перанесенную механічна, з часам можна зробіць болей ідыяматычной: пераглядаюцься та скорачуюцься небезпечныя рэгіоны, паслабляюцься абстракцыі, налаштовуецца працэздатнасць, а шары сумеснасці зняты. Каля будзь-якай системы для практычнага вжытку яе нарэшце будуць адгукавацца за тым, чы робіць яна карыстацца сабой рэальныя корыстувачы. У выхідных матэрыялах зазначаецца, што Bun продавал новыя версіі пасля міграціі; для абяроны ўсёх сучасных станаў проекту перагляньце яго рэпозітарый та журнал змян.
Значныя адгукі будуць даўацца на адлеглы час, а не за велічыну перапісвы коду:
- чы працэздатнасць застаецца стабільной у разных версіях
- чы код стае простейшым у адтрыманні
- чы працэздатнасць застаецца конкурентной
- чы багі, зв’язаныя з памятай, стаюць рэдкіснейшымі
- чы учаснікі проекту можаць разумець та паспрабаваць падбіць новы код
Галоўныя вывары
- Ценнасць міграцыі Bun закладзена ў цыкл правілаў, тэстаў, перагляду і карэкцыі, а не ў колькасці створанага коду.
- Формаванне перапісвы як працэсу з адтворэнням паведання дае агентам меркавыя цілі, а пераглядачам — конкрэтны список пунктаў.
- Прадаўнічы паказальнік скарочвае прастор допускаемых рэзультатаў і разрабатвае можлівасць масштабавання перагляду.
- Растуцый або небезпечны код на Rust у вернай перапісве часта ёст канэктыўная цена эквівалентнасці; небезпечны код трэба ацэніваць па яго межах, а не па колькасці.
- Калі стварэнне коду стане дышча, інвестыціі ў перакананне стануць тым, што разлічвае команды, а проектаванне гэтага цыклу зворотнай связі становіць все бол ядро інжынерскай роботы.