- Ruby 4.0.0 が公開され、新しい Ruby Box と ZJIT を導入し、多数の性能および言語面の改善を含む
- Ruby Box は、クラス、モジュール、グローバル変数、ネイティブ/Ruby ライブラリ定義を 隔離実行 できる実験的機能
- ZJIT は Rust ベースの次世代 JIT コンパイラ で、従来の YJIT より構造的に拡張しやすく、外部からの貢献を容易にする
- Ractor 並列実行モデル は安定性と性能の面で改善され、今後 experimental 状態を解除する予定
- コアクラス、標準ライブラリ、C API、GC、JIT など全般にわたる更新により、Ruby エコシステムの性能と拡張性 を強化
Ruby 4.0 概要
- Ruby 4.0.0 は Ruby Box と ZJIT を中心とした大規模アップデート版
- 並列実行、言語構文、標準ライブラリ、GC、JIT などさまざまな領域で改善を含む
- ダウンロードは
.tar.gz, .tar.xz, .zip 形式で提供
Ruby Box
- Ruby Box は定義の隔離を提供する 実験的機能
- 環境変数
RUBY_BOX=1 を設定すると有効化され、クラスは Ruby::Box
- ボックス内部でロードされた定義は外部と隔離され、monkey patch、グローバル/クラス変数、クラス/モジュール定義、ライブラリ変更が他のボックスに影響しない
- 主な利用例
- テストケース間の 隔離実行
- ブルーグリーンデプロイ のための並列 Web アプリ実行
- 依存関係更新の検証用並列実行
- 今後、高水準の「パッケージ API」実装の基盤 API として活用予定
ZJIT
- ZJIT は YJIT の次世代版として開発された 新しい JIT コンパイラ
- Rust 1.85.0 以上が必要で、
--zjit オプションで有効化
- SSA IR ベースのより大きなコンパイル単位をサポートし、外部からの貢献を促進する構造
- 現在はインタプリタより速いが、YJIT よりは遅い
- 本番利用は推奨されず、Ruby 4.1 で性能向上予定
Ractor 改善
- Ractor::Port クラス追加によりメッセージ送受信の問題を解決
Ractor.shareable_proc により Ractor 間での Proc オブジェクト共有が容易に
- 内部データ構造の改善により グローバルロック競合を削減 し、並列性を向上
- Ractor の experimental 状態は 来年解除予定
言語変更
*nil はもはや nil.to_a を呼び出さない(**nil と同じ動作)
- 論理演算子(
||, &&, and, or)が 行継続(dot chaining) 構文をサポート
- コードの可読性と一貫性が向上
コアクラス更新
- Array:
Array#rfind, Array#find を追加し、効率的な探索をサポート
- Binding: 番号付きパラメータの除外と
implicit_parameters 関連メソッドを追加
- Enumerator:
produce に size: キーワード引数を追加
- ErrorHighlight:
ArgumentError 発生時に呼び出し元・定義部のコードスニペットを表示
- Fiber/Fiber::Scheduler:
raise(cause:), fiber_interrupt, yield などを追加
- File: Linux で
File::Stat#birthtime をサポート
- IO:
Float::INFINITY タイムアウトを許可、パイプベースのプロセス生成を削除
- Kernel:
#inspect をカスタマイズ可能にし、Kernel#open のパイプ生成を削除
- Math:
log1p, expm1 を追加
- Pathname: default gem から コアクラス に昇格
- Proc: 匿名パラメータの出力形式を統一
- Ractor:
Ractor::Port ベースの通信構造に変更し、Ractor.yield などを削除
- Set: コアクラスに昇格し、
inspect 形式を簡素化
- Socket:
open_timeout 引数を追加し、タイムアウト例外を統一
- String: Unicode 17.0.0、Emoji 17.0 をサポートし、
strip 系メソッドを拡張
- Thread:
raise(cause:) 引数をサポート
標準ライブラリ(Stdlib)更新
- default gem へ昇格:
ostruct, pstore, benchmark, logger, rdoc, win32ole, irb, reline, fiddle など
- default gem 追加:
win32-registry 0.1.2
- default gem 更新:
RubyGems 4.0.3, bundler 4.0.3, openssl 4.0.0, json 2.18.0 など
- bundled gem 更新:
minitest 6.0.0, rake 13.3.1, rbs 3.10.0, debug 1.11.1 など
- RubyGems/Bundler 4 を含む
プラットフォームサポート
- Windows: MSVC 14.0 未満のバージョンのサポートを終了(Visual Studio 2015 以上が必要)
互換性変更
Ractor.yield, Ractor#take, Ractor#close_incoming, Ractor#close_outgoing を削除
ObjectSpace._id2ref を廃止予定
Process::Status#&, #>> を削除
- 内部フレーム(backtrace)出力を簡素化
ArgumentError のバックトレースに レシーバのクラス/モジュール名を表示
標準ライブラリ互換性
- CGI ライブラリを削除 し、
cgi/escape のみ維持
Set のコア昇格により、SortedSet は別途 gem のインストールが必要
Net::HTTP の自動 Content-Type ヘッダ設定を削除
C API 更新
rb_thread_fd_close を無効化し、rb_io_close の使用を推奨
rb_thread_call_with_gvl は GVL の有無に関係なく動作
- Set 用 C API を追加(
rb_set_new, rb_set_add, rb_set_delete など)
実装および性能改善
Class#new 呼び出し速度を向上、特にキーワード引数使用時
- GC ヒーププールの独立成長によりメモリ使用量を削減
- 大型オブジェクトのスイープ速度を向上
object_id, hash 計算およびインスタンス変数アクセスを最適化
- Ractor 性能改善
- ロックレスハッシュ構造、キャッシュ競合の削減、オブジェクト割り当ての最適化
- デッドロック、エンコーディング、GC 関連バグを修正
JIT 関連
- ZJIT: メソッドベース JIT、Rust 1.85.0 以上が必要、
--zjit または RubyVM::ZJIT.enable で有効化
- YJIT: 統計オプションを変更し、
mem_size: および call_threshold: を追加
- RJIT:
--rjit を削除し、別リポジトリへ移行
変更規模
- Ruby 3.4.0 と比較して 3,889 ファイル変更, 230,769 行追加, 297,003 行削除
- Ruby 4.0 は 性能、並列性、言語の一貫性 を大幅に強化したメジャーリリース
ダウンロード
ruby-4.0.0.tar.gz, ruby-4.0.0.tar.xz, ruby-4.0.0.zip 形式で提供
- 各ファイルの SHA1, SHA256, SHA512 ハッシュ値 を明記
Ruby 紹介
- Ruby は 1993 年に まつもとゆきひろ(Matz) が開発したオープンソース言語
- マルチプラットフォームで動作し、特に Web 開発分野で世界的に利用 されている
1件のコメント
Hacker Newsのコメント
Ruby、誕生日おめでとう!
よく「Ruby は型付けがないから離れた」と言われるけど、今では RBS が標準として定着しつつある。Sorbet もこれをサポートしているし、コードの横にそのまま型を書ける inline notation も登場した。
また「Ruby は LSP が弱い」という話ももう昔のことだ。ruby-lsp が標準になり、「go to definition」もサポートしている。プラグインアーキテクチャのおかげで、複数のツールが同じ AST を再利用できる。
並行性も Ractor のおかげでかなり改善されていて、あとは GC をもう少し磨けば、完全に実験段階を脱せそうだ。
ZJIT や Box のような新機能もあるが、まだ本番環境では推奨されていない。それでも着実に良くなっている。
文法が急激に変わらないのも良い点だと思う
クリスマスにはやっぱり新しい Ruby のバージョンが出るべきだ。
今回は ruby::box が興味深い。機能のロールアウトを 2 つのバージョンで同時に回せるようにしてくれる。
それに、複数行にまたがって
if condition1 && condition2を書けるようになったのもかなり良いif condition1 && condition2を複数行で書いていたけど、普通に動いていた。新しい構文が何が違うのか分からないRuby 4.0 のリリースはうれしいが、2025 年に自分は完全にPython へ移行した。
Claude Code が自分の Ruby プロジェクトを 100% Python に自動変換してくれて、それ以来 Ruby を使う理由がなくなった。
10 年以上 Ruby を愛して本まで書いたけれど、今では fastapi、pytorch、langchain、streamlit といったエコシステムのおかげで Python の勝ちだ。それでも Ruby の文法は今でも最も美しいと思っている
クリスマスに新しい Ruby のバージョンはやはり欠かせない。Matz とチームに感謝したい
2025〜26 年に Ruby を学ぼうとしている人に勧められる最新の資料はあるだろうか? 公式ドキュメント以外で良い本が知りたい
Pragmatic Studio Ruby on Rails 講座
Ruby は本当に素晴らしい言語だ。最近、Rails の上に Markdown ファイル 1 つで API を生成するレイヤーを作ったのだが、Python で同じことをやるならずっと複雑になっていただろう。JavaScript ならもっとひどかったはずだ。Ruby のメタプログラミング能力は本当に唯一無二だ
内部スタックトレースが整理されたのはうれしい。いつか相対パスもサポートされるといい。それに Set がついにちゃんと扱われるようになったのも良い
今は Ruby を使わない会社で働いているが、それでも Ruby を深く愛している。今回のリリースに感謝したいし、また使う機会が来ることを願っている
以前、Ruby::Box(名前空間)機能が深刻な性能低下を引き起こすと聞いたことがあるが、今回は改善されたのだろうか
ツール周りが改善されたのか知りたい。Windows で LSP をまともに動かせたことがまだない