ZJIT(Zee JIT)は、Ruby 4.0に搭載された次世代のJITコンパイラだ。現時点ではexperimental扱いだが、Ruby 4.1での本番対応を目標に開発が続いている。


JITとは何か

Rubyは通常、インタープリタがコードを1行ずつ読み取って実行する。柔軟ではあるが、毎回「読んで解釈して実行」を繰り返すのでオーバーヘッドが生じる。

JIT(Just-In-Time コンパイラ) はこれを改善する仕組みだ。

Rubyコード
  ↓ 何度も呼ばれるメソッドを検出
  ↓ そのメソッドだけ機械語(CPUが直接実行できるコード)に変換
  → 次回からは高速な機械語で実行

料理で言えば、毎回レシピを見ながら作る(インタープリタ)のではなく、よく作る料理の手順を完全に暗記して手早く仕上げる(JIT)イメージだ。


YJITからZJITへ

ZJITの前身は YJIT(Ruby 3.1〜)だ。ShopifyとRubyコアチームが共同で開発し、Ruby 2.7比で約20%の速度改善を達成した。Shopify・Discourse・Mastodonなどでは最大30%の速度向上が報告されている。

しかしYJITはパフォーマンスの頭打ちに近づいており、さらなる改善のために新しいアーキテクチャが必要になってきた。それがZJITだ。

YJIT ZJIT
コンパイル単位 基本ブロック単位 メソッド全体
中間表現 なし(直接機械語) SSA-IR(最適化しやすい形式)
最適化の余地 限界に近い より大きな改善が見込める

SSA-IR(Static Single Assignment Intermediate Representation) とは、各変数への代入が1回しか行われないという制約を持つ中間表現だ。この形式にすることで、デッドコード除去・定数畳み込みといった最適化パスを適用しやすくなる。


Ruby 4.0でのZJITの現状

ZJITはRuby 4.0のバイナリにデフォルトでコンパイルされているが、実行時には有効になっていない。パフォーマンスと安定性の観点から、Ruby 4.0ではYJITが依然としてデフォルトのコンパイラだ。

試したい場合は以下のどちらかで有効化できる。

# フラグで有効化
ruby --zjit my_script.rb

# 環境変数で有効化
RUBY_ZJIT_ENABLE=1 ruby my_script.rb

Ruby 4.0時点ではZJITはインタープリタよりは速いが、YJITほどの速度にはまだ達していない。実験的な利用は推奨されているが、本番環境へのデプロイは現時点では控えることが推奨されている。


まとめ

ZJIT = 次世代のRuby高速化エンジン
・Ruby 4.0に搭載(experimental)
・メソッド全体をコンパイル単位とし、SSA-IRで最適化
・今はYJITの方がまだ速い
・Ruby 4.1でYJITを超えることを目標に開発中
・普通のRailsアプリ開発者は今すぐ意識しなくてOK

参考文献・リンク

https://railsatscale.com/2025-02-10-zjit-a-new-ruby-jit/

https://bugs.ruby-lang.org/issues/21172

https://github.com/ruby/ruby/tree/master/zjit

https://www.ruby-lang.org/en/news/2025/12/25/ruby-4-0-0-released/