Ruby 3.3.0-preview2がリリースされました。
Link: Ruby 3.3.0-preview2 Released https://t.co/xtrfnhANJh
— Yukihiro Matz (@yukihiro_matz) September 14, 2023
- リリース情報: Ruby 3.3.0-preview2 リリース
詳しくはリリース情報をご覧ください。
🔗 preview2で注目した点
YJITの高速化
YJITに多くの最適化が加えられています。
以下のサイトで非常に詳しいベンチマーク結果を見られます。過去の記録はもちろん、アーキテクチャごとの結果(x86_64とaarch64)やmemory usageなども参照できます。
参考: speed.yjit.org
Bisonとext/readlineへの依存が解消された
以下の記事に書いたように、Ruby 3.2までのビルドはBisonに依存していました。pure Rubyで書かれたLALR (1)パーサージェネレータであるlramaが導入されたことで、ビルドでBisonに依存しなくなりました。
また、これもpure Rubyで書かれたrelineによってext/readlineが削除され、ビルドで従来のGNU readline(またはNetBSDのeditline)に依存しなくなったそうです。
参考: GNU Readline - Wikipedia
参考: editline(3) - NetBSD Manual Pages
YARPがdefault gemとして含まれている
Shopifyによる新しいRubyパーサーであるYARPがdefault gemとして含まれています(なお、Ruby 3.3.0-preview1には含まれていませんでした)。
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
例: Standard Gems 3.3.0(preview)
例: Standard Gems 3.2.2