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=1」を指定することで有効化でき、クラス名は「Ruby::Box」となる。
Boxの中で読み込まれた定義はそのBox内に閉じた状態となる。隔離できる定義は以下の通り。
Ruby Boxの主要なユースケースとしては、以下の内容が想定されている。
ZJITは「YJIT」の次世代として開発された新しいJITコンパイラだ。ZJITサポート付きでRubyをビルドするには「Rust 1.85.0」以降が必要で、オプション「--zjit」を指定すると有効になる。
新しいコンパイラを開発した背景には、パフォーマンスの上限を引き上げつつ、より一般的な設計であるメソッドコンパイラにすることで、外部からの貢献を促進したいという狙いがある。具体的には、より大きなコンパイル単位サイズとSSA IR(代入を1回に制限したコンパイラ向け中間表現)が導入された。
現時点のZJITは通常のRubyインタープリタより高速だが、まだYJITほどの速度には達していない。開発チームは「Ruby 4.1」での性能向上に意欲を示しており、現時点では本番環境へのデプロイは控えるよう案内している。
Rubyで簡単に並列処理を行うための「Ractor」に多くの改善が行われた。同期機構として「Ractor::Port」クラスが追加され、メッセージの送受信に関する問題が解決された。「Ractor.shareable_proc」の導入により、ProcをRactor間で共有しやすくなっている。
性能面では、データ構造の改善によりグローバルロックに対する競合が大幅に減少し、並列処理性能が向上した。Ractor間で共有するデータを減らすことで、並列実行時のCPUキャッシュの衝突も軽減されている。
RactorはRuby 3.0で実験的機能として導入されたが、開発チームは2026年ごろには実験的ステータスを外したい考えだ。
言語仕様については、以下の変更が行われた。
主要なクラスの更新は以下の通り。
「array.reverse_each.find」より効率的な代替として「Array#rfind」を追加した。「Enumerable#find」をより効率的に実行する「Array#find」も追加されている。
「Binding#local_variables」などのメソッドが番号付きパラメーターを含めなくなった。番号付きパラメーターおよび「it」パラメーターにアクセスするための「Binding#implicit_parameters」などが追加されている。
「Enumerator.produce」がオプションのキーワード引数「size」を受け付けるようになった。サイズには整数、Float::INFINITY、ラムダなどの呼び出し可能オブジェクト、または不明を示すnilを指定できる。
ArgumentErrorが発生した際に、メソッド呼び出し側(caller)とメソッド定義側(callee)の両方のコードスニペットを表示するようになった。
「Fiber#raise(cause:)」引数をサポートした。スケジューラ関連では、指定した例外でファイバーを中断する「Fiber::Scheduler#fiber_interrupt」や、シグナル例外が無効なときでも処理を続行できる「Fiber::Scheduler#yield」などが追加された。
「Kernel#inspect」は「#instance_variables_to_inspect」メソッドの有無を確認し、表示するインスタンス変数を制御できる。パイプ(|)で始まる「Kernel#open」によるプロセス生成という非推奨挙動が削除された。
「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行が削除された。
Rubyは「みんなのプロジェクト」 まつもとゆきひろ氏が振り返るRubyとコミュニティーの30年
ひろゆきの予測「SIerは衰退する」 AIが変えるエンジニア採用
PythonでもTypeScriptでもない、2025年「最も人気のプログラミング言語」Copyright © ITmedia, Inc. All Rights Reserved.