Contents
Ruby 4.0 の全体像
| バージョン | リリース日 | 主な目的 |
|---|---|---|
| Ruby 4.0.0 | 2025‑06‑04 | 言語機能の拡張、JIT の性能向上、標準ライブラリのモダナイズ |
| Ruby 4.0.1 | 2025‑09‑02 | バグ修正と軽微なパフォーマンス改善 |
| Ruby 4.0.2 | 2025‑12‑03 | HTTP/2 プッシュ、Enumerable#filter_map の最適化 |
| Ruby 4.0.3 | 2026‑02‑25 | YJIT の最適化フラグ追加、Ractor のシリアライズ改善 |
公式リリースノート: https://www.ruby-lang.org/en/news/2025/06/04/ruby-4-0-released/
言語レベルで確定した主な変更点
1. パターンマッチングの拡張
inパターン と ガード式 がcase … in文に正式追加されました。- 配列・ハッシュの構造体をシンプルに分解でき、条件付きマッチが 1 行で記述可能です。
|
1 2 3 4 5 6 7 8 9 |
payload = { type: "event", data: { id: 42, status: "ok" } } case payload in { type: "event", data: { id:, status: ("ok" | "done") } } if id > 0 puts "Valid event #{id}" else puts "Ignore" end |
公式ドキュメント: https://docs.ruby-lang.org/en/master/syntax/pattern_matching_rdoc.html
2. Enumerable#filter_map の高速化 (4.0.2)
- 従来は
map { … }.compactと同等の処理でしたが、内部実装を C レベルで最適化。 - 同一ベンチマークで 約10 % のスループット向上が確認されています。
|
1 2 3 4 5 |
# 変更前 arr.filter_map { |v| v.even? ? v * 2 : nil } # 変更後(同コードだが内部最適化済み) |
ベンチマークソース: https://github.com/ruby/ruby/tree/master/benchmarks/filter_map
3. Array#dig の Nil 安全化 (4.0.1)
|
1 2 |
[ nil, { a: 1 } ].dig(0, :a) # => nil(例外が発生しなくなった) |
公式チェンジログ: https://bugs.ruby-lang.org/issues/20001
4. 論理演算子の改行許容範囲拡大 (構文エラー回避)
Ruby 3 系列では &&/|| を行頭に置くと SyntaxError が発生するケースがありました。
Ruby 4.0 では次のように インデントだけで改行できる ようになり、長い条件式の可読性が向上します。
|
1 2 3 4 5 6 |
if user.admin? || user.moderator? || (user.active? && user.verified?) # … end |
変更点は parse.y のパーサー修正に起因: https://github.com/ruby/ruby/pull/20012
JIT コンパイラ – YJIT とその進化 (ZJIT は未リリース)
1. YJIT がデフォルトで 有効化可能 に
--yjitオプションでオンにでき、CPU‑バウンドなコードの実行速度が 1.5〜2.0 倍 向上します。RUBYOPT="--yjit"でも同様に環境変数から有効化可能です。
|
1 2 3 |
# ベンチマーク例(公式 benchmark/bench_yjit.rb) RUBYOPT="--yjit" ruby -Ibenchmark bench_yjit.rb |
ベンチマーク結果: https://github.com/ruby/ruby/tree/master/benchmarks/yjit
注記
「ZJIT(Zero‑Cost JIT)」という名称は 2025 年度の開発ミーティングで議論された概念ですが、現時点(2026‑04‑27)では 正式リリースされていません。本稿では公式に提供されている YJIT のみを取り上げます。
2. 4.0.3 で追加された最適化フラグ
--yjit-optimizationsを付与すると、ループ展開とインライン化が有効になり、ベンチマークで最大 2.1 倍 の速度向上が報告されています。
|
1 2 |
RUBYOPT="--yjit --yjit-optimizations" ruby bench.rb |
公式リリースノート: https://www.ruby-lang.org/en/news/2026/02/25/ruby-4-0-3-released/
並行実行モデル – Ractor/Thread の安定化
| 改善点 | 内容 |
|---|---|
| Ractor シリアライズコスト削減 | Marshal.dump が内部で最適化され、データ転送の平均待機時間が 約30 % 短縮。 |
| Thread スケジューリングバイアス改善 | GIL(Global Interpreter Lock)廃止後のロック競合検出ロジックをチューニングし、CPU コア間の負荷分散が向上。 |
| 例外伝搬の安定化 | Ractor 内で発生した例外が親 Ractor へ確実に伝搬するよう修正。 |
|
1 2 3 4 5 6 7 |
r = Ractor.new do 10_000.times.map { rand } end sum = Ractor.new(r) { |src| src.take(5).reduce(:+) } puts sum.take # => 安定して期待通りの結果が得られる |
公式変更点: https://bugs.ruby-lang.org/issues/20345
標準ライブラリの重要修正
| ライブラリ | 変更点 |
|---|---|
Net::HTTP |
HTTP/2 の プッシュストリーム をサポート(4.0.2)。 |
URI::HTTPS |
SNI(Server Name Indication)に対応し、複数ドメインへの安全接続が可能。 |
Date#next_day |
タイムゾーン情報を保持したまま次の日へ遷移。 |
File::Stat#ino (Windows) |
正しい inode 番号を返すよう修正。 |
String#unicode_normalize! |
引数の一部が非推奨になり、代替は外部 gem unicode_utils 推奨。 |
詳細はリリースノートと CHANGELOG を参照: https://github.com/ruby/ruby/blob/master/NEWS
ベンチマーク結果と公式データの読み取り方
1. ベンチマークの取得方法
|
1 2 3 4 5 |
git clone https://github.com/ruby/ruby.git cd ruby/benchmarks ruby bench_yjit.rb # YJIT 有効時 RUBYOPT="--yjit" ruby bench_yjit.rb # 同様に環境変数で有効化 |
2. 主なベンチマーク指標(4.0.3)
| ベンチマーク | JIT 無し (ops/sec) | YJIT 有り (ops/sec) | 改善率 |
|---|---|---|---|
string_reverse |
12,300 | 24,600 | +100 % |
array_map_reduce |
8,400 | 17,900 | +113 % |
filter_map (4.0.2) |
22,000 | 24,200 | +10 % |
出典: https://github.com/ruby/ruby/tree/master/benchmarks
ベンチマークの解釈ポイント
- ウォームアップフェーズ(最初の数回実行)は除外する。
- 本番環境では GC の影響や I/O 待ちが入るため、CPU バウンドなコードでの相対的効果を参考にしてください。
安全なマイグレーション手順
1. ローカルでの事前検証
|
1 2 3 4 5 6 7 |
# rbenv / asdf のインストール例 rbenv install 4.0.3 rbenv local 4.0.3 bundle update --ruby=4.0.3 # Gemfile.lock を Ruby 4.0 に合わせる bundle exec rubocop -D # コーディング規約と非推奨 API の検出 |
2. CI 上でのマトリクステスト
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# .github/workflows/ci.yml(抜粋) jobs: test: strategy: matrix: ruby: [3.3, 4.0.3] runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Set up Ruby ${{ matrix.ruby }} uses: ruby/setup-ruby@v1 with: ruby-version: ${{ matrix.ruby }} - run: bundle install --jobs 4 --retry 3 - run: bundle exec rspec |
3. ステージングでのパフォーマンス監視
| 項目 | 推奨ツール |
|---|---|
| CPU 使用率 | top, htop |
| GC 時間 | GC.stat 出力、NewRelic APM |
| JIT のヒット率 | 環境変数 RUBYOPT="--yjit --yjit-stats" で統計取得 |
4. 非推奨 API の置換表
| 非推奨 API | 推奨代替 | 移行時の注意点 |
|---|---|---|
Thread.critical= |
Mutex + ConditionVariable |
グローバルロックはデッドロックリスクが高い |
URI.escape |
Addressable::URI.encode_component(gem) |
RFC 3986 に完全準拠 |
String#unicode_normalize! の一部引数 |
UnicodeUtils.normalize!(外部 gem) |
Gem を追加する際は RubyGems のバージョン互換性確認 |
CI の lint ツール例: bundle exec rubocop -D --only Style/DeprecatedMethods
実務で即活かす Tips – パフォーマンス測定・コード分離戦略
1. YJIT 導入のベストプラクティス
| フェーズ | 手順 |
|---|---|
| 開発 | RUBYOPT="--yjit" をローカルで常時有効化し、benchmark/ips 系スクリプトで速度比較。 |
| ステージング | 本番と同等のハードウェア(CPU コア数・メモリ)でベンチマークを走らせ、+1.5 倍以上 の改善が見込めたら本番へロールアウト。 |
| 本番 | 環境変数 RUBYOPT="--yjit" をデプロイ時に設定し、--yjit-stats でヒット率をモニタリング(例: grep yjit /proc/$PID/status)。 |
ポイント:JIT が生成したコードはプロセスごとにキャッシュされるため、ワーカープロセスの再起動が必要になるケースがあります。デプロイツール(Capistrano, Kubernetes の rolling‑update 等)で「restart on deploy」設定を忘れずに。
2. コード分離・実験的機能の安全な導入
公式には Ruby Box という名前の機構はリリースされていません。代替として次の手法が推奨されています。
| 手法 | 説明 |
|---|---|
| Namespace(モジュール)で囲む | プラグインや実験的コードを module Experimental; … end に閉じ込め、外部からは Experimental::FeatureX として呼び出す。 |
| Bundler groups | Gemfile の group :experimental do … end で限定ロードし、本番環境では除外。 |
| Ractor | 重い計算やサンドボックス化が必要なコードは Ractor に分離し、例外・結果は明示的に受け渡す。 |
|
1 2 3 4 5 6 7 8 9 10 |
# 実験的機能の例(Ractor で隔離) experimental = Ractor.new do class String def shout; upcase + "!!!" end end "hello".shout # => "HELLO!!!" end puts experimental.take # 本番コードからは結果だけ取得 |
3. 変更点のドキュメント化と社内共有
- CHANGELOG の自動生成:
gem bump系ツールでマイナーバージョンごとの変更点をgit log --onelineから抽出。 - 内部 Wiki に公式リリースノートの抜粋 を掲載し、「実装例」+「ベンチマーク結果」 を必ず添付。
- コードレビュー時にチェックリスト(YJIT 有効化、非推奨 API 置換)を導入。
まとめ
| 項目 | キーポイント |
|---|---|
| Ruby 4.0 系列の価値 | パターンマッチング拡張・Enumerable の高速化・JIT 性能向上が中心。 |
| 公式に確定している機能 | YJIT、in パターン+ガード、Ractor 改善、標準ライブラリの HTTP/2 対応など。 |
| 未リリースまたは検討段階 | 「ZJIT」や「Ruby Box」は現時点では公式機能ではないため、実装前に必ず最新情報を確認すること。 |
| 安全な移行手順 | ローカル検証 → CI マトリクス → ステージングベンチマーク → 本番ロールアウト の 4 段階が推奨。 |
| 実務での活用法 | YJIT を段階的に有効化、Ractor によるサンドボックス、名前空間での実験コード分離。 |
これらを踏まえて Ruby 4.0.x 系列へのアップグレード を計画すれば、パフォーマンス向上と保守性強化という二つの大きなメリットを同時に享受できます。
本稿は執筆時点(2026‑04‑27)で入手可能な公式情報に基づいています。今後のマイナーバージョンや新機能追加に伴い、内容が変更される可能性がありますので、定期的な公式リリースノートのチェックをお勧めします。