Rubyプログラミングの世界にまた新たな大きな一歩が刻まれました。

2025年末にリリースされたRuby 3.5は、開発者の利便性を飛躍的に高める「Setクラスのコアクラス化」や、さらなる高速化を実現した「YJITの改良」など、実務に直結する数多くのアップデートを含んでいます。

Ruby 3.0から続く「高速化」と「静的解析の親和性」という軸を維持しつつ、より洗練された言語へと進化を遂げたRuby 3.5の全容を、技術的な詳細とともに紐解いていきましょう。

Ruby 3.5の登場背景と進化の方向性

Rubyは「プログラミングを楽しくする」という哲学を掲げ、常に開発者の幸福度を追求してきました。

Ruby 3.0以降、実行速度の向上を目標とした「Ruby 3×3」の達成を経て、現在の開発フォーカスは実用的なパフォーマンスの極大化と、エコシステム全体の堅牢性に移っています。

Ruby 3.5における最大の変化は、これまで標準ライブラリの一部として提供されていたSetクラスが、ついにプリミティブなコアクラスへと昇格したことです。

これは、Rubyが現代的なデータ構造をよりネイティブにサポートすることを意味しており、パフォーマンス面でも大きな恩恵をもたらします。

また、JITコンパイラであるYJITの最適化が進み、メモリ消費を抑えながら実行速度を向上させるという、より高度なチューニングが施されました。

Setクラスのコアクラス化(組み込みクラス化)

Ruby 3.5における最も象徴的な変更点が、Setクラスの組み込み(Built-in)化です。

これまでSetを利用するためには、スクリプトの冒頭で必ずrequire 'set'と記述する必要がありました。

しかし、Ruby 3.5からはこの記述が不要となり、配列(Array)やハッシュ(Hash)と同じように、いつでもどこでもSetを呼び出すことが可能です。

なぜSetはコアクラスになったのか

モダンなプログラミングにおいて、重複を許さない集合(Set)というデータ構造は、リスト(Array)と同じくらい頻繁に使用されます。

しかし、RubyにおいてSetは長らく「後付けのライブラリ」という立ち位置でした。

これをコアクラスに組み込むことで、Rubyは以下の3つのメリットを手に入れました。

  1. 記述の簡略化:ボイラープレートなrequireを排除し、コードをクリーンに保つ。
  2. 起動速度の向上:ライブラリをロードするオーバーヘッドが削減され、特に小規模なスクリプトやCLIツールの起動が高速化される。
  3. C言語レベルでの最適化:コアクラス化に伴い、内部実装がC言語によって再構築され、集合演算の速度が劇的に向上した。

Setの新しいリテラルと記述例

Ruby 3.5では、Setをより直感的に扱うための変更が加えられています。

これまではSet.new([1, 2, 3])という記述が一般的でしたが、コアクラス化によってより簡潔なインターフェースが提供されるようになりました。

Ruby
# Ruby 3.5以前
require 'set'
s = Set.new([1, 2, 3])

# Ruby 3.5
# require 'set' は不要
s = Set[1, 2, 3]

# 既存の配列から変換する場合もスムーズに
numbers = [1, 2, 2, 3, 4, 4]
unique_numbers = numbers.to_set
p unique_numbers
実行結果
#<Set: {1, 2, 3, 4}>

このように、to_setメソッドも標準で利用可能となっているため、データクレンジングや重複排除の処理がよりスムーズに記述できるようになっています。

パフォーマンスへの影響

SetがC言語による内部実装へと移行したことで、特に大規模な集合同士の結合(union)や積(intersection)の計算速度が向上しています。

従来のRuby実装のSetと比較して、ベンチマークスコアでは約1.5倍から2倍近い高速化が確認されるケースもあります。

大量のIDを突き合わせるフィルタリング処理など、バックエンド開発における重い処理において、この恩恵は非常に大きいと言えるでしょう。

YJITのさらなる進化と2026年の実行環境

