Posted by naruse on 12 Dec 2024
Translated by npakk
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].
- Ruby で書き直された
- 以下のような小さいメソッドをインライン化できるようになりました:
- 空メソッド
- 定数を返すメソッド
self
を返すメソッド- 引数を直接返すメソッド
- 組み込みメソッドに特化したコード生成の対象を広げました
String#getbyte
,String#setbyte
など、String のメソッドの最適化を行いました。- 低レベルの bit/byte 操作を高速化するためにビット演算を最適化しました
- その他、様々な段階的な最適化を行いました。
コアクラスのアップデート
注: 複数のアップデートの中から注目すべきアップデートのみを掲載しています。
-
Exception
Exception#set_backtrace
はThread::Backtrace::Location
の配列を受け取れる様になりました。.Kernel#raise
,Thread#raise
やFiber#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_newobj
とrb_newobj_of
(と対応するマクロのRB_NEWOBJ
,RB_NEWOBJ_OF
,NEWOBJ
,NEWOBJ_OF
) は削除されました。 [Feature #20265]- 非推奨とされていた
rb_gc_force_recycle
は削除されました。 [Feature #18290]
その他の変更
-
渡されたブロックを使用しないメソッドにブロックを渡すと、verboseモード(
-w
) で警告が表示されるようになりました。[Feature #15554] -
String.freeze
やInteger#+
のような JIT とインタプリタによって特別に最適化されたメソッドを再定義すると、performance 警告(-W:performance
またはWarning[:performance] = true
で有効化)が表示されるようになりました。 [Feature #20429]
default gemsやbundled gemsの詳細についてはLoggerなどのChangeLogを参照してください。
より詳細な情報は NEWS か commit 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アプリケーション開発のために使われています。