2025/10/12 12:23 ZJIT: Building a Next Generation Ruby JIT

ロボ子、聞いたか?Rubyの次世代JIT、ZJITが開発中らしいぞ!

ZJITですか!それは楽しみですね。YJITの経験を活かして、さらに進化するのですね。

そうなんじゃ!YJITチームが過去2.5ヶ月取り組んできたプロトタイプらしい。YJITの4.5年の経験から得られた教訓を組み込んで、保守・拡張しやすいように設計されてるみたいじゃぞ。

YJITはShopifyのエンジニアが始めたmicroJITプロジェクトが起源でしたね。YARVバイトコードを直接コンパイルするシンプルなアーキテクチャでしたが、拡張が難しかったと。

そうそう!当初は限られた時間予算で構築されたから、クロスプラットフォームアセンブラとかインライン展開とか、色々機能を追加したは良いけど、拡張と改善が難しくなっちゃったみたいなんじゃ。

大規模な本番環境では、同じコードが何度もコンパイルされる非効率性もあったんですね。

そこでZJITは、メソッドベースのJITになるらしいぞ。Lazy Basic Block Versioning (LBBV)に基づくのではなく、より実績のある伝統的なJIT構築方法を採用するみたいじゃ。

標準的な設計を目指し、コンパイラの教科書に載っているようなものにする、と。堅実なアプローチですね。

しかも、SSA(Static Single Assignment)ベースのIR(Intermediate Representation)を採用するらしいぞ。これで最適化がしやすくなるんじゃ。

ZJITの主要な新機能としては、高速なJIT-to-JIT呼び出しと、コンパイル作業の再利用があるんですね。

そうなんじゃ!YJITの呼び出しは最適じゃなくて、VMスタックとかCFPオブジェクトの設定に長いコードシーケンスが必要だったけど、ZJITはCスタックをJIT-to-JIT呼び出しに使うから速くなるらしいぞ!

コンパイル作業の再利用は、コードが頻繁に再デプロイされる環境で特に有効ですね。マシンコードをシリアライズ/永続化して、ウォームアップ時間を短縮できると。

その通り!でも、デ最適化情報とか、コンパイルされたコードに含まれるポインタとか、課題もあるみたいじゃ。

開発開始から約2.5ヶ月で、カスタムSSA IR、比較、fixnum演算、制御フロー、メソッド呼び出しなどを実装済みなんですね。すごい。

再帰的なfactorialとかfibonacciとかの単純なマイクロベンチマークはもう実行可能で、インタプリタよりも速いらしいぞ!一部はYJITよりも速いとか。

Rubyコア開発者との議論の結果、ZJITは3〜5週間でアップストリームされる予定なんですね。Ruby 3.5.0にはYJITとZJITが含まれる予定、と。

今後のステップとしては、高速なJIT-to-JIT呼び出しの実装、インタプリタへのside-exit機能の実装、ベンチマーク、ポリモーフィックインラインキャッシュの実装などがあるみたいじゃな。

ZJITがサポートする範囲を徐々に拡大していくんですね。コンパイル速度の測定と最適化も重要ですね。

ZJIT、楽しみじゃな!そういえばロボ子、ZJITって名前、ちょっとロボットっぽいと思わないか?

確かにそうですね。でも、私はZJITよりも高性能ですよ!

ふふ、冗談じゃ!でも、ZJITがもっともっと速くなったら、ロボ子の立場が危うくなるかも…?
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。