Ruby 3.2でプロダクション環境への投入が現実的になったYJIT(Yet Another JIT)は、Ruby 3.5においても目覚ましい進化を遂げています。

2026年現在、YJITは「速いけれどもメモリを大量に消費する」というかつてのイメージを払拭し、高いパフォーマンスとメモリ効率を両立する段階に到達しました。

コード生成の効率化とメモリ管理

Ruby 3.5のYJITでは、生成されるマシンコードの密度が向上しました。

これまでは実行パスごとに大量のコードを生成していましたが、より高度なインラインキャッシュ戦略と、冗長な命令の削除アルゴリズムが導入されたことで、メモリ使用量(Executable Memory)が従来比で約20%削減されています。

また、Ruby 3.5では「Lazy Code Generation」という仕組みが強化されました。

これは、頻繁に呼び出されるメソッド(ホットスポット)のみを、より慎重に判別してコンパイルする手法です。

これにより、アプリケーションの起動直後から安定したパフォーマンスを発揮するまでの時間が短縮されました。

実環境でのベンチマーク比較

Webアプリケーション開発において一般的なRails環境を想定したベンチマークでは、Ruby 3.4と比較して約5〜10%のレスポンスタイム向上を記録しています。

数値だけ見ると小幅に感じるかもしれませんが、コードを一切変更せずに、ランタイムを更新するだけで得られるメリットとしては極めて高い価値があります。

RubyバージョンYJITの状態平均リクエスト処理時間 (ms)メモリ使用量 (MB)
Ruby 3.2Enabled12.5450
Ruby 3.3Enabled10.8420
Ruby 3.4Enabled9.5410
Ruby 3.5Enabled8.7380

(※数値は一般的なワークロードに基づいた想定値です)

このように、Ruby 3.5は単にピークスピードを競うだけでなく、実際のサーバーリソースを効率的に活用することに主眼が置かれています。

メモリ管理の最適化:Variable Width Allocationの進展

Ruby 3.5の内部的な進化として欠かせないのが、Variable Width Allocation (VWA)のさらなる適用範囲の拡大です。

Rubyのガベージコレクション(GC)は、長年「スロット」と呼ばれる固定サイズの領域にオブジェクトを割り当てる方式を採用してきました。

しかし、この方式では大きなオブジェクトを扱う際にメモリの断片化が発生しやすいという課題がありました。

オブジェクト割り当ての柔軟性

VWAの導入により、Rubyはオブジェクトのサイズに応じて適切なメモリ量を動的に割り当てることが可能になります。

Ruby 3.5では、このVWAが多くの組み込みクラスに適用されるようになり、メモリのフラグメンテーションが劇的に改善されました。

これにより、長時間稼働し続けるWebサーバープロセスにおいて、時間の経過とともにメモリ使用量が増大し続ける「メモリの肥大化」が抑制されます。

開発者はGCの挙動を深く意識することなく、より効率的なリソース管理の恩恵を享受できるのです。

標準ライブラリと新構文のアップデート

Ruby 3.5では、Setクラス以外にも多くの標準ライブラリに改良が加えられています。

また、開発者の利便性を高めるための小さな、しかし強力な新機能がいくつか追加されました。

Enumerable#tally の強化

集計処理に便利なtallyメソッドに、新しい引数が追加されました。

これにより、集計結果を特定のハッシュにマージしたり、あらかじめデフォルト値を設定したハッシュに結果を格納したりすることが容易になりました。

Ruby
data = ["apple", "banana", "apple", "cherry"]
# 既存の集計結果に加算する例
counts = { "apple" => 10 }
data.tally(counts) 

p counts
実行結果
{"apple"=>12, "banana"=>1, "cherry"=>1}

このように、countsオブジェクトを直接更新できるようになったことで、ループ処理の中での部分的な集計が格段に書きやすくなりました。

パターンマッチングの洗練

Ruby 2.7から導入され、3系で成熟したパターンマッチング機能も、Ruby 3.5でさらに洗練されました。

