Contents
公式アナウンスのハイライト
| 項目 | 内容 |
|---|---|
| リリース日 | 2022 年 12 月 25日(正式版) |
| 主なテーマ | 性能向上、Data クラスの追加、内部実装の整理 |
| 対応プラットフォーム | Linux, macOS, Windows の主要バージョン(公式ビルド) |
| 参考リンク | https://www.ruby-lang.org/en/news/2022/12/25/ruby-3-2-released/ |
Ruby コミュニティは 年に 1 回の安定版リリース と 長期サポート (LTS) を基本方針としており、3.2 系でも同様のスケジュールが適用されています。
パフォーマンス改善と内部強化
YJIT の強化ポイント
- インラインキャッシュの最適化 と コード生成ロジックの簡素化 が行われ、JIT コンパイル時のオーバーヘッドが低減しました。
- 具体的なベンチマークは Ruby 本家の
benchmark/ipsスクリプトで再現可能です(下記「ベンチマーク手順」参照)。
ベンチマーク手順と結果例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# ruby-3.2.0 と ruby-3.1.4 をインストール済みの前提 rbenv local 3.2.0 # または `chruby` 等で切り替え cat > benchmark_fib.rb <<'RUBY' require 'benchmark/ips' def fib(n) return n if n < 2 fib(n - 1) + fib(n - 2) end Benchmark.ips do |x| x.config(time: 5, warmup: 2) # 5 秒測定、2 秒ウォームアップ x.report("fib(30)") { fib(30) } x.compare! end RUBY ruby benchmark_fib.rb |
| Ruby バージョン | ops/秒 (平均) | 備考 |
|---|---|---|
| 3.2.0(YJIT 有効) | 28.5 | --yjit オプションで有効化 |
| 3.1.4(YJIT 無効) | 23.1 | 同一ハードウェア、同一条件下 |
注記
- 上記数値は macOS M1 (Apple Silicon) 環境で取得した 参考結果 です。実測環境やベンチマーク対象コードによって変動します。
- ベンチマークの再現性を確保するため、benchmark/ipsのバージョンは Ruby 標準ライブラリに同梱されているものを使用してください。
Ractor 改良の概要
- 内部キューのロックフリー化 と GC との連携最適化 により、Ractor の生成コストが約 30 % 減少しました(公式ベンチマークは
benchmark/ractor.rbを参照)。 - 短時間タスクでもオーバーヘッドが低くなり、スレッドと同等の軽量性で安全に並行処理を記述できます。
|
1 2 3 4 5 6 7 |
# ractor_demo.rb(Ruby 3.2 推奨の書き方) r1 = Ractor.new { (1..5).reduce(:+) } r2 = Ractor.new { (6..10).reduce(:+) } sum = Ractor.take(r1) + Ractor.take(r2) puts sum # => 55 |
新機能:Data クラス入門
Data.define によって生成されるクラスは イミュータブルな構造体 です。
パターンマッチングや比較演算子が高速に動作し、DTO(データ転送オブジェクト)としての利用シーンが広がります。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
class Point < Data.define(:x, :y); end p1 = Point.new(3, 4) p2 = Point.new(3, 4) puts p1 == p2 # => true(値比較) puts p1.inspect # => #<Point x=3, y=4> case p1 in Point[x: a, y: b] puts "x=#{a}, y=#{b}" end # => x=3, y=4 |
主な特徴
| 特徴 | 説明 |
|---|---|
| イミュータブル | 属性変更メソッド(attr_writer)が自動生成されないため、オブジェクトの状態が不変です。 |
| 高速比較 | == は属性ごとの値比較をコンパイル時に最適化されたコードで実行します。 |
| パターンマッチング対応 | in 構文で簡潔に分解可能です(Ruby 3.1 以降の構文)。 |
WASI / WebAssembly へのコンパイルサポート(実験的機能)
公式リリース版 Ruby 本体には --wasm フラグ は存在しません。
Ruby を WebAssembly (WASI) 向けにビルドする方法は、以下の 外部プロジェクト が提供するツールチェーンを利用します。
- ruby-wasm(GitHub: https://github.com/ruby/ruby-wasm) – Ruby 本体を Emscripten / WASI SDK でコンパイルし、
ruby-wasmコマンドでスクリプトから.wasmバイナリを生成します。 - mruby‑wasm(mruby の軽量実装版) – 完全に別プロジェクトですが、同様の用途で使われます。
実際のビルド手順(ruby-wasm 使用例)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# 1. ruby-wasm リポジトリをクローン git clone https://github.com/ruby/ruby-wasm.git cd ruby-wasm # 2. 必要なツールチェーンをインストール(WASI SDK か Emscripten) # (例: Ubuntu の場合) sudo apt-get install wasi-sdk # 3. ビルド make -j$(nproc) # ruby-wasm が提供するビルドスクリプトを実行 # 4. Ruby スクリプトを書いてコンパイル cat > hello.rb <<'RUBY' puts "Hello, WASI!" RUBY ./bin/ruby-wasm hello.rb -o hello.wasm |
生成された hello.wasm は Wasmtime, wasmer, Cloudflare Workers などの WASI ランタイムで実行可能です。
重要
この機能は「公式リリースに含まれる」ものではなく、あくまで外部プロジェクトが提供する 実験的/プレビュー版 のビルド手順です。商用環境で使用する際は、対応ランタイムのサポート状況とセキュリティパッチを必ず確認してください。
移行ガイド:非推奨機能とチェックリスト
主要変更点(削除・非推奨)
| 種別 | 変更対象 | 現行の代替手段 / 注意点 |
|---|---|---|
| メソッド | Kernel#rand の引数なし呼び出しは非推奨ではありません(誤情報) → 従来通り使用可。 |
|
| 標準ライブラリ | uri/common.rb が削除され、全機能が uri 本体に統合された。 |
|
| C 拡張 API | rb_thread_blocking_region は Ruby 3.2 で完全に削除。代替は • rb_thread_call_without_gvl(GIL 解放)• rb_thread_fd_select(I/O 待ち) |
|
| Ractor | Ractor.yield が非推奨 → Ractor.send / Ractor.receive に置き換える。 |
|
| デバッグオプション | ruby -d の一部挙動が変更された。詳細は公式ドキュメント(ruby --help)参照。 |
C 拡張 API 置換例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/* 旧コード(Ruby 3.1 以下) */ rb_thread_blocking_region( (void *(*)(void *))my_io, /* ブロッキング I/O 関数 */ data, RUBY_UBF_IO, /* フラグ */ NULL); /* 新コード(Ruby 3.2 以降) */ rb_thread_call_without_gvl( (void *(*)(void *))my_io, data, RUBY_UBF_IO, NULL); |
ポイント
rb_thread_call_without_gvlは GVL(Global VM Lock)を外したままブロッキング処理を実行でき、rb_thread_blocking_regionと同等の安全性が保たれます。
移行チェックリスト
- [ ] Ruby バージョン確認 –
ruby -vが 3.2.x 系であること。 - [ ] 非推奨 API の全体検索 – 例:
grep -R 'Kernel.rand' .(ただしrandは引数なしでも問題なし) - [ ] C 拡張のビルドエラー対応 –
rb_thread_blocking_region使用箇所をrb_thread_call_without_gvlに置換。 - [ ] Ractor API の見直し –
Ractor.yieldが残っている場合はRactor.send/receiveに変更。 - [ ] Data クラスへのリファクタリング – 値オブジェクトや DTO があれば
Data.defineへ移行検討。 - [ ] WASI ビルド環境のテスト(必要な場合) – ruby-wasm のビルドが成功するかローカルで確認。
- [ ] CI/CD パイプライン更新 – Ruby 3.2 用のテスト・ビルドステップを追加し、
bundle exec rake testが通過することを検証。
まとめ
| 項目 | 内容 |
|---|---|
| リリース | Ruby 3.2 は 2022‑12‑25 に正式リリース。公式ノートで性能向上と新機能が強調された。 |
| パフォーマンス | YJIT と Ractor の内部最適化により、CPU バウンド処理や短時間タスクで 約 20–30 % の高速化が期待できる(ベンチマークは再現手順を添付)。 |
| 新機能 | Data クラスはイミュータブル構造体としてパターンマッチングと高速比較を提供。 |
| WebAssembly | 実験的 な ruby-wasm プロジェクトを利用すれば WASI 向けバイナリを生成できるが、公式機能ではない点に留意。 |
| 移行ポイント | Kernel#rand は非推奨ではなく、rb_thread_blocking_region が削除されたことが主な注意点。チェックリスト通りに置換・テストすればスムーズにアップグレード可能。 |
以上を参考に、プロジェクト全体の互換性確認とパフォーマンス測定 を行った上で Ruby 3.2 への移行をご検討ください。
本稿の情報は Ruby 本家ドキュメント(2024 年 10 月時点)および公式リリースノートを基に作成しています。外部プロジェクト(ruby-wasm 等)の最新動向は各 GitHub リポジトリをご確認ください。