Три года назад Andreas Kling запустил Ladybird — независимый браузер, написанный с нуля на C++. Проект рос без корпоративных спонсоров, без форков существующих движков, без компромиссов. Но 23 февраля 2026 года команда объявила: Ladybird переходит на Rust. И сделали это не просто быстро — невероятно быстро, используя AI для портирования кода.
25 000 строк Rust за две недели. Работа, которая вручную заняла бы месяцы. Давайте разберём, как это произошло, почему это важно и что значит для будущего браузерных движков.
Почему Ladybird отказался от чистого C++
Kling не скрывал: команда искала memory-safe язык давно. Браузерный движок — это миллионы строк кода, обрабатывающих недоверенный контент из интернета. Одна ошибка с памятью — и у атакующего есть remote code execution. C++ даёт производительность, но безопасность памяти полностью на совести разработчика.
Первым кандидатом был Swift. Apple активно продвигает язык как C++ successor, Swift имеет приличный C++ interop. Но реальность оказалась жёстче документации: "C++ interop never quite got there", признал Kling. А вне экосистемы Apple поддержка Swift на Linux и Windows хромает. Для браузера, который должен работать везде, это убийственный недостаток.
Rust ecosystem, напротив, вырос именно для systems programming. Компилятор работает одинаково на всех платформах, tooling зрелый, а главное — многие контрибьюторы Ladybird уже знают Rust. Mozilla годами доказывала, что Rust и браузеры совместимы: Servo, компоненты Firefox (Stylo, WebRender), сейчас уже половина Firefox написана на Rust.
Решение было очевидным. Вопрос был "как?".
LibJS как первая жертва миграции
Kling выбрал цель с хирургической точностью: LibJS — JavaScript-движок Ladybird. Конкретно: lexer, parser, AST и bytecode generator. Почему именно эти компоненты?
Изоляция. Эти части относительно самодостаточны. Они не вросли в C++ кодовую базу тысячей зависимостей. Вход — исходный код JS, выход — байткод. Чёткие границы.
Тестовое покрытие. LibJS прогоняется через test262 — официальный тестовый набор ECMAScript. Тысячи тестов, покрывающих каждую закоулку спецификации. Портируешь код, запускаешь тесты, видишь что сломалось. Feedback loop мгновенный.
Критичность. JS-движок — это сердце браузера. Если Rust справится здесь, он справится где угодно. Это не демонстрационный проект, это production code.
Технически это был идеальный кандидат для первого эксперимента.
Как AI портировал 25 000 строк за 2 недели
Kling не запустил автономных AI-агентов и не ушёл пить кофе. Процесс был human-directed code translation: сотни мелких промптов, каждый — конкретная инструкция для Claude Code или Codex.
Представьте: берёте класс C++ парсера. Говорите AI: "Портируй этот класс на Rust, сохраняя логику, используя идиоматичный Rust для управления памятью". AI генерирует код. Вы проверяете, запускаете тесты, находите ошибки, уточняете промпт. Следующая итерация.
Почему это сработало:
-
Test262 как ground truth. Каждое изменение проверялось тысячами тестов. AI мог ошибиться в деталях, но тесты ловили баги немедленно.
-
Инкрементальная миграция. Не "портируй весь движок", а "портируй этот конкретный метод". Маленькие шаги, каждый валидируется.
-
Domain expertise человека. Kling знает, как работает JS-парсер. Он видел, когда AI генерировал правдоподобный, но неправильный код. AI — это power tool, не замена инженеру.
Результат: 25 000 строк Rust. Вручную это заняло бы месяцы. С AI — две недели.
Hybrid-подход: C++ никуда не делся
Вот где Ladybird отличается от религиозных войн "Rust vs C++". Kling заявил прямо: "This is not becoming the main focus of the project."
Основная разработка продолжается на C++. Браузерный движок растёт, добавляются фичи, фиксятся баги — всё на C++. Rust-портирование — это параллельный track, который будет идти долго, может быть годы.
Почему такой подход разумен:
Реальность legacy code. Ты не можешь нажать кнопку и переписать миллион строк C++. Код работает, код в production, код эволюционировал годами.
Скорость разработки. Переписывание замедляет фичи. Пользователям нужен браузер, который работает сегодня, а не через три года после полной переписи на Rust.
Риск-менеджмент. Что если портирование на Rust провалится? Что если performance упадёт? Hybrid-подход — это страховка. C++ остаётся, Rust добавляется там, где выигрыш очевиден.
Firefox делает так годами. Chromium экспериментирует с Rust. Даже Linux kernel принял Rust не как замену C, а как дополнение. Это индустриальный консенсус: incremental adoption beats big rewrites.
Memory safety как конкурентное преимущество
Браузеры — это battleground для безопасности. Google тратит миллионы на Project Zero, Mozilla создала Rust специально для Servo, Apple добавляет sandboxing слой за слоем. Причина простая: 70% критических багов в браузерах — это memory safety issues.
Ladybird — инди-проект. У них нет батальона security engineers. Но у них есть Rust.
Borrow checker не пропустит use-after-free. Type system не даст спутать указатели. Unsafe-блоки можно пересчитать по пальцам и проверить вручную. Это не панацея, но это архитектурная защита на уровне языка.
Для маленькой команды это множитель силы. Вместо отлова memory bugs через fuzzing, sanitizers и code review, ты просто не можешь их написать. Компилятор не даст.
Что это значит для индустрии
Ladybird — это proof of concept, что AI-assisted migration в Rust реальна не только для greenfield проектов. Можно взять существующий C++ код, портировать инкрементально, используя AI для acceleration.
Последствия:
Снижение барьера миграции. Раньше переход на Rust требовал переобучения команды и месяцев ручной работы. Сейчас — две недели с Claude Code.
Легитимизация hybrid-подходов. Не нужно выбирать "C++ или Rust". Можно делать "C++ и Rust", мигрируя постепенно.
Давление на C++. Если Rust adoption ускоряется, C++ committee вынужден двигаться быстрее. Safety profiles, lifetime annotations, memory safety features — всё это ответ на Rust threat.
Но главное: независимый браузер без корпоративного бюджета может конкурировать с Chrome и Firefox за счёт выбора правильного stack. Это меняет расклад сил.
Заключение
Ladybird портирует JavaScript-движок на Rust не потому, что это модно. Это прагматичное решение команды, которая хочет конкурентный браузер без армии security engineers. AI снизил cost миграции с месяцев до недель. Hybrid C++/Rust подход убирает риски big rewrite.
Через год увидим, как LibJS на Rust работает в production. Если performance держится, а безопасность улучшается, другие компоненты последуют. Если нет — C++ останется, а Rust будет экспериментом.
Но одно ясно сейчас: миграция на Rust из утопической идеи превратилась в boring engineering problem. А когда что-то становится boring, это значит, что индустрия приняла это как норму.
Sources: