Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

Ruby 3.3.0-preview2がリリースされました

Ruby 3.3.0-preview2がリリースされました。

詳しくはリリース情報をご覧ください。

🔗 preview2で注目した点

YJITの高速化

YJITに多くの最適化が加えられています。

以下のサイトで非常に詳しいベンチマーク結果を見られます。過去の記録はもちろん、アーキテクチャごとの結果(x86_64とaarch64)やmemory usageなども参照できます。

参考: speed.yjit.org

Bisonとext/readlineへの依存が解消された

ruby/lrama - GitHub

以下の記事に書いたように、Ruby 3.2までのビルドはBisonに依存していました。pure Rubyで書かれたLALR (1)パーサージェネレータであるlramaが導入されたことで、ビルドでBisonに依存しなくなりました。

M1 MacでRuby 2.4〜3.2をrbenvでビルドする最小限のセットアップを全部調べた

ruby/reline - GitHub

また、これもpure Rubyで書かれたrelineによってext/readlineが削除され、ビルドで従来のGNU readline(またはNetBSDのeditline)に依存しなくなったそうです。

参考: GNU Readline - Wikipedia
参考: editline(3) - NetBSD Manual Pages

YARPがdefault gemとして含まれている

ruby/yarp - GitHub

Shopifyによる新しいRubyパーサーであるYARPがdefault gemとして含まれています(なお、Ruby 3.3.0-preview1には含まれていませんでした)。

Rubyパーサーを一新するYARPプロジェクトの全容と将来(翻訳)

YARPでは以下のような感じで構文解析できます。構文上の位置情報なども詳しく出力されています。

irb(main):001> require 'yarp'
=> true
irb(main):002> YARP.parse("puts 'a'")
=>
#<YARP::ParseResult:0x0000000103ae51b0
 @comments=[],
 @errors=[],
 @source=#<YARP::Source:0x000000010ca9f238 @offsets=[0], @source="puts 'a'">,
 @value=
  @ ProgramNode (location: (0...8))
├── locals: []
└── statements:
    @ StatementsNode (location: (0...8))
    └── body: (length: 1)
        └── @ CallNode (location: (0...8))
            ├── receiver: ∅
            ├── call_operator_loc: ∅
            ├── message_loc: (0...4) = "puts"
            ├── opening_loc: ∅
            ├── arguments:
            │   @ ArgumentsNode (location: (5...8))
            │   └── arguments: (length: 1)
            │       └── @ StringNode (location: (5...8))
            │           ├── opening_loc: (5...6) = "'"
            │           ├── content_loc: (6...7) = "a"
            │           ├── closing_loc: (7...8) = "'"
            │           └── unescaped: "a"
            ├── closing_loc: ∅
            ├── block: ∅
            ├── flags: ∅
            └── name: "puts",
 @warnings=[]>

なお、従来のRipperだと以下のようになります。

irb(main):001> Ripper::Lexer.parse("puts 'a'")
=>
[#<Ripper::Lexer::Elem: on_ident@1:0 CMDARG token: "puts">,
 #<Ripper::Lexer::Elem: on_sp@1:4 CMDARG token: " ">,
 #<Ripper::Lexer::Elem: on_tstring_beg@1:5 CMDARG token: "'">,
 #<Ripper::Lexer::Elem: on_tstring_content@1:6 CMDARG token: "a">,
 #<Ripper::Lexer::Elem: on_tstring_end@1:7 END token: "'">]

参考: class Ripper::Lexer (Ruby 3.2 リファレンスマニュアル)

MJITがRJITに置き換わった

RJITはpure Rubyで書かれています。RJITはproduction向けではなく、JITの実験のみを目的としています。

参考: RJIT: RubyでRubyのJITコンパイラを書いた - k0kubun's blog

参考: default gems / bundled gemsについて

default gemsやbundled gemsの編成はしばしば変更されます。

default gemsとbundled gemsの違いについては、以下の記事が参考になります。

参考: standard librariesとdefault gemsとbundled gemsの違い - ESM アジャイル事業部 開発者ブログ

リポジトリのbundled gemはgems/bundled_gemsで確認できます。

ruby/gems/bundled_gems at master · ruby/ruby

また、公式ではないようですが、以下のサイトではRubyバージョンごとにdefault gemsやbundled gemsの編成を確認できます。

参考: Standard Gems

janlelis/stdgems - GitHub

例: Standard Gems 3.3.0(preview)
例: Standard Gems 3.2.2

関連記事

Ruby 3.2.0がリリースされました


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。