6 ポイント 投稿者 GN⁺ 2025-12-26 | 1件のコメント | WhatsAppで共有
  • Ruby 4.0.0 が公開され、新しい Ruby BoxZJIT を導入し、多数の性能および言語面の改善を含む
  • Ruby Box は、クラス、モジュール、グローバル変数、ネイティブ/Ruby ライブラリ定義を 隔離実行 できる実験的機能
  • ZJIT は Rust ベースの次世代 JIT コンパイラ で、従来の YJIT より構造的に拡張しやすく、外部からの貢献を容易にする
  • Ractor 並列実行モデル は安定性と性能の面で改善され、今後 experimental 状態を解除する予定
  • コアクラス、標準ライブラリ、C API、GC、JIT など全般にわたる更新により、Ruby エコシステムの性能と拡張性 を強化

Ruby 4.0 概要

  • Ruby 4.0.0 は Ruby BoxZJIT を中心とした大規模アップデート版
  • 並列実行、言語構文、標準ライブラリ、GC、JIT などさまざまな領域で改善を含む
  • ダウンロードは .tar.gz, .tar.xz, .zip 形式で提供

Ruby Box

  • Ruby Box は定義の隔離を提供する 実験的機能
    • 環境変数 RUBY_BOX=1 を設定すると有効化され、クラスは Ruby::Box
    • ボックス内部でロードされた定義は外部と隔離され、monkey patch、グローバル/クラス変数、クラス/モジュール定義、ライブラリ変更が他のボックスに影響しない
  • 主な利用例
    • テストケース間の 隔離実行
    • ブルーグリーンデプロイ のための並列 Web アプリ実行
    • 依存関係更新の検証用並列実行
    • 今後、高水準の「パッケージ API」実装の基盤 API として活用予定

ZJIT

  • ZJIT は YJIT の次世代版として開発された 新しい JIT コンパイラ
    • Rust 1.85.0 以上が必要で、--zjit オプションで有効化
    • SSA IR ベースのより大きなコンパイル単位をサポートし、外部からの貢献を促進する構造
  • 現在はインタプリタより速いが、YJIT よりは遅い
    • 本番利用は推奨されず、Ruby 4.1 で性能向上予定

Ractor 改善

  • Ractor::Port クラス追加によりメッセージ送受信の問題を解決
  • Ractor.shareable_proc により Ractor 間での Proc オブジェクト共有が容易に
  • 内部データ構造の改善により グローバルロック競合を削減 し、並列性を向上
  • Ractor の experimental 状態は 来年解除予定

言語変更

  • *nil はもはや nil.to_a を呼び出さない(**nil と同じ動作)
  • 論理演算子(||, &&, and, or)が 行継続(dot chaining) 構文をサポート
  • コードの可読性と一貫性が向上

コアクラス更新

  • Array: Array#rfind, Array#find を追加し、効率的な探索をサポート
  • Binding: 番号付きパラメータの除外と implicit_parameters 関連メソッドを追加
  • Enumerator: producesize: キーワード引数を追加
  • ErrorHighlight: ArgumentError 発生時に呼び出し元・定義部のコードスニペットを表示
  • Fiber/Fiber::Scheduler: raise(cause:), fiber_interrupt, yield などを追加
  • File: Linux で File::Stat#birthtime をサポート
  • IO: Float::INFINITY タイムアウトを許可、パイプベースのプロセス生成を削除
  • Kernel: #inspect をカスタマイズ可能にし、Kernel#open のパイプ生成を削除
  • Math: log1p, expm1 を追加
  • Pathname: default gem から コアクラス に昇格
  • Proc: 匿名パラメータの出力形式を統一
  • Ractor: Ractor::Port ベースの通信構造に変更し、Ractor.yield などを削除
  • Set: コアクラスに昇格し、inspect 形式を簡素化
  • Socket: open_timeout 引数を追加し、タイムアウト例外を統一
  • String: Unicode 17.0.0、Emoji 17.0 をサポートし、strip 系メソッドを拡張
  • Thread: raise(cause:) 引数をサポート

