世界を動かす技術を、日本語で。

レディバードブラウザがRustを採用

概要

LadybirdはC++の代替として Rust の導入を決定 最初のターゲットは LibJS (JavaScriptエンジン)の移植 移植作業は 人間主導+AIツール で短期間に完了 移植後も 性能・互換性に一切の劣化なし 今後も C++とRustの共存体制 で段階的に移行予定

LadybirdのC++からRustへの移行決定

  • C++に代わるメモリ安全な言語 を長期間模索
  • Swift はC++との相互運用やApple以外のプラットフォーム対応で断念
  • Rust はシステムプログラミング向けのエコシステムが成熟
  • 貢献者の多くがRust経験者 であることも後押し
  • FirefoxやChromiumもRust導入を進めており 業界の流れ に合致

Rust選定の理由と課題

  • 2024年時点では C++流OOPとの相性の悪さ からRustを一度却下
  • Webプラットフォームのオブジェクトモデルは 1990年代的OOP が色濃く、Rustの所有権モデルと自然に合わない
  • しかし 安全性・エコシステムの成熟 を重視し、現実的な選択としてRustを再評価
  • 保守性・安全性の向上 を最優先

LibJS(JavaScriptエンジン)のRust移植

  • 最初のターゲットはLibJS (LadybirdのJavaScriptエンジン)
  • 字句解析器・構文解析器・AST・バイトコード生成器 など独立性が高くテストカバレッジも十分
  • 移植には Claude CodeやCodex などAIツールを活用
    • 人間が 移植範囲や順序・Rustコードの設計 を決定
    • 数百回の小さなプロンプトでAIを誘導しながら作業
  • 移植後は 複数のAIモデルでコードレビュー を実施し品質確保

移植結果と検証

  • Rust版・C++版でバイト単位まで完全一致の出力 を達成
  • 25,000行 のRustコードへの移植が 2週間で完了
    • 手作業なら数ヶ月かかる規模
  • ASTやバイトコードの完全一致 を確認
  • テストスイート(test262, Ladybird回帰テスト)でリグレッションゼロ
  • JSベンチマークでも性能劣化なし
  • C++/Rust両パイプライン同時実行でWebブラウジング検証 も実施
  • コードは 「C++から翻訳された」雰囲気 を強く残す設計
    • 互換性重視のため C++のレジスタ割当パターン等を模倣
    • 正確性と互換性が最優先
    • 将来的には Rustらしいリファクタリング も予定

今後の方針と開発体制

  • Rust移植はプロジェクトの主軸ではない
    • エンジン開発は 引き続きC++が中心
    • Rust移植は 長期的なサイドプロジェクト として進行
  • C++とRustの共存体制 を維持
    • 明確な 相互運用境界 を設けて新旧コードが共存
    • どの部分をどの順序で移植するかはコアチームが管理
  • 移植作業は必ずコアチームと調整 し、無駄な作業を防止
  • Ladybirdの将来を見据えた最善の選択 との自信

まとめ

  • 安全性・保守性・業界動向 を重視しRust導入を決断
  • 移植作業はAIと人間の協働で効率化
  • C++との互換性維持を最優先
  • 段階的な移行とチーム内調整の徹底
  • Ladybirdの未来を見据えた現実的な舵取り

Hackerたちの意見

面白いことに、編集されたタイトルには「AIの助けを借りて」が抜けてるね。

LLMを使ったコードベースの移行は、彼らにとってはかなり良いユースケースかもしれないね。面白いことに、著者はハンズオンのアプローチを提唱してる。 「AIの助けを借りて」を追加すると、ほぼ必ず「開発者はAIを取り入れなきゃダメ!」と「社会は雑なもので壊されてる!」という議論に devolve しちゃうから、そんなことが起きない限り、編集されたタイトルについて文句は言わないよ。

たぶん、これはクラシックなHackerNewsのタイトル短縮アルゴリズムが働いてるだけだね。

新しいコードについては、逆の方向に進むべきだと思う。「AIなしで完了」とかね。ソフトウェア開発に携わっている古いおじさんとして、たくさんの友達がシニア開発者として働いてる。彼ら全員、俺を含めてAIを使ってるよ。俺もどんどんAIを使うようになってる。例えば、「クラスA、B、Cをこういう名前で作って、これを状態遷移図として使って流れを理解して、モジュールXYZで宣言された特定のヘルパーを使って」って感じで。コードをテストして、最適でないパターンや好ましくないパターンを見直して、変更をお願いする。数回の反復の後、コードは通常輝くようになる。最終結果は、念のためにいくつかのLLMと照らし合わせて確認するよ。

結果がイディオマティックなRustじゃないのは分かってるし、C++のパイプラインを引退することに慣れたら、もっとシンプルにできることがたくさんあるよ。そのクリーンアップは時間が経てば来るだろうね。間違ってたら教えてほしいんだけど、これらの2つの言語は知らないからさ。他の言語と同じように、イディオマティックなやり方でやると全然違うことになるかも。ここでの「クリーンアップ」はかなりの重労働を意味してるのかな?それとも、もう一度ゼロから完全に書き直すことを意味するのかな?開発を何年も続けたスタートアップが言語を切り替えるのは、普通は大きな赤信号だよね。「Xで書き直してる」っていう投稿は、いつも「閉鎖します」っていう前触れだったし。でも、彼らに幸運を祈るよ!

