12月13日、RubyチームはRuby 3.4.0-rc1を公開した。今回のリリースでは、パフォーマンス向上や開発者体験の改善を図った多くの新機能が搭載されている。特に注目すべきは、デフォルトのパーサーが「Prism」に変更されたことや、モジュラーGC(ガベージコレクション)の導入である。
主要な新機能
1. Prismの導入
Rubyのデフォルトパーサーがこれまでのparse.y
から「Prism」に変更された。この変更により、より効率的な構文解析が可能になった。詳細はRubyのFeature #20564を参照していただきたい。
2. モジュラーGC(Modular GC)
モジュラーGC機能により、異なるGC(ガベージコレクター)を動的に切り替えることが可能になった。
動的ロード機能
--with-modular-gc
を指定してRubyをビルドすることで、任意のGCライブラリを環境変数RUBY_GC_LIBRARY
を通じて動的にロードできるようになる。標準GCの分離
RubyのビルトインGCがgc/default/default.c
に分離され、APIを通じてRubyとやり取りするようになった。このGCもライブラリ化が可能で、make modular-gc MODULAR_GC=default
コマンドでビルド可能だ。MMTkベースのGC
Rust製のGCライブラリ「MMTk」を導入する実験的な機能も追加された。make modular-gc MODULAR_GC=mmtk
コマンドでビルドできるが、Rustツールチェーンが必要となる。詳細は以下の関連Issueを参照していただきたい。
3. 言語の変更
いくつかの言語仕様の変更が行われた。
文字列リテラルの暗黙的なfreeze
frozen_string_literal
コメントがないファイル内の文字列リテラルがデフォルトでfreezeされるようになった。変更を無効にするには、--disable-frozen-string-literal
をコマンドライン引数に指定する必要がある。ブロックパラメータへの
it
の追加
ブロックパラメータを参照するためのit
が追加された。キーワード引数のスプラット
**nil
のサポート**nil
が**{}
と同様の扱いを受けるようになり、キーワードのない引数呼び出しが可能になった。インデックスでのブロック引数の使用禁止
インデックス操作でのブロック引数およびキーワード引数の使用が禁止された。これらの変更に関する詳細は以下を参照していただきたい。
4. YJITの改善
YJIT(Just-in-timeコンパイラ)にも複数の改善が行われ、これまでよりも高速化され、安定性が向上した。
パフォーマンスの向上
x86-64およびarm64プラットフォームで多くのベンチマークが向上した。メモリ使用量の削減
コンパイルメタデータのメモリ使用量が削減された。新機能の追加
--yjit-mem-size
オプションが追加され、メモリ使用量の一元的な管理が可能になった。- 統計情報が
RubyVM::YJIT.runtime_stats
から常に取得可能になった。 - YJITのコンパイルログが
--yjit-log
オプションで取得可能になり、RubyVM::YJIT.log
からも確認できる。
これらの改善の詳細はFeature #20182を参照していただきたい。
5. コアクラスの更新
以下のコアクラスが更新された。
Exception
クラスException#set_backtrace
がThread::Backtrace::Location
の配列を受け入れられるようになった。Range
クラスRange#size
が反復可能でない範囲に対してTypeError
を発生させるようになった。詳細は以下のIssueを参照していただきたい。
6. 互換性の問題
いくつかの互換性に関する変更が行われた。
エラーメッセージの変更
バッククオート(`)がシングルクォート(')に変更され、メソッド名の前にクラス名が表示されるようになった。変更前の例
test.rb:1:in foo': undefined method time’ for an instance of Integer
変更後の例
test.rb:1:in ‘Object#foo’: undefined method ‘time’ for an instance of Integer
7. C APIの変更
いくつかのC APIが削除された。
rb_newobj
およびrb_newobj_of
の削除rb_gc_force_recycle
の削除
8. その他の変更
- ブロックを受け取らないメソッドにブロックを渡すと、verboseモードで警告が表示される。
String.freeze
やInteger#+
のようなコア最適化メソッドを再定義すると、パフォーマンス警告が表示されるようになった。
ダウンロード
Ruby 3.4.0-rc1のソースコードは、以下のリンクからダウンロードできる。
詳細はRuby 3.4.0 rc1 Releasedを参照していただきたい。