Bun は、JavaScript や TypeScript を速く動かすための実行環境です。
ざっくり言うと「Node.js の代わりになる、軽くて速い新世代ランタイム」の一角ですね。
今回のPRは、その Bun を Rustで書き換えた というものです。
これ、ひと言で言うと「家の中身をほぼ丸ごと、別の素材で作り直した」くらいの大工事です。普通に考えてかなり無茶です。しかも、ただの実験ではなく、既存のテストを通し、サイズも小さくし、速度も維持または改善しているというのが面白いところです。
正直、この手の話は「え、本当にそんなことできるの?」とまず思います。
でも、PR本文を見る限り、少なくとも今回の段階ではかなり筋の良い成果が出ているようです。
Rust は、メモリ安全性を強く意識した言語です。
メモリ安全性というのは、ざっくり言うと「使い終わったはずの領域を触って壊す」「解放し忘れる」「変な参照で落ちる」といった事故を起こしにくくする仕組みです。
JavaScript のランタイムや高速化エンジンのような低レベル寄りのコードでは、こうしたバグが本当に厄介です。
しかも一度入ると、再現しにくかったり、環境によって出たり消えたりして、デバッグに時間を吸われます。
今回のPRでは、まさにその点が強調されています。
「compiler-assisted tools for catching & preventing memory bugs」
つまり、コンパイラが助けてくれる形でメモリバグを検出・予防できるようになった、ということです。
個人的には、ここが一番大きいと思います。
性能の向上ももちろん嬉しいですが、巨大な基盤ソフトウェアにとって本当に怖いのは、速度よりも保守のしんどさだからです。
速いけど壊れやすい、という状態は長期的にはかなり苦しい。Rust化は、そのしんどさを減らす方向の投資に見えます。
PR本文によると、変更後の Bun は、コードベース自体は大きく変わっていないとのことです。
この「大きくは変えていない」がポイントです。
つまり、Rust で書いたからといって設計思想まで別物にしたわけではなく、まずは土台の言語だけを置き換えた感じに近いです。
これはかなり堅実な進め方だと思います。
一気に設計まで変えると、何が良くなって何が悪くなったのか分からなくなるからです。
その点、今回は「同じ設計のままRustに移植して、言語の恩恵を確認する」という、検証しやすい進め方に見えます。
PR本文では、次のような成果が述べられています。
Bun の既存テストスイートが、全プラットフォームで通ったとのことです。
これは地味にすごいです。というのも、基盤ソフトの書き換えで一番怖いのは「動いているように見えるけど、細かいところが壊れている」状態だからです。
memory leak は、使い終わったメモリをきちんと返さず、少しずつメモリを食い続ける問題です。
flaky tests は、同じテストなのに成功したり失敗したりする不安定なテストです。
これらが改善されたのは、Rust化の恩恵としてかなり納得感があります。
Rust はこういう「うっかり」を減らしやすいので、性能だけでなく品質面でも効いてきます。
binary size は、配布される実行ファイルのサイズです。
これが 3MB〜8MB 小さくなった とのこと。
たった数MBと思うかもしれませんが、CLIツールやランタイムでは結構効きます。
ダウンロードが速くなる、配布が軽くなる、起動周りにも好影響が出る可能性がある。
こういう「派手じゃないけど効く改善」は、実はとても価値があります。
benchmarks は性能測定です。
結果は neutral to faster、つまり「同等か、それより速い」。
Rust化すると安全性は上がるけど遅くなるのでは、という心配は当然あります。
でも少なくともこの段階では、速度を大きく犠牲にしていないどころか、むしろ改善しているのが面白いところです。
PR本文には、まだ次の作業が残っていると書かれています。
つまり、これは「完全に終わった話」ではありません。
まず canary 版で試して、問題を見つけながら進める段階です。
ここはとても現実的で好感が持てます。
大規模な基盤の書き換えは、リリースを急ぐより、段階的に出してユーザーからのフィードバックを拾う方がずっと安全です。
勢いで全部入れるより、ずっと賢い進め方だと思います。
PR本文では、試すには次のコマンドを案内しています。
bun upgrade --canary
つまり、安定版ではなく、canary版 で先行的に試せるようです。
canary は「先取り版」「実験版」くらいの理解で大丈夫です。
新機能や大きな変更を早めに入れて、問題がないか確かめるためのチャンネルですね。
もし試して問題があれば issue を出してほしい、という呼びかけもあります。
率直に言うと、これはかなり刺激的なニュースです。
Bun はもともと「速さ」で注目されてきたプロジェクトですが、そのBunが今度はRustでさらに土台を固める方向に進んでいる。
しかも、単なる言語マニア向けの話ではなく、メモリバグの減少・ファイルサイズ縮小・速度維持という、実利がちゃんと出ています。
個人的には、「Rustだから正義」という話ではなく、大きなソフトウェアを長く運営するための現実的な選択肢としてRustが効いている、という見え方がいちばんしっくりきます。
流行りの言語を使った、というより、痛いところを減らすための技術選択に見えるのが良いです。
一方で、こういう大規模移植は「できた瞬間がゴール」ではありません。
本当の勝負は、その後の保守です。
Rust にしたことで安全性は上がっても、開発者全員がその書き方に慣れているわけではないかもしれませんし、既存の知識やツールとの折り合いもあります。
また、PR本文でも触れられている通り、最適化やcleanupはまだ途中です。
なので、私はこれを「勝利宣言」ではなく、かなり有望な中間報告として見るのが正しいと思います。
Bun の「Rustで書き換える」PRは、かなり大胆なのに、内容は意外なほど堅実です。
既存テストを通し、メモリリークや不安定テストを減らし、バイナリサイズも縮小し、性能も同等以上。
しかも設計は極力変えず、Rust の安全性だけをきっちり取り込もうとしているのが印象的でした。
こういう話を見ると、Rust は「速いけど難しい言語」以上に、大きな基盤ソフトを壊しにくくするための武器なんだな、と改めて感じます。
Bun がこのままどこまで安定性と速度を両立させるのか、かなり楽しみです。
参考: Rewrite Bun in Rust by Jarred-Sumner · Pull Request #30412 · oven-sh/bun