Ruby 3.4.0-rc1 リリース

Ruby 3.4.0-rc1 が公開されました。

デフォルトのパーサをPrismに変更

デフォルトで使用するパーサーを parse.y から生成するパーサーから Prism へと変更しました。 [Feature #20564]

Modular GC

  • Modular GC 機能により Ruby 標準とは異なる ガベージ・コレクタ (GC) の実装を動的にロードすることができるようになりました。この機能を使うには Ruby をビルドする時に --with-modular-gc を指定してください。GC ライブラリは環境変数 RUBY_GC_LIBRARY を用いて Ruby のランタイムにロードすることができます。[Feature #20351]

  • Ruby 組み込みのガベージ・コレクタは gc/default/default.c ファイルに分割され、 Ruby ランタイムとのやりとりは gc/gc_impl.h に定義される API を用いて行われます。組み込みのガベージコレクタは make modular-gc MODULAR_GC=default というコマンドを用いてライブラリとしてもビルドすることができ、環境変数として RUBY_GC_LIBRARY=default を定義することで有効にすることができます。 [Feature #20470]

  • MMTk をベースとした実験的な GC ライブラリが提供されました。このライブラリはmake modular-gc MODULAR_GC=mmtk コマンドによってビルドし、環境変数 RUBY_GC_LIBRARY=mmtk によって有効化します。この機能を使うにはビルドを行うマシンに Rust のビルドツールを必要とします。 [Feature #20860]

言語機能の変更

  • マジックコメント frozen_string_literal のないファイル中の文字列リテラルは、freeze されているかのように振る舞うようになり、破壊的な変更時に警告を表示するようになりました。これらの警告はコマンドラインオプション -W:deprecated か Ruby プログラムで Warning[:deprecated] = true を指定すると表示されます。 これら無効にするにはコマンドラインオプション --disable-frozen-string-literal を追加して Ruby を実行してください。 [Feature #20205]

  • ブロックパラメータに名前をつけずに参照する it が追加されました。 [Feature #18980]

  • メソッド呼び出し時の nil 展開キーワードがサポートされました。 **nil**{} と同様に扱われ、キーワードは渡せません。 また、あらゆる変換のためのメソッドも呼ばれません。[Bug #20064]

  • インデックスにブロックを渡せなくなりました。[Bug #19918]

  • インデックスにキーワード引数を渡せなくなりました。[Bug #20218]

YJIT

TL;DR

  • x86-64 と arm64 の両方のプラットフォームにおいて、ほとんどのベンチマークのパフォーマンスが向上しました。
  • コンパイルメタデータのメモリ使用量を削減しました。
  • 様々な不具合修正: YJIT はより堅牢になり、より多くの環境でテストされました。

新機能

  • --yjit-mem-size による統一的なメモリ制限が指定可能になりました(デフォルトは 128MiB)。 このオプションはすべての YJIT のメモリ使用量を監視し、従来の --yjit-exec-mem-size オプションよりも直感的に使用できます。
  • RubyVM::YJIT.runtime_stats からより多くの統計情報を取得できるようになりました。
  • --yjit-log オプションを用いて、コンパイルログを監視できるようになりました。
    • RubyVM::YJIT.log を用いてコンパイルログの末尾を取得することができるようになりました。
  • マルチ Ractor モードにおける定数共有をサポートしました。
  • --yjit-trace-exits=COUNTERオプションを用いて、カウントされたexitを監視できるようになりました。

新しい最適化

  • コンテキストの圧縮化により YJIT のメタデータ保管に必要なメモリを削減しました。
  • ローカル変数やRubyのメソッドの引数のためにレジスタを割り当てるようになりました。
  • YJIT が有効な場合に Ruby で実装されたコアクラスを使うようになりました。
    • Ruby で書き直された Array#each, Array#select, Array#map はより良いパフォーマンスを提供します。 [Feature #20182].
  • 以下のような小さいメソッドをインライン化できるようになりました:
    • 空メソッド
    • 定数を返すメソッド
    • self を返すメソッド
    • 引数を直接返すメソッド
  • 組み込みメソッドに特化したコード生成の対象を広げました
  • String#getbyte, String#setbyte など、String のメソッドの最適化を行いました。
  • 低レベルの bit/byte 操作を高速化するためにビット演算を最適化しました
  • その他、様々な段階的な最適化を行いました。

コアクラスのアップデート

注: 複数のアップデートの中から注目すべきアップデートのみを掲載しています。

  • Exception

    • Exception#set_backtraceThread::Backtrace::Location の配列を受け取れる様になりました。. Kernel#raise, Thread#raiseFiber#raise も同じ配列を受け取れます。[Feature #13557]
  • Range

    • Range#size は範囲オブジェクトが反復可能ではない場合は TypeError 例外を出すようになりました。[Misc #18984]

互換性に関する変更

注: 不具合修正を除きます。

  • エラーメッセージとして表示するバックトレースを変更しました。
    • 開始の引用符は backtick の代わりにシングルクォートを用いるようになりました。[Feature #16495]
    • クラス名が変更しないような場合、メソッド名の前にクラス名を表示するようになりました。[Feature #19117]
    • Kernel#caller, Thread::Backtrace::Location などのメソッドはそれらに応じて変更されました。
    Old:
    test.rb:1:in `foo': undefined method `time' for an instance of Integer
            from test.rb:2:in `<main>'
    
    New:
    test.rb:1:in 'Object#foo': undefined method 'time' for an instance of Integer
            from test.rb:2:in '<main>'
    

C API のアップデート

  • rb_newobjrb_newobj_of (と対応するマクロの RB_NEWOBJ, RB_NEWOBJ_OF, NEWOBJ, NEWOBJ_OF) は削除されました。 [Feature #20265]
  • 非推奨とされていた rb_gc_force_recycle は削除されました。 [Feature #18290]

その他の変更

  • 渡されたブロックを使用しないメソッドにブロックを渡すと、verboseモード(-w) で警告が表示されるようになりました。[Feature #15554]

  • String.freezeInteger#+ のような JIT とインタプリタによって特別に最適化されたメソッドを再定義すると、performance 警告(-W:performance またはWarning[:performance] = true で有効化)が表示されるようになりました。 [Feature #20429]

default gemsやbundled gemsの詳細についてはLoggerなどのChangeLogを参照してください。

より詳細な情報は NEWScommit logs を参照してください。

これらの変更により、Ruby 3.3.0から 4820 ファイルが変更され、 196907 行が追加され、 253488 行が削除されました!

ダウンロード

  • https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.0-rc1.tar.gz

    SIZE: 23055998
    SHA1: 216e3085ab8b886b9f74943ee5b62bd2e3d86671
    SHA256: 1f3187d3366e90af6d760994f8bfe1fe8999a8ba3553ea4dcfae63e548236e2a
    SHA512: 0b0420a39c0bf3b38600d4e28805a581c4b5a6cf2abe41be8c8164276a8044a19e676de74eea5dd5b4d7d667d821a6144119795fea510fd4ba6e34865a2ae172
    
  • https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.0-rc1.tar.xz

    SIZE: 17116016
    SHA1: 1424671cdc9c4bfe3778ac159d917c8bfe6107bd
    SHA256: 9c54225747f7a786727aa6213503083d5d8ff7097505d4b7456ff60880ee4a17
    SHA512: 5b92a2b5829ab23735617945839e45df984b319b8932e790a8e0c6f681b9bd74249511a76345516cc216c002ed7887bdd27151501491d5ecedc20acd3fb57cc5
    
  • https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.0-rc1.zip

    SIZE: 28323595
    SHA1: 4ae8ce4b15ccc3f0c6f42e408c44aa287a1ccc14
    SHA256: 653162a2db627e8e5feee22a00b20acf215509d88b06ffb281bc8788ed12c74c
    SHA512: c6c6b9a0e61308e3f3303cd148613feabb2ee12d8e2fefc1f4aa1403237310f7c9be5e2031248ea89ff01cdc0bca1a66ff60f9f1f19ed9c9fccef3d7a3bbebb8
    

Ruby とは

Rubyはまつもとゆきひろ (Matz) によって1993年に開発が始められ、今もオープンソースソフトウェアとして開発が続けられています。Rubyは様々なプラットフォームで動き、世界中で、特にWebアプリケーション開発のために使われています。