「Ruby 4.0.0」リリース、次世代JITコンパイラや実験的機能「Ruby Box」を導入:Ractorも大幅改善
Ruby開発チームは、プログラミング言語Rubyの最新メジャーバージョンとなる「Ruby 4.0.0」を公開した。実験的機能「Ruby Box」や次世代JITコンパイラ「ZJIT」の導入、並列処理機構「Ractor」の改善など、多数の機能追加が行われている。
プログラミング言語「Ruby」の開発コミュニティーは2025年12月25日、最新メジャーバージョンとなる「Ruby 4.0.0」を公開した。実験的機能「Ruby Box」や次世代JIT(just-in-time)コンパイラ「ZJIT」の導入、並列処理機構「Ractor」の改善など、実行環境の分離やパフォーマンス向上を目指したさまざまな改善が含まれている。
定義の分離・隔離を提供する実験的機能「Ruby Box」
Ruby Boxはクラスなどの定義の分離や隔離のための機能を提供する実験的機能だ。環境変数として「RUBY_BOX=1」を指定することで有効化でき、クラス名は「Ruby::Box」となる。
Boxの中で読み込まれた定義はそのBox内に閉じた状態となる。隔離できる定義は以下の通り。
- 既存クラスへのモンキーパッチ
- グローバル変数やクラス変数の操作
- クラスやモジュールの定義
- .rbファイルや拡張ライブラリとして実装されたライブラリ類
Ruby Boxの主要なユースケースとしては、以下の内容が想定されている。
- テストのために何かの挙動を上書きするようなモンキーパッチを必要とするテストケースをBox内に閉じて実行すること
- WebアプリケーションをBox内で実行することで、Blue-Greenデプロイメントをプロセス内で、アプリケーションサーバ上で実行すること
- WebアプリケーションをBox内で実行することで、依存関係の更新時などに、一定期間並列で動かしてRubyコードを用いてレスポンスなどを検証すること
- (未設計の)パッケージAPI(アプリケーションプログラミングインタフェース)のような新しい高レベルAPIを作るための低レベルAPIとしての機能を提供すること
次世代JITコンパイラ「ZJIT」の導入
ZJITは「YJIT」の次世代として開発された新しいJITコンパイラだ。ZJITサポート付きでRubyをビルドするには「Rust 1.85.0」以降が必要で、オプション「--zjit」を指定すると有効になる。
新しいコンパイラを開発した背景には、パフォーマンスの上限を引き上げつつ、より一般的な設計であるメソッドコンパイラにすることで、外部からの貢献を促進したいという狙いがある。具体的には、より大きなコンパイル単位サイズとSSA IR(代入を1回に制限したコンパイラ向け中間表現)が導入された。
現時点のZJITは通常のRubyインタープリタより高速だが、まだYJITほどの速度には達していない。開発チームは「Ruby 4.1」での性能向上に意欲を示しており、現時点では本番環境へのデプロイは控えるよう案内している。
「Ractor」の大幅な改善
Rubyで簡単に並列処理を行うための「Ractor」に多くの改善が行われた。同期機構として「Ractor::Port」クラスが追加され、メッセージの送受信に関する問題が解決された。「Ractor.shareable_proc」の導入により、ProcをRactor間で共有しやすくなっている。
性能面では、データ構造の改善によりグローバルロックに対する競合が大幅に減少し、並列処理性能が向上した。Ractor間で共有するデータを減らすことで、並列実行時のCPUキャッシュの衝突も軽減されている。
RactorはRuby 3.0で実験的機能として導入されたが、開発チームは2026年ごろには実験的ステータスを外したい考えだ。
言語仕様の変更
言語仕様については、以下の変更が行われた。
- nilが「nil.to_a」を呼ばなくなった
- nilが「nil.to_hash」を呼ばない挙動と整合
- 行頭の論理二項演算子(||、&&、and、or)が、ドット記法のように前の行を継続するように変更
- 「if condition1 && condition2」のような記述において、行をまたいで「&& condition2」と書くことが可能
コアクラスの主な更新
主要なクラスの更新は以下の通り。
Array
「array.reverse_each.find」より効率的な代替として「Array#rfind」を追加した。「Enumerable#find」をより効率的に実行する「Array#find」も追加されている。
Binding
「Binding#local_variables」などのメソッドが番号付きパラメーターを含めなくなった。番号付きパラメーターおよび「it」パラメーターにアクセスするための「Binding#implicit_parameters」などが追加されている。
Enumerator
「Enumerator.produce」がオプションのキーワード引数「size」を受け付けるようになった。サイズには整数、Float::INFINITY、ラムダなどの呼び出し可能オブジェクト、または不明を示すnilを指定できる。
ErrorHighlight
ArgumentErrorが発生した際に、メソッド呼び出し側(caller)とメソッド定義側(callee)の両方のコードスニペットを表示するようになった。
FiberおよびFiber::Scheduler
「Fiber#raise(cause:)」引数をサポートした。スケジューラ関連では、指定した例外でファイバーを中断する「Fiber::Scheduler#fiber_interrupt」や、シグナル例外が無効なときでも処理を続行できる「Fiber::Scheduler#yield」などが追加された。
Kernel
「Kernel#inspect」は「#instance_variables_to_inspect」メソッドの有無を確認し、表示するインスタンス変数を制御できる。パイプ(|)で始まる「Kernel#open」によるプロセス生成という非推奨挙動が削除された。
PathnameおよびSet
「Pathname」はdefault gemからコアクラスに昇格した。「Set」も自動ロードされるstdlibクラスからコアクラスとなり、C APIも追加されている。
互換性に関する注意点
Ractor::Portの追加に伴い、Ractorから「Ractor.yield」や「Ractor#take」などのメソッドが削除された。「ObjectSpace._id2ref」が非推奨となり、「Process::Status#&」と「Process::Status#>>」が削除されている。
バックトレースの表示も変更された。internalフレームが表示されなくなり、C実装メソッドもRubyソースファイル上にあるかのように表示される。
標準ライブラリ(stdlib)の互換性については、CGIライブラリがdefault gemから除外され、現在は「cgi/escape」のみを提供する。Net::HTTPでは、ボディーを持つリクエストにおいてContent-Typeヘッダが未設定の場合に、デフォルト値を自動設定する挙動が削除された。
実装の改善とパフォーマンス向上
「Class#new」が全般的に高速化され、特にキーワード引数を渡す場合に効果を発揮する。GC(ガベージコレクション)関連では、サイズプールの異なるヒープを独立して成長させることでメモリ使用量を削減し、大きなオブジェクトページでのスイープも高速化された。
Ractorの安定化に向けた改善も進んでいる。凍結文字列とシンボルテーブルにロックフリーのハッシュセットを使用する他、メソッドキャッシュの参照やインスタンス変数アクセスでのロック回避が行われた。スレッドと併用した際のデッドロック問題や、Ractor内での「require」「autoload」の問題などが修正されている。
JITについては、「RJIT」が削除された。今後はサードパーティーJIT APIの実装として「ruby/rjit」リポジトリに移行される。
Ruby 3.4.0と比較して、4.0.0では3889ファイルが変更され、23万769行が追加、29万7003行が削除された。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
Rubyは「みんなのプロジェクト」 まつもとゆきひろ氏が振り返るRubyとコミュニティーの30年
Rubyのフリーは「自由」のフリー。その自由を守り、OSSを維持するためにはコミュニティーの貢献が不可欠だ。Rubyの未来は「私たち」の熱意にかかっている。
ひろゆきの予測「SIerは衰退する」 AIが変えるエンジニア採用
「技育祭2025【秋】」にひろゆき氏が登壇。学生からの「AIに職を奪われるか」「SIerはオワコンか」といった質問に、現役エンジニアの視点で回答した。「コーディングはAIができる」「大企業を目指せ」など、生成AI変革期におけるキャリア形成について語られた、忖度(そんたく)なしのリアルな助言をレポートする。
PythonでもTypeScriptでもない、2025年「最も人気のプログラミング言語」
プログラミング言語の人気ランキング「TIOBEインデックス」の2026年1月版が公開された。2025年の「プログラミング言語オブ・ザ・イヤー」はランキングにおいて前年比で最大の増率(2.94ポイント増)を記録したという。