標準ライブラリ(Stdlib)更新

  • default gem へ昇格: ostruct, pstore, benchmark, logger, rdoc, win32ole, irb, reline, fiddle など
  • default gem 追加: win32-registry 0.1.2
  • default gem 更新: RubyGems 4.0.3, bundler 4.0.3, openssl 4.0.0, json 2.18.0 など
  • bundled gem 更新: minitest 6.0.0, rake 13.3.1, rbs 3.10.0, debug 1.11.1 など
  • RubyGems/Bundler 4 を含む

プラットフォームサポート

  • Windows: MSVC 14.0 未満のバージョンのサポートを終了(Visual Studio 2015 以上が必要)

互換性変更

  • Ractor.yield, Ractor#take, Ractor#close_incoming, Ractor#close_outgoing を削除
  • ObjectSpace._id2ref を廃止予定
  • Process::Status#&, #>> を削除
  • 内部フレーム(backtrace)出力を簡素化
  • ArgumentError のバックトレースに レシーバのクラス/モジュール名を表示

標準ライブラリ互換性

  • CGI ライブラリを削除 し、cgi/escape のみ維持
  • Set のコア昇格により、SortedSet は別途 gem のインストールが必要
  • Net::HTTP の自動 Content-Type ヘッダ設定を削除

C API 更新

  • rb_thread_fd_close を無効化し、rb_io_close の使用を推奨
  • rb_thread_call_with_gvl は GVL の有無に関係なく動作
  • Set 用 C API を追加(rb_set_new, rb_set_add, rb_set_delete など)

実装および性能改善

  • Class#new 呼び出し速度を向上、特にキーワード引数使用時
  • GC ヒーププールの独立成長によりメモリ使用量を削減
  • 大型オブジェクトのスイープ速度を向上
  • object_id, hash 計算およびインスタンス変数アクセスを最適化
  • Ractor 性能改善
    • ロックレスハッシュ構造、キャッシュ競合の削減、オブジェクト割り当ての最適化
    • デッドロック、エンコーディング、GC 関連バグを修正

JIT 関連

  • ZJIT: メソッドベース JIT、Rust 1.85.0 以上が必要、--zjit または RubyVM::ZJIT.enable で有効化
  • YJIT: 統計オプションを変更し、mem_size: および call_threshold: を追加
  • RJIT: --rjit を削除し、別リポジトリへ移行

変更規模

  • Ruby 3.4.0 と比較して 3,889 ファイル変更, 230,769 行追加, 297,003 行削除
  • Ruby 4.0 は 性能、並列性、言語の一貫性 を大幅に強化したメジャーリリース

ダウンロード

  • ruby-4.0.0.tar.gz, ruby-4.0.0.tar.xz, ruby-4.0.0.zip 形式で提供
  • 各ファイルの SHA1, SHA256, SHA512 ハッシュ値 を明記

Ruby 紹介

  • Ruby は 1993 年に まつもとゆきひろ(Matz) が開発したオープンソース言語
  • マルチプラットフォームで動作し、特に Web 開発分野で世界的に利用 されている

