
2026/02/23 20:29
レディバードは Rust を採用しました。
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
## 要約 Ladybirdはメモリ安全性を向上させ、ツールチェーンを近代化するために、コアの実装をC++からRustへ移行しています。最初のステップとしてJavaScriptエンジン(LibJS)の書き換えが進められています。Swiftを採用しようとした過去の試みは、既存のC++コードとの相互運用性が弱く、広範なプラットフォームサポートも欠如していたため失敗しました。2024年にRustを評価した際には、オブジェクト指向スタイルの不足と見なされる点で満足できない結果となりましたが、FirefoxやChromiumなど主要ブラウザからの最近の成功事例は、大規模かつ複雑なエンジンに対するRustの有効性を示しています。 最初に移植対象としたのはLibJSです。字句解析器・パーサー・AST・バイトコード生成器を、人間が指示しながらClaude CodeおよびCodexを用いて数百回の小さなプロンプトと複数モデルによる対抗的レビューを経てRustで書き直しました。その結果、約2週間で約25,000行のRustコードが完成(従来は手作業で数か月必要)し、検証ではRustパーサーのASTがC++と一致し、生成されるバイトコードもC++コンパイラと同一であることが確認されました。test262(52,898件)やLadybirdの回帰テストスイート(12,461件)においてもゼロレグレッションが観測され、JavaScriptベンチマークにおけるパフォーマンス低下は認められませんでした。さらに、ロックステップ型ブラウジングテストを実施し、両パイプラインで処理されたすべてのJavaScriptについて出力が同一であることを確認しました。Rustコードは意図的にC++パターン(例:レジスタ割り当て)を模倣してバイトコードの同一性を保っており、まだ慣れたRust表現ではなく、将来的に洗練される予定です。 この勢いでLadybirdのコアチームはどのサブシステムを先に移行するかを決定し、RustとC++間の明確な境界を設定します。非慣れたRustコードは後日リファクタリングされます。この移行によりユーザーにはパフォーマンスや機能性が変わらず、開発者には安全で保守しやすいベースが提供され、Rustに精通した貢献者を惹きつけることが期待されています。
本文
ラビアード(Ladybird)の C++ を置き換えるために、メモリ安全なプログラミング言語を探し続けてきました。以前は Swift を検討しましたが、C++ との相互運用性が十分に実現できず、Apple エコシステム以外のプラットフォームでのサポートも限定的でした。一方 Rust は別物です。システム開発向けのエコシステムがはるかに成熟しており、多くの貢献者がすでに言語を知っています。今後、ラビアードの一部を Rust で書き直す予定です。
なぜ Rust なのか?
2024 年に最初に Rust を評価したときは、「C++ スタイルのオブジェクト指向にはあまり適していない」と判断し、採用を見送っていました。Web プラットフォームのオブジェクトモデルは、ガベージコレクションや深い継承階層など 1990 年代の OOP の影響が強く、Rust の所有権モデルとは自然に合わないと感じたからです。しかし一年間試行錯誤を重ねた結果、実務的な判断として「Rust が必要とするエコシステムと安全性保証を備えている」ことが明らかになりました。Firefox と Chromium もすでにコードベースに Rust を導入し始めており、ラビアードにとっても最適だと判断しました。
LibJS の移植
まず対象にしたのは LibJS(ラビアードの JavaScript エンジン)です。字句解析器・パーサー・AST・バイトコード生成器は比較的独立しており、Test262 を通じて豊富なテストカバーがあるため、自然と最初の移植対象になりました。Claude Code と Codex を使用し、人間が指示を出す形で翻訳しました。何をいつどこへ移植するか、Rust のコードはどう構造化するかを決め、数百回にわたる小さなプロンプトでエージェントを誘導しました。その後、複数の対立的レビューを実施し、異なるモデルにコードを解析してもらい、ミスや悪いパターンがないか検証しました。
結果
最初から「両方のパイプラインでバイトごとに同一出力」を要求しました。結果として約 25,000 行の Rust コードが完成し、全体の移植には約二週間を要しました。手作業で行えば数か月かかるはずでした。Rust パーサーが生成するすべての AST が C++ のものと完全に一致し、Rust コンパイラが出力するバイトコードも C++ コンパイラと同一であることを確認しました。全体でリグレッションはゼロです。
- Test262 テストスイート:52,262 件
- ラビアード回帰テスト:12,461 件
- 追跡している JS ベンチマークにおける性能低下なし
さらに、C++ と Rust の両パイプラインを同時実行し、出力が完全に一致することを確認する「ロックステップ」モードで広範囲のテストも行いました。
コードを見ると「C++ から翻訳された」という雰囲気が強く感じられます。これは実際に C++ から翻訳したためです。この最初のフェーズでは、C++ パイプラインとの互換性を最優先しています。Rust コードは意図的に C++ のレジスタ割り当てパターンなどを模倣し、両コンパイラが同一バイトコードを生成できるように設計されています。正確さは二番目の重要事項であり、結果として Rust 的な書き方ではなく、C++ を置き換えるための実装になっています。C++ パイプラインを退役させた後で簡素化やクリーンアップが進む予定です。
今後の展望
これはプロジェクトの主要焦点になるわけではありません。エンジンは引き続き C++ で開発し、Rust への移植は長期に渡るサイドタスクとして進めます。新しい Rust コードは既存の C++ と明確に定義された相互運用境界を通じて共存します。
どこをいつ移植するかを慎重に決定し、コアチームが移植作業を管理します。移植作業を始める前に必ず調整を行い、マージできない作業に時間を浪費しないようにしてください。
この判断は論争を呼ぶかもしれませんが、ラビアードの将来にとって正しい決断だと信じています。
— アンドレアス・クリング
創設者 & 会長