Ruby 3.4.0-rc1 リリース
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アプリケーション開発のために使われています。
最近のニュース
Ruby 4.0.0 リリース
Ruby 4.0.0 が公開されました。 Ruby 4.0 には “Ruby Box”、”ZJIT” ほか多数の改善が含まれています。
Posted by naruse on 25 Dec 2025
サイトのアイデンティティの再設計
サイトの包括的なデザインのアップデートを発表できることを嬉しく思います。今回の更新ではTaeko Akatsukaさんにデザインを担当していただきました。
Posted by Hiroshi SHIBATA on 22 Dec 2025
Ruby 4.0.0 preview3 リリース
Ruby 4.0.0-preview3 が公開されました。
Posted by naruse on 18 Dec 2025
Ruby 4.0.0 preview2 リリース
Ruby 4.0.0-preview2 が公開されました。Ruby 4.0では、Unicodeバージョンの17.0.0へのアップデートなど様々な改善が行われています。
Posted by naruse on 17 Nov 2025