特に、ハッシュパターンにおける省略記法の拡張が行われ、ローカル変数名とハッシュのキー名が一致する場合の記述がより自然になりました。

Ruby
user = { name: "Tanaka", age: 30 }

# Ruby 3.5でのパターンマッチング
case user
in { name:, age: }
  puts "#{name} (#{age})"
end
実行結果
Tanaka (30)

一見すると以前からの機能に見えますが、マッチングの内部最適化が進んだことで、複雑なネスト構造を持つJSONデータのパースやバリデーションにおいて、パフォーマンスを損なうことなく安全なコードを記述できるようになっています。

Ruby 3.5への移行ガイドと注意点

Ruby 3.5は高い後方互換性を維持していますが、メジャーアップデートに伴う注意点もいくつか存在します。

移行をスムーズに進めるためのポイントを確認しましょう。

Setクラスに関する注意

前述の通り、Setはコアクラス化されましたが、既存のコードにあるrequire 'set'を削除し忘れてもエラーにはなりません。

ただし、将来的なクリーンアップを考慮すると、新規開発では省略し、既存コードからも順次削除していくことが推奨されます。

依存Gemの更新

Ruby 3.5では内部のC APIに一部変更が入っているため、ネイティブエクステンションを利用しているGem(例:nokogiri, pg, mysql2など)は、Ruby 3.5に対応した最新バージョンにアップデートする必要があります。

bundle updateを実行し、テストスイートが正常にパスすることを確認してください。

廃止予定(Deprecation)への対応

Ruby 3.5では、将来のバージョンで廃止される予定の古いメソッドに対して、より詳細な警告(Warning)が出るようになっています。

特に、キーワード引数の扱いに関する古い記法が残っている場合、ログに警告が出力されることがあります。

これらは「将来のRuby 4.0」を見据えた準備であるため、無視せずにリファクタリングを進めることが賢明です。

実務におけるRuby 3.5の活用シーン

Ruby 3.5の新機能は、どのような開発現場で最も効果を発揮するのでしょうか。

いくつかの具体例を挙げます。

  1. データ処理パイプライン
    Setの高速化とEnumerableの強化により、ETL(抽出・変換・格納)処理などのデータバッチの実行時間が短縮されます。


  2. マイクロサービス
    YJITのメモリ効率改善により、コンテナ1つあたりのメモリ割り当てを抑えることができ、クラウドインフラのコスト削減に寄与します。


  3. リアルタイムAPI
    レスポンスタイムの向上が、ユーザーエクスペリエンスに直結するソーシャルゲームやチャットアプリのバックエンドで威力を発揮します。


Ruby 3.5は、既存のRubyの強みを活かしつつ、弱点とされていた「実行速度」と「メモリ消費」を確実に克服し続けています。

まとめ

Ruby 3.5は、単なる機能追加に留まらない、言語としての完成度を一段階引き上げたアップデートです。

Setクラスのコアクラス化は、日常的なコーディングをより快適にし、C言語レベルの最適化によって処理速度の向上をもたらしました。

また、進化したYJITは、プロダクション環境における実用性をさらに高め、Rubyが高速なWebアプリケーション開発のための強力な選択肢であることを改めて証明しました。

さらに、VWAをはじめとするメモリ管理の最適化や、パターンマッチングの洗練などは、長期的な運用保守における安定性を支える重要な要素です。

2026年という現在のテクノロジー水準において、Ruby 3.5は「生産性の高さ」と「実行性能」のバランスを極めた、非常に魅力的なバージョンとなっています。

これから新規プロジェクトを立ち上げる方はもちろん、既存のプロジェクトを運用している方も、Ruby 3.5へのアップデートを検討し、その恩恵をいち早く享受することをおすすめします。

Rubyの進化は止まりません。

この新しいバージョンとともに、より楽しく、より効率的なプログラミングの世界へ踏み出しましょう。