Ruby 3.3.0のアップデートについて調べる
これを読みつつキャッチアップしたことをまとめる
Ruby詳しくないので間違いが含まれてそう。そしたら教えて欲しいです。。
パーサー
新しいパーサーPrismがdefault gemとして導入された。
default gemはRuby本体に同梱しているgemでという意味。
つまり新しくgemをインストールせずに下記のコードが動く。
require 'prism'
pp Prism.parse("100.times { puts it }")
PrismはまだRuby本体(今後CRubyと呼ぶ)では利用されておらず試験段階。
--parser-prism
オプションを指定することで利用できる。
$ ruby --help
...
--parser={parse.y|prism}
--parser=prism
the parser used to parse Ruby code (experimental)
現在のパーサー(parse.y)と比べたPrismのメリットは下記が挙げられている。
- ポータビリティ
- エラートレラント
- 保守性
パーサー開発者やRubyでの開発時にはPrismの恩恵が得られそう。
また、本番で使ってみることに対してはそこまで恩恵が無さそう?
速くなっているのであれば使ってみたいがプログラム全体の速度改善への寄与度は低そう。
計測せずに喋っちゃっているので誰か計測してみて欲しい
もっと知りたい方向けリンク
M:Nスケジューラー
RubyスレッドのスケジューラーとしてM:Nスケジューラーが追加された。
こちらもデフォルトではまだ有効になっていない。
M:NスケジューラーはN個のネイティブスレッド(OSスレッド)の上でM個のグリーンスレッド(Rubyスレッド)を動かすってやつ。
https://zenn.dev/nasa/articles/compare_rust_go_concurrency から引用
あまり理解出来ていないがRactorのパフォーマンス向上を目的としているもののRactorスケジューラーではなくRubyスレッドのスケジューラーっぽい?
Ractorはgroutineのようなタスクの単位だと思っているけどあっているのかな?
その場合 OSスレッド、Rubyスレッド、Ractorの三段構造になっている?
うーん。分からぬ。
もっと知りたい方向けリンク集
YJIT
いろんなパフォーマンス改善が入っている。
- JITコンパイルされたコードのメタデータでメモリを食っていたがこれを減らした
- 様々な速度改善(よく分からなかったので無視。。)
- Rubyで書かれたNESエミュレーターの実行速度がインタプリタと比較して3倍になったらしい(すごい)
YJITはあまり詳しくないので詳細なブログのリンクを
IRB
Unveiling the big leap in Ruby 3.3's IRB を読むと完全に理解出来そう。