これは、Joel on Softwareが昔のブログ投稿で話してた有名な罠だね。書き直しをすると、基本的に他のすべてを止めてしまうことになる。古い方で機能開発を続けている間に、別の「タイガーチーム」が書き直しをしていると、実質的にこの2つのチームは競争状態になって、ポートは決して追いつかない可能性が高いよ。(相対速度によるけど)もしかしたら、彼らはこのLLM支援ツールを一気にやってしまって、その後あまり時間をかけずに続けられると思ってるのかもね。

開発を何年も続けたスタートアップが言語を切り替えるのは、普通は大きな赤信号だよね。スタートアップは、ここでは良い比較対象じゃないよ。彼らはソフトウェアプロジェクトとは違ったコードとの関係を持ってる。Linuxは何度も全スタックを書き直してきたし、PHPエンジンも少なくとも2回は完全に書き直されてる。musl libcは基本的にゼロから全コンポーネントを書き直して、後で統合されたんだ。

まさにその通り!しばらくはFirefoxを使い続けることにするよ…

この場合の緩和要因は、C++とRustの両方がマルチパラダイム言語であることだね。ほとんどのC++のパターンをRustで合理的に表現できるけど、最初からRustを書くときとはちょっと違うかもしれないね。

何週間もかけて(おそらく)動いているコードをポーティングするのはちょっと変だよね。

翻訳にはClaude CodeとCodexを使ったよ。これは人間が指示したもので、自動生成ではない。何を移植するか、どの順番でやるか、Rustのコードがどうあるべきかを決めたんだ。数百の小さなプロンプトを使って、エージェントを必要な方向に誘導した。初期の翻訳の後、いくつかのモデルにコードのミスや悪いパターンを分析させるために、複数回の対立的レビューを行った。 > 最初からの要件は、両方のパイプラインからの出力がバイト単位で同一であることだった。結果は約25,000行のRustで、全体の移植には約2週間かかった。この作業を手作業でやってたら、数ヶ月かかってたと思う。Rustのパーサーが生成したASTはC++のものと完全に同一で、Rustコンパイラーが生成したバイトコードもC++コンパイラーの出力と同じだって確認済み。全体でリグレッションはゼロだよ。これが正しいやり方だね。コーディングアシスタントは、特に既存のテストがあるときに、一つの言語から別の言語への移植が得意なんだ。

これが、嫌なことを言う人たちが何を言おうとも、私たちがClaudeを使う方法だよ。「ただ作る」ってわけじゃなくて、設計して、レビューして、洗練させて、テストして、作るんだ。

同意だね。それに、AI企業がその使い方に注目してないのが本当に残念。みんな「人間を減らしてエージェントがもっとやる」方向に進んでるけど、俺が本当に求めてるのは、AIともっと密に連携できるためのツールなんだ。レビューや調整がしやすくなって、もっと関わりたい。単に「プロンプトを一発打って、なんとか動くコードが出る」なんてのは要らない。長時間のセッションに合わせたUXが欲しいし、俺のスキルを活かせるようにしてほしい。エージェントが俺ができることを真似するんじゃなくてね。昔から言われてることだけど、今こそ「人間の知性を拡張する」ことを目指すべきで、置き換えることじゃない。AIじゃなくてIA(知性の拡張)だよ。でも、こういうツールのターゲット市場はかなり小さくなるだろうね。基本的にソフトウェア開発を理解していて、自分が何をしたいか分かってる人が必要だし、今のAI企業はソフトウェアを作りたい非開発者を狙ってるみたいだし。結局、ノーコードの繰り返しだね。

自分もRustを学んでるんだけど、Claudeに全部コードを書かせるのは絶対に避けたかった。でも、ガイダンスが必要だったから、「teach」っていうClaudeのスキルを作ったんだ。それを有効にすると、Claudeはコードを書かないで、ヒントだけをくれる。詰まったら、徐々に詳細なヒントをくれるんだ。それから、俺が書いたものをレビューしてくれる。このやり方で作業するのがすごく満足感がある。特にRustは「適当にやる」余地があまりない言語だから、LLMがサポートしてくれるのは助かる。「今はこの型を宣言しない方がいいね。いくつかのライフタイムの問題が出てくるから、計画にメモを追加して後で見直そう」とかね。

かなり良い感じ。コードベースをGoからRustに移植するのに、書き直すのにかかる時間のほんの一部で済んだよ。