1件のコメント

 
GN⁺ 2025-12-26
Hacker Newsのコメント
  • Ruby、誕生日おめでとう!
    よく「Ruby は型付けがないから離れた」と言われるけど、今では RBS が標準として定着しつつある。Sorbet もこれをサポートしているし、コードの横にそのまま型を書ける inline notation も登場した。
    また「Ruby は LSP が弱い」という話ももう昔のことだ。ruby-lsp が標準になり、「go to definition」もサポートしている。プラグインアーキテクチャのおかげで、複数のツールが同じ AST を再利用できる。
    並行性も Ractor のおかげでかなり改善されていて、あとは GC をもう少し磨けば、完全に実験段階を脱せそうだ。
    ZJIT や Box のような新機能もあるが、まだ本番環境では推奨されていない。それでも着実に良くなっている。
    文法が急激に変わらないのも良い点だと思う

    • 自分はかなりの筋金入りの Rubyistだが、ruby-lsp は本当に素晴らしい。ただ、RBS が標準になりつつあるとまでは言いにくい。実際の採用率はかなり低い。rbs-inline は個人プロジェクトレベルで、活動も少ない。ただ、その開発者が RBS 本体に直接統合しようとしているのは歓迎したい。個人的には、コメントベースの型システムが広く普及するとは思えない
    • Ruby は単にPython より劣っている。より速くてコミュニティも大きい、ほぼ同じシステムがあるのに、わざわざ Ruby を使う理由がない
  • クリスマスにはやっぱり新しい Ruby のバージョンが出るべきだ。
    今回は ruby::box が興味深い。機能のロールアウトを 2 つのバージョンで同時に回せるようにしてくれる。
    それに、複数行にまたがって if condition1 && condition2 を書けるようになったのもかなり良い

    • いつか各 Ractor がそれぞれ専用の ruby::box で動き、各 box が独立して GC を回せるようになるといい。そうなれば BEAM のような真の並列実行が可能になるはずだ。p99 レイテンシも下がるだろう。もちろんオブジェクト共有時のコピーコストは発生するだろうが、ほとんどのアプリでは些細なものだと思う
    • 自分はもうずっと前から if condition1 && condition2 を複数行で書いていたけど、普通に動いていた。新しい構文が何が違うのか分からない
  • Ruby 4.0 のリリースはうれしいが、2025 年に自分は完全にPython へ移行した。
    Claude Code が自分の Ruby プロジェクトを 100% Python に自動変換してくれて、それ以来 Ruby を使う理由がなくなった。
    10 年以上 Ruby を愛して本まで書いたけれど、今では fastapipytorchlangchainstreamlit といったエコシステムのおかげで Python の勝ちだ。それでも Ruby の文法は今でも最も美しいと思っている

    • 君が挙げたのは全部Python エコシステムのライブラリであって、言語そのものの利点ではない。多くの開発者は言語ではなくライブラリのために Python へ移っている。その結果、Python はいろいろな方向に引っ張られ、だんだん言語哲学がぼやける問題が生じている。一方で Ruby は言語そのものを好きな人たちが集まっているので、本質をよく保っている
    • 自分も今年 Ruby から Kotlin に移った。静的型付けがないことへの不安が大きすぎた。Kotlin は性能も良いし、メモリを少し多く使う程度はもう大きな問題ではない。Ruby は今でも好きだが、簡単なスクリプトにしか使っていない
    • Python は IDE サポートがずっと良いので、それだけでも移る価値があった。Ruby の過度な動的性は自分の好みではない
    • Langchain を使おうとしたが、変化が速すぎてドキュメントがまったく追いついていない。検索すると「なぜ Langchain のドキュメントはひどいのか」という記事ばかり出てくる。そこで Haystack に切り替えたが、ずっと満足している
    • 自分も pandasnumpypytorch は好きだが、やはり Rails でフルスタック Web アプリを作るのは楽しい。だから pyCall が本当に大好きだ
  • クリスマスに新しい Ruby のバージョンはやはり欠かせない。Matz とチームに感謝したい

  • 2025〜26 年に Ruby を学ぼうとしている人に勧められる最新の資料はあるだろうか? 公式ドキュメント以外で良い本が知りたい

    • 自分は Pragmatic Studio の Elixir と Erlang の講座を受けたが、クオリティが非常に高かった。同じところで Ruby と Rails の講座も提供している
      Pragmatic Studio Ruby on Rails 講座
  • Ruby は本当に素晴らしい言語だ。最近、Rails の上に Markdown ファイル 1 つで API を生成するレイヤーを作ったのだが、Python で同じことをやるならずっと複雑になっていただろう。JavaScript ならもっとひどかったはずだ。Ruby のメタプログラミング能力は本当に唯一無二だ

    • 面白いね。もしよければ、例を見せてもらえる?
  • 内部スタックトレースが整理されたのはうれしい。いつか相対パスもサポートされるといい。それに Set がついにちゃんと扱われるようになったのも良い

    • スタックトレースに相対パスが出るようになったら本当にうれしいと思う
  • 今は Ruby を使わない会社で働いているが、それでも Ruby を深く愛している。今回のリリースに感謝したいし、また使う機会が来ることを願っている

  • 以前、Ruby::Box(名前空間)機能が深刻な性能低下を引き起こすと聞いたことがあるが、今回は改善されたのだろうか

  • ツール周りが改善されたのか知りたい。Windows で LSP をまともに動かせたことがまだない

    • 自分の考えでは、Windows でプログラミングするのはわざわざ苦労を背負い込むようなものだ。Microsoft 言語でないなら Linux や macOS の方がずっといい
    • Ruby の**開発者体験(DX)**は期待以下で、特に Windows ではさらに悪い。幸い、この問題を認識して改善しようという発表があった
    • WSL2 を試してみた?