Переписывание Bun на Rust — впечатляющее достижение
MMaximilian Schwarzmüller
Computing/SoftwareSmall Business/StartupsInternet Technology
Transcript
00:00:00BUN был перенесен с SIG на Rust.
00:00:02Вы, вероятно, уже слышали об этом,
00:00:04но здесь есть о чем рассказать.
00:00:06На прошлой неделе было много шума,
00:00:08но происходит и много интересного.
00:00:10И независимо от того, интересуетесь ли вы BUN, SIG или Rust,
00:00:14это действительно интересно.
00:00:15Также в том, как использовался ИИ
00:00:18и что это может означать для подобных проектов
00:00:20в нашей индустрии в целом.
00:00:22Теперь, в качестве небольшого отступления,
00:00:24лично мне BUN довольно сильно нравится.
00:00:26Это среда выполнения JavaScript по умолчанию, которую я использую
00:00:29в большинстве моих проектов.
00:00:30И действительно, по приятному совпадению,
00:00:32на прошлой неделе я выпустил совершенно новый курс по BUN.
00:00:35И он, конечно, подходит как для версии на Rust,
00:00:37так и для версии на SIG.
00:00:39Так что, если вы хотите углубиться в BUN
00:00:41и узнать обо всех основных API, которые он предлагает,
00:00:44потому что это одно из главных преимуществ BUN,
00:00:46что у него так много всего встроено.
00:00:48Некоторым это не нравится, я же в восторге.
00:00:50Если вы хотите узнать об этом больше,
00:00:51тот курс может быть вам интересен.
00:00:53Но давайте теперь поближе взглянем
00:00:54на общую хронологию переноса, хорошо?
00:00:58На самом деле это произошло два месяца назад.
00:01:01Так что пост в блоге был опубликован на прошлой неделе в июле,
00:01:04но сам перенос произошел в мае.
00:01:08И началось все в начале мая,
00:01:10когда ветка CloudFaserPort была обнаружена
00:01:13в официальном репозитории BUN на GitHub.
00:01:15Эта ветка содержала файл porting.md,
00:01:18markdown-файл с инструкциями
00:01:21о том, как преобразовать код SIG в код Rust,
00:01:23как перенести этот код, таблицы трансляции
00:01:27и общие инструкции.
00:01:28И мы еще вернемся к тому, как этот файл был создан,
00:01:30потому что, конечно, здесь был замешан ИИ,
00:01:32как вы могли догадаться, чуть позже.
00:01:34Это было обнаружено.
00:01:36Поэтому, естественно, начались дискуссии на Hacker News и X.
00:01:40Были люди, которые были от этого в восторге.
00:01:43Были люди, которые относились к этому очень критично.
00:01:46Но в тот момент мы знали немногое.
00:01:47Очевидно, что вокруг Rust много поляризации.
00:01:52Есть люди, которые любят Rust, как я.
00:01:55Есть люди, которые ненавидят Rust.
00:01:57Есть люди, которые ненавидят
00:01:58то, что все должно быть переписано на Rust,
00:02:00потому что очень часто можно прочитать,
00:02:03что люди хотят, чтобы программа XYZ была переписана на Rust.
00:02:06И я понимаю, что это раздражает.
00:02:08Но, естественно, поэтому
00:02:09там происходила большая поляризация.
00:02:11Но перенос еще не состоялся.
00:02:15Это изменилось позже в мае.
00:02:16И 14 мая был открыт официальный pull request,
00:02:22а затем и объединен,
00:02:24который фактически мигрировал кодовую базу BUN,
00:02:28всю целиком, с SIG на Rust.
00:02:30Как видите, это огромный pull request.
00:02:32Было добавлено более миллиона строк кода.
00:02:35А удаление кода SIG произошло
00:02:39на другом этапе.
00:02:40Так что да, поэтому это не просто замена.
00:02:42Но это огромные изменения, как видите,
00:02:44почти 7 000 коммитов.
00:02:46Естественно, этот код не прошел проверку человеком,
00:02:51по крайней мере, не полностью.
00:02:52Он был проверен ИИ.
00:02:54Тесты проходили, но он не был проверен человеком.
00:02:59И мы вернемся к тому, как использовался ИИ, через секунду.
00:03:02Но это было опубликовано или объединено.
00:03:06И, конечно, последовало еще больше дискуссий.
00:03:08Как я уже сказал, он не был проверен людьми.
00:03:10Конечно, это невозможно сделать за такие сроки.
00:03:14Но сообщество включилось в работу, изучило
00:03:17и проанализировало некоторые части.
00:03:19А потом появился другой, или первый пост в блоге,
00:03:23не официальный со всеми деталями,
00:03:25а первый пост в блоге или заявление команды BUN
00:03:29об использовании unsafe.
00:03:32Потому что одна из больших критических замечаний, прозвучавших после этого pull request,
00:03:37заключалась в том, что код на Rust был не идиоматическим.
00:03:41Это был не тот код на Rust, который вы бы написали
00:03:44или должны были бы написать, если бы создавали его с нуля.
00:03:46Вместо этого он действительно был похож на перевод с SIG на Rust.
00:03:50А это означало, что использовались не все лучшие практики
00:03:54и паттерны Rust.
00:03:55И особенно, там было значительное количество
00:03:58использования unsafe.
00:04:00Теперь, чтобы понять unsafe, нужно понять,
00:04:03как Rust управляет памятью,
00:04:05потому что это одно из его главных преимуществ,
00:04:08и оно сильно отличается от других языков.
00:04:10Потому что в большинстве языков есть либо сборщик мусора,
00:04:14который представляет собой процесс, по сути определяющий,
00:04:16когда значение больше нигде не используется в программе,
00:04:19а затем освобождает память, что удобно,
00:04:21но потребляет дополнительные ресурсы.
00:04:24Или вы должны делать это сами.
00:04:26В таких языках, как C, например,
00:04:28вы должны вручную выделять и освобождать память.
00:04:31И то же самое в SIG.
00:04:33Там можно выделить память, но нужно также вызвать free,
00:04:37или же освободить ее, когда она больше не нужна.
00:04:40Можно использовать defer, что приятно.
00:04:43Это, по сути, означает, что вы можете вызвать это
00:04:47до того, как это будет фактически выполнено.
00:04:49Это откладывается и будет вызвано автоматически,
00:04:52когда эта область видимости закончится, по сути.
00:04:55И это хорошо, потому что есть разные ситуации,
00:04:58когда значение может больше не понадобиться.
00:05:00Но все же, когда приходится очищать память вручную,
00:05:04есть много ситуаций,
00:05:05когда можно выстрелить себе в ногу.
00:05:07У вас есть более детальный контроль,
00:05:09и это может быть очень полезно, очень эффективно,
00:05:11но также легко забыть ситуации
00:05:15в более сложных программах,
00:05:16где вы, возможно, не очищаете память,
00:05:19в результате чего появляется утечка памяти,
00:05:20или вы можете очистить ее дважды,
00:05:23что также вызовет ошибку.
00:05:25Поэтому здесь есть компромисс.
00:05:27А у Rust другой подход.
00:05:30В Rust есть концепция владения (ownership),
00:05:32которая означает, что у каждого значения есть только один владелец,
00:05:36и оно привязано к области видимости.
00:05:38Так что, если у вас есть область видимости,
00:05:39а вы можете создать ее с помощью фигурных скобок,
00:05:41или функция также имеет свою область видимости.
00:05:43Возможно, вы знаете эту концепцию из JavaScript.
00:05:46Если у вас есть область видимости,
00:05:47тогда, когда в ней создается значение,
00:05:49оно принадлежит этой области видимости.
00:05:51И если область видимости заканчивается, оно освобождается.
00:05:53И это, конечно, очень удобно,
00:05:55потому что вам не нужно заботиться об освобождении.
00:05:58У вас также нет сборщика мусора.
00:06:00Вместо этого у вас есть это четкое правило.
00:06:02Это может привести к сложности в более комплексных программах,
00:06:05где нужно передавать значения вокруг.
00:06:07В Rust это можно сделать,
00:06:08но это требует иного образа мышления.
00:06:11Но, конечно, это дает вам безопасность памяти,
00:06:14если только вы не используете ключевое слово unsafe.
00:06:19Если вы его используете, вы можете создать область видимости unsafe.
00:06:22И в ней эти правила больше не действуют.
00:06:24И тогда ваша задача — убедиться,
00:06:26что память управляется надлежащим образом.
00:06:28Почему бы вам это делать?
00:06:29Ну, например,
00:06:31если вы подключаете какую-то библиотеку на C,
00:06:33что можно сделать в Rust,
00:06:34можно смешать немного кода C, так сказать,
00:06:37или вызвать некоторые методы и функции библиотеки C,
00:06:40тогда, поскольку C по своей природе небезопасен,
00:06:44код, в котором вы обращаетесь к этому коду на C, тоже небезопасен.
00:06:48Поэтому вам нужна эта функция для взаимодействия с нашим небезопасным кодом.
00:06:52И это также одна вещь, которую они отметили
00:06:54в том официальном заявлении,
00:06:56что все эти случаи использования unsafe в кодовой базе
00:07:00в значительной части были на самом деле связаны с вызовами
00:07:04других библиотек, библиотек на C и так далее,
00:07:07что не изменится.
00:07:08Но они также определили области,
00:07:10в которых они действительно могли улучшить код
00:07:13и избавиться от unsafe.
00:07:14И они упомянули, что будут делать это
00:07:15в последующих pull requests.
00:07:18И они делали и продолжают делать это.
00:07:20Так что вы можете рассматривать этот начальный перенос
00:07:22как отправную точку,
00:07:24которая затем уточнялась со временем.
00:07:26Стоит также упомянуть, что этот первоначальный pull request,
00:07:28или тот огромный pull request,
00:07:30уже имел пройденные тесты.
00:07:32Так что он был стабильным, тесты проходили,
00:07:35но код был не того качества,
00:07:37которого вы, возможно, ожидали бы, если бы он был написан на Rust
00:07:40с нуля, потому что это не было целью.
00:07:43Так что это было 21 мая.
00:07:45Затем наступила тишина.
00:07:46Также стоит отметить, что эта версия BUN
00:07:49еще не была выпущена.
00:07:50И когда я записываю это, она все еще не работает.
00:07:52Когда вы сейчас устанавливаете BUN,
00:07:54вы все еще получаете версию SIG,
00:07:56но это должно измениться со дня на день.
00:07:58Но затем, 8 июля,
00:07:59был опубликован официальный пост в блоге,
00:08:02где мы находим много интересных подробностей
00:08:04об этом переносе.
00:08:06И его действительно стоит прочитать.
00:08:07Я дам ссылку ниже,
00:08:08потому что здесь есть чему поучиться.
00:08:11Весь этот перенос, и это не секрет,
00:08:13была выполнена с помощью ИИ.
00:08:15Стоит помнить, что BUN принадлежит Anthropic.
00:08:18Так что у них был бесплатный доступ ко всем этим токенам
00:08:22и, в частности, к Fable 5
00:08:24еще до того, как она стала доступна публике.
00:08:26Этот порт был сделан с помощью Fable 5.
00:08:29И кстати, если вы устанавливаете Cloud Code сейчас,
00:08:32то, несмотря на то, что BUN 1.4, версия на Rust, еще не вышла,
00:08:36Cloud Code уже работает поверх
00:08:39невыпущенной версии BUN, так сказать,
00:08:42а именно версии на Rust.
00:08:44Так что это есть.
00:08:45Но да, этот порт был сделан с помощью Cloud Code
00:08:48на базе Fable 5 с бесплатными токенами, конечно,
00:08:52по сути, так как BUN является частью Anthropic.
00:08:54И это важно помнить,
00:08:56потому что в этом блоге
00:08:58мы узнаем, что если бы вы сложили все токены,
00:09:03или если бы вы суммировали все токены,
00:09:04которые были потрачены, по ценам API,
00:09:08весь этот порт стоил бы около 160 000 долларов.
00:09:13Это поразительная цифра, но на самом деле,
00:09:18если подумать о масштабах этого проекта,
00:09:20а масштаб таков, что BUN состоял из 535 000 строк кода на SIG,
00:09:26если подумать об этом масштабе
00:09:28и о том, сколько времени потребовалось бы людям, чтобы портировать это на Rust,
00:09:32то 160 000 долларов могут звучать не так уж и плохо,
00:09:36в зависимости от того, где вы находитесь.
00:09:38Тем не менее, ясно, что ни один open source проект
00:09:43не смог бы это сделать.
00:09:44И большинство компаний, вероятно, не смогли бы
00:09:47или не захотели бы тратить такую сумму денег на портирование.
00:09:50Это стало возможным, потому что BUN — часть Anthropic.
00:09:54И, конечно, это еще и отличный маркетинговый ход
00:09:58для Anthropic.
00:09:59Возможно, это не было главной целью.
00:10:03Я этого не знаю.
00:10:04Но, конечно, это хороший маркетинг.
00:10:06Все это важно помнить.
00:10:08Тем не менее, в этом блоге
00:10:10мы можем узнать, как Джаред выполнил этот порт
00:10:14или как он заставил этот порт работать.
00:10:18И все началось с файла porting.md,
00:10:21который он создал в ходе дискуссии с Claude,
00:10:25в трехчасовой дискуссии,
00:10:26как он упомянул в блоге,
00:10:28где он, по сути, вместе с Claude Code
00:10:32и моделями Anthropic решил,
00:10:35как должен выглядеть такой файл porting.md,
00:10:37чтобы иметь возможность перевести код с SIG на Rust.
00:10:40Затем, после того как он проработал его и остался доволен результатом,
00:10:44он сначала протестировал его на трех файлах.
00:10:46И как только он остался доволен этим,
00:10:48он «натравил» Claude на всю кодовую базу BUN.
00:10:53В этом блоге
00:10:54он ясно дает понять, что не просто давал промпты Claude,
00:10:57чтобы переписать BUN на Rust, не ошибитесь,
00:11:00а вместо этого создал сложную систему,
00:11:03в которой у него был один главный агент,
00:11:07который, конечно, запускал и под-агентов,
00:11:09выполняющих портирование в соответствии с файлом porting.md.
00:11:13А еще у него были два состязательных агента-рецензента,
00:11:16которые проверяли работу главного агента после ее завершения
00:11:19и предоставляли обратную связь,
00:11:21а также агент-исправитель для применения этой обратной связи.
00:11:24И все это работало в цикле,
00:11:25и, конечно, было распределено по нескольким рабочим деревьям,
00:11:30чтобы обрабатывать всю кодовую базу
00:11:33и постепенно продвигаться по ней.
00:11:35В блоге
00:11:35он упомянул, что переписал BUN на Rust,
00:11:38используя 50 динамических рабочих процессов в Claude Code,
00:11:40которые представляют собой рабочие процессы, запускающие множество под-агентов,
00:11:43в течение 11 дней.
00:11:46И там еще есть отличная диаграмма.
00:11:48В целом, в блоге
00:11:49есть неплохая графика,
00:11:51которая немного облегчает восприятие,
00:11:53показывающая количество коммитов, которые были созданы,
00:11:56а затем отправлены в разные дни
00:11:58и в разное время дня.
00:12:00Так что все это происходило с помощью циклов в Claude Code,
00:12:04с помощью множества под-агентов
00:12:05и четкого процесса с одним главным агентом,
00:12:08агентами-рецензентами и агентом-исправителем.
00:12:10А еще он проделал отдельную работу,
00:12:15так сказать, чтобы заставить работать все эти тесты.
00:12:20И это принесло свои проблемы,
00:12:22потому что набор тестов такой большой и сложный,
00:12:25что он столкнулся с различными инфраструктурными ограничениями,
00:12:29потому что некоторые тесты потребляют много памяти,
00:12:31и выполнение многих тестов параллельно
00:12:33поэтому не работает.
00:12:34Но в конечном итоге он заставил это работать, также с помощью ИИ,
00:12:39запуская тесты, исправляя код,
00:12:42перезапуская тесты и так далее.
00:12:43Так что много циклов, много вовлеченных агентов и под-агентов,
00:12:47естественно, и много сожженных токенов.
00:12:49165 000 долларов в сожженных токенах.
00:12:53И опять же, вы можете погрузиться глубже,
00:12:55и именно это я бы порекомендовал сделать,
00:12:57если вас интересуют все тонкие детали.
00:12:59Это отличный пост в блоге, документирующий путь к результату.
00:13:03Но в двух словах это то, как портирование происходило в течение 11 дней
00:13:08со всеми этими агентами и под-агентами, распределенными по нескольким рабочим процессам,
00:13:1250 таких рабочих процессов, как мы узнали, за 11 дней,
00:13:17165 000 долларов потрачено на токены по ценам API.
00:13:24Теперь, наконец, когда он закончил, в блоге
00:13:29он упомянул, что Bun 1.4 исправляет различные ошибки, которые есть в последней версии SICK,
00:13:35что он более эффективен по памяти, что он меньше.
00:13:38И, как мы узнаем из ответа Эндрю Келли, создателя SICK,
00:13:43некоторых из этих улучшений, вероятно, можно было достичь и с помощью SICK.
00:13:47Но этот пост в блоге довольно интересен, потому что его отредактировали.
00:13:53Теперь в нем меньше гнева, чем было изначально.
00:13:57Первая версия была полна личных нападок,
00:14:00и это при том, что потом он сказал, что это не задумывалось как личная нападка,
00:14:03но она была полна личных нападок.
00:14:05Последняя версия, на которую я также дам ссылку ниже, все еще довольно острая.
00:14:11В конце концов, вы можете ясно понять из прочтения первой версии,
00:14:14а также этой версии,
00:14:16что Эндрю, создатель SICK, и Джаред, создатель Bun,
00:14:21уже не станут лучшими друзьями, больше никогда.
00:14:26Теперь он благодарит Bun за поддержку SICK, в том числе финансовую,
00:14:31просто чтобы, по сути, беситься по поводу всего этого порта и того, что он не был бы нужен,
00:14:41если бы код Bun был написан на нормальном SICK.
00:14:44Он очень ясно дает понять, что не считает, что репозиторий Bun,
00:14:48версия SICK, имела высокое качество кода, и это привело ко многим проблемам.
00:14:53И это может быть правдой, а может и нет.
00:14:56Я думаю, вполне возможно, что в проекте масштаба Bun,
00:15:01движущемся с такой скоростью, с какой движется Bun,
00:15:06качество кода могло не соответствовать стандартам создателя SICK.
00:15:12Вы определенно могли бы поспорить, что большинство кодовых проектов
00:15:15не обязательно имеют высочайшее качество кода.
00:15:18Так что вы можете придумывать все, что хотите.
00:15:21На этом я остановлюсь.
00:15:24Мне кажется, что ответный пост в блоге довольно слабый,
00:15:29потому что он буквально дышит гневом.
00:15:33В нем есть некоторые обоснованные моменты.
00:15:35Например, в блоге, который делает Джаред,
00:15:40он упоминает, что порт с SICK на Rust был проверен,
00:15:46конечно, всеми этими агентами-рецензентами,
00:15:48но также запуском набора тестов и обеспечением его работы.
00:15:51И Эндрю правильно заявляет, что, конечно, тот же набор тестов
00:15:56должен был или не должен был быть достаточным, чтобы доказать, что версия SICK отличная.
00:16:00Так что, возможно, набор тестов тоже следовало улучшить.
00:16:04В любом случае, эти двое точно не станут лучшими друзьями.
00:16:09И у меня нет мнения, является ли SICK или Rust лучшим языком в целом или для Bun.
00:16:17Я верю, однако, что с ИИ, Rust, его моделью памяти и тем фактом,
00:16:23что вы получаете ошибки компиляции для многих проблем, связанных с памятью, это огромное преимущество,
00:16:30особенно в эпоху ИИ, потому что, конечно, весь этот порт действительно впечатляет
00:16:38когда речь заходит об использовании ИИ.
00:16:41И конечно, это способ использования ИИ, который большинство из нас не сможет позволить себе
00:16:45или не захочет позволить себе в компаниях.
00:16:48Но впечатляет, что ИИ смог это сделать.
00:16:52И это не «вайб-кодинг» и не просто «YOLO-промптинг».
00:16:56За всем этим стоит четкий процесс.
00:16:59В это было вложено много мыслей, что я, надеюсь, сделал понятным, и что определенно становится ясно,
00:17:05если вы погрузитесь в технические детали.
00:17:08Но со всем планированием, всей итерацией с настройкой, с тем, как к этому подходили,
00:17:13ясно, что это был не просто один промпт.
00:17:17И посмотрим, к чему мы придем, это показывает, что можно сделать с помощью ИИ.
00:17:21И, конечно, перенос кодовой базы с одного языка на другой — довольно хороший вариант использования ИИ.
00:17:27Если подумать, ИИ, конечно, может испытывать трудности с написанием нового кода.
00:17:32Он может не написать код, который вы хотели, не следовать соглашениям по написанию кода
00:17:36или стилям, которым вы хотели следовать, и он может все испортить.
00:17:40Ну, ИИ определенно удивителен и для создания нового программного обеспечения.
00:17:43Но там вы сталкиваетесь с другим набором проблем при портировании.
00:17:47Огромное преимущество заключается в том, что у вас есть кодовая база, на которую ИИ может просто посмотреть и перевести ее,
00:17:53что ИИ может делать, и у вас есть набор тестов.
00:17:57Так что есть на что опираться.
00:17:59Это хороший вариант использования ИИ, как кажется, и как этот порт ясно доказывает.
00:18:04И я думаю, что это самый интересный вывод здесь.
00:18:08Также то, что вы можете браться за проекты, которые были бы просто невозможны
00:18:12ранее.
00:18:13Опять же, не для всех, но для определенных компаний определенных размеров.
00:18:18Это может быть интересно.
00:18:19Модернизация устаревшего программного обеспечения с помощью ИИ может быть отличным вариантом использования.
00:18:26И это показывает и доказывает, что это можно сделать.
00:18:30Теперь, конечно, BUN 1.4 еще не вышел.
00:18:32Посмотрим, все ли рухнет и придется ли им делать откат через месяц.
00:18:36Вы не можете полностью исключить это, но я лично не думаю, что это произойдет.
00:18:40Он уже используется в продакшене некоторыми ранними последователями, такими как Cloud Code CLI.
00:18:47Он был протестирован и тщательно проверен, даже если, конечно, ИИ, а не людьми-рецензентами.
00:18:54Но я довольно уверен, что это сработает, и я нахожу это довольно впечатляющим достижением, а также довольно впечатляющим использованием ИИ.
00:19:03Но, как всегда, мне также интересно услышать, что вы думаете обо всем этом.