コーディングアシスタントは、ある言語から別の言語への移植も得意だよ。壊れた一回限りのPerlスクリプトがあって、みんながDrupalが未来だと思っていた頃の遺物なんだ(かなり前の話)。これは、メンテナンスされていない内部CMSからDrupalにサイトを移行するために設計されたものだった。CMSは古くて、「昔作ったものを見せる」ためだけにVMで動いてた(そのものを保持するために前の会社から書面で許可もらってたし)。冗談半分で、未宣言の依存関係や欠けているロジックのごちゃ混ぜをClaudeに渡して、全部をRustに移植するように頼んだんだ。80分間Drupalを調べて、機能するインポートツールを一発で作ってくれたよ。元のデザインやモジュール構造を完全に再現しただけでなく、古いコードコメントから見つけたヒントを基にいくつかのカスタムプラグインも実装してくれた。トークンを大量に消費したけど、10点満点中10点 - また無駄なコードを何万行も生成してほしいくらい。エピローグ:そのサイトはその後WordPressに移植され、次にProcessWireに、そしてNode.jsアプリとして再構築された。噂によると、今は何人かの不運な人たちがNext.jsに移植しようとしているらしい。

最新のモデルで個人プロジェクトを開発してて、オープンソースにしたら、ちょっと燃え尽きちゃったけど、めちゃくちゃ成功してるよ。手で書くのはもう無理だけど、声でプロンプトを書くのは楽しんでる。プロジェクトが見た中で最高のコードを出荷してる。革命は本物だよ。

「私たちはしばらくの間、LadybirdでC++の代わりになるメモリ安全なプログラミング言語を探してきました。この記事はその理由を説明していません。どんな問題が見つかっていて、どの「メモリ安全な言語」が助けられるのか?これらの問題は、別の言語を追加することでプロジェクトに複雑さを加える必要性を実際に説明していますか?AIが関与すると思いますが、プロジェクトの初期段階ではLadybirdに対する興味がかなり薄れると思います(少なくとも私にとっては)。

明らかなこと以外に何があるの?それはブラウザだよ。

明らかに問題がある以外に、「メモリ安全な言語」が助けられる問題は何ですか?それだけでは不十分な理由は?

ブラウザはセキュリティにめちゃくちゃ敏感なプロジェクトだよね。信頼できないコードをインターネットからダウンロードして実行するのが、そもそもの機能の一部なんだから!メモリの安全性が必要なところって、ブラウザ以外にないと思う。

自分は長年のRustファンだけど、どう反応すればいいのか全く分からない。特にLadybirdの開発者たちが「反Rust」だと声高に言ってるから、移行についてもっと情報が必要だと思ってる。ブラウザエンジンをRustで書くのが良いからじゃなくて、Ladybirdが今はCPP/Swiftを称賛していて、貢献者のスタンスが全く分からないから。少なくとも、自分の側からの貢献はずっとやりやすくなるだろうね。というのも、Ladybirdに対する自分のPRはCPPの経験がないせいでひどかったから。何をやってるのか全然分からなかった。

最近、Swiftを捨てたみたいだね。

TFAは「貢献者」のSwiftに対する立場について言及しているね。

Ladybirdは今、CPP/Swiftを褒めてるけど、もうそうじゃないよ。

ちょっと不安になってる。3つの言語にはそれぞれの良さがあって、長年にわたって開発されてきた安定した基盤があるんだよね。プログラミング言語が短期間で「変わった」っていうのは、むしろ方向性が変わったってことだから、Ladybirdのデザイン決定の全体的な継続性に自信が持てないな。

AIが普及した今、リファクタリングや「新しい言語で全部書き直す」という考え方はもう通用しないね。特に、テストスイートが充実している場合は。テストは今まで以上に重要になったよ。

まあ、AIツールが成熟するにつれて、現在のプログラミング言語は徐々に無意味になるという挑発的な立場にいるよ。いくつかのプロジェクトでは、iPaaS製品でエージェントを使ったローコードツールをすでに使ってる。

彼らに幸運を祈るけど、これはSafari/Chromeの二重独占に代わるブラウザを作ることに集中する代わりに、無駄なことをしているように感じる。

同意だね。彼らは2024年に錆は除外したって言ってたけど、確かその記事は2024年の終わり頃に出たと思う。最近読んだ記憶があるから。短期間で言語がたくさん変わるのはちょっと不安になるよね。そんなプロジェクトで働くのはすごく緊張すると思う。どの言語にも難しい部分があるし、「これじゃダメ」って気まぐれに決めると、時間とリソースが無駄になっちゃうよ。

彼がもうライブコーディングの動画を作ってないのは知ってるけど、アンドレアスがもうちょっとこの仕組みを見せてくれたらいいな。手作業でどれだけ修正しなきゃいけなかったのか、気になるんだよね(再プロンプトしたり、別のモデルを使ったりしたのと比べて)。

LibJSに関連するプルリクエストをチェックしてみてね。

以前はSwiftを探求してたけど、C++の相互運用性は結局うまくいかなかったし、Appleエコシステム以外のプラットフォームサポートも限られてた。なんでSwiftがApple以外で良いプラットフォームサポートを持つって期待があったんだろう?最初にSwiftに移行すると発表したときには、もう明らかだったはずなのに。

これを見てすごく嬉しい!レディバードのエンジニアリングは一般的に素晴らしいと思うけど、Swiftを使うって決めたのはちょっと「突飛」な感じがしてた。Rustの方がずっと理にかなってるね。