CurryBu を Ruby 3.0 にアップデートした
Ruby 3.0.0 がリリースされたので Ruby 2.7.2 からアップデートした。
一つだけハマったが、あとはすんなりアップデートできた。
SortedSet が Ruby 本体から削除された影響
bin/rails c
などのコマンドを実行すると以下のエラーが発生した:
% bin/rails c
~/.rbenv/versions/3.0.0/lib/ruby/3.0.0/bundler/runtime.rb:69:in `rescue in block (2 levels) in require': There was an error while trying to load the gem 'compass-rails'. (Bundler::GemRequireError)
Gem Load Error is: The `SortedSet` class has been extracted from the `set` library.You must use the `sorted_set` gem or other alternatives
Ruby 3.0 で Ruby 本体から SortedSet が削除されて Gem に分離された件。リリースノートにも記載がある。
SortedSet has been removed for dependency and performance reasons.
これはメッセージにある通り、sorted_set
gem をインストールすることで解決した。
gem 'sorted_set'
sorted_set
は Ruby コミッターの knu さんによってメンテナンスされている Gem。
内部の要素をソート済みのセットとして扱うクラスを提供する。内部的には rbtree gem を使っている。
- RubyGems: https://rubygems.org/gems/sorted_set
- GitHub: https://github.com/knu/sorted_set
SortedSet を使っている箇所を探す
SortedSet を使っている箇所を確認するために ag で grep した。
% ag SortedSet .
gems/coderay-1.1.3/lib/coderay/scanners/java/builtin_types.rb
354: SocketTimeoutException SoftBevelBorder SoftReference SortControl SortedMap SortedSet
gems/chunky_png-1.3.14/lib/chunky_png/palette.rb
15: class Palette < SortedSet
63: # Palette subclasses SortedSet, we get significantly better performance
compass-rails または compass で使われているのかなと想定していたが、 compass が依存している chunky_png で SortedSet を使っていた。
coderay については Java のモジュール名が配列で羅列されていただけなので関係なかった。
パフォーマンス
パフォーマンスの改善は Ruby 3.0 の目玉の一つだが、サービスや RSpec の実行においては体感できるほどの変化はなかった。
これは Ruby 3.0 のリリースノートでも書かれている通り、パフォーマンスの改善については発揮できるワークロードが限られているとのこと。 Ruby 3.1 に期待。
Ruby 3.0 では生成コードのサイズを大幅に削減したものの、Rails のような、様々なメソッドを満遍なく呼び出す i-cache への負荷が大きいワークロードでは、JIT がその負荷を大きくしてしまうため性能を改善できる状態にはまだ至っていません。Ruby 3.1 での改善にご期待ください。
静的解析
静的解析についても大きなトピックだが、関連するツールが 3 つ存在する。
上記の記事をまとめると以下の役割がある。
- RBS: RBS 言語と呼ばれる型情報を記述するための記法、組み込みライブラリの型情報、ライブラリ、コマンド群。Ruby 3 に同梱。
- TypeProf: 型注釈のない Ruby コードを解析する静的型解析器。Ruby 3 に同梱。
- Steep: RBS を使った静的型検査器。漸進的型付けによる型検査を行うことができる。Ruby 3 に同梱される予定はない。
もし Ruby コードに型付けをしたいとなった場合は、3 つのツールを使う必要がある。
型解析ツールには Sorbet という Stripe 製のツールもある。こちらは数年前から開発が進められており、今も開発が活発。
いずれも試したことがないので、試してみたいと思う。
これからの Ruby が楽しみ。開発に関わっている方々に感謝。