この記事は SmartHR Advent Calendar 2023 シリーズ 1 10日目の記事です。
今回は、2023年のクリスマスにリリースされるであろう、Ruby 3.3について書こうと思います。
前提
Ruby 3.3はまだリリースされていません。 ですのでここで言及するRubyのバージョンは正確には 3.3.0-preview3 です。ご注意ください。
Ruby 3.2からの変更点の確認方法
Ruby 3.2と比べて、どのようなものが追加され、または変更・廃止されたのかをみていきます。
変更を確認するには主に2つの手段があります。
ruby-lang.org で確認する
ruby-lang.orgには、ニュースの一つとしてリリースされたバージョンのニュースがあります。その中には、 preview版やRC版についてもありますので、今回説明するバージョンの場合は Ruby 3.3.0-preview3 リリースで確認することができます。
余談ですが、ruby-lang.org のニュースはRSSを配信しています。最新のニュース(RSS) で購読できますので、興味のある方は登録をお勧めします。
GitHubで確認する
RubyはGitHubで開発されています。ですので、Ruby 3.2 からの変化はReleasesやTagsから確認できます。
Diffは3.2.0から3.3.0-preview3のCompareで確認できます。
ただ、こちらの確認方法では全てのコミット、 Diffが表示されるため、内容の確認には適していません。現時点で5000件以上の Commits,File changedがあります。
GItHubのCompareは「Rubyはこのように作られているのだな」を感じることができますので、そこがお勧めです。
Rubyのmasterブランチへのcommitsについて毎日ブログで説明をされているRuby trunk changes という偉大なブログがありますので、こちらもご参照ください。
何が変わったの?
ここでは、全ての変更ではなく一部の変更点をピックアップして紹介していきます。
上記で紹介したruby-lang.orgのニュースをベースにしていますので、詳細はruby-lang.orgをご参照ください。
Prismパーサーの導入とパーサージェネレーターの置き換え
Prismは、移植性が高く、でエラーにも強く、メンテナンス性にも優れた再帰降下型パーサーです。(ほぼ直訳です)
合わせてパーサージェネレーターがBisonからLramaというものに置き換わるようです。
RJITの導入とYJITの高速化
RJITとは、Ruby製のJITコンパイラのようです。まだ実験的な段階で本番環境での使用は推奨されておらず、本番環境ではYJITの使用が推奨されていました。
YJITも3.2と比較して大幅な速度改善がなされているようです。
IRB(抜粋)
IRBとrdbgの連携 pry-byebugのような使い心地でデバッグできるようになったようです。
使い方については以下のURLで説明されています。
https://github.com/ruby/irb#debugging-with-irb
標準添付ライブラリ関連(抜粋)
ext/readline
が削除され、今後はRubyで書かれた GNU Readline の互換ライブラリであるreline
が使われるようです。
新しいPCにRubyをインストール際に高確率でreadlineのためのライブラリが足らず怒られたり、docker imageを作る際に一手間必要だったりしていたので、この変更は地味にありがたいものだと感じました。
一部の変更点のピックアップは以上です。
全体として、Rubyを使って開発をする人に影響があるものというよりは、Ruby自体の開発に影響するものとRubyの高速化という印象を受けました。
開発環境をより使いやすいものにしていく事は、どのような開発においても重要なものだと思います。大事!
おまけ: Ruby 3.4のとある変化について
RubyKaigi 2022 の Ruby Committers vs The World で、ブロック引数 _1
についてのお話があったことはまだ記憶に新しいと思います。
この議論について、つい先日大きめな決定がなされました。
https://bugs.ruby-lang.org/issues/18980#note-47
以下上記リンク先の引用です。
In today's Developers Meeting, @matz (Yukihiro Matsumoto) accepted to warn it in Ruby > 3.3 and add it in Ruby 3.4. Quote from the meeting notes:
- matz: accept it on Ruby 3.4.
- ruby 3.3 will warn and ruby 3.4 will use the new semantics
- The warning should be printed always (even without $VERBOSE)
I also copied the discussed specification to the ticket description. In Ruby 3.3, it should be warned only when it will behave like _1 in Ruby 3.4.
ブロック引数の仮引数として it
を使うことについてacceptされ、Ruby3.4に入る。という内容です。
これに伴い3.3にも(今回説明しているpreview3には入っていないですが) _1
と同じような振る舞いをする it
について警告が出るようになります。
_1
のような振る舞いをする it
にのみ警告を出すという内容の難易度について私は想像することしかできませんが、parse.y
になんらかの変更を行うことになるのかなぁ、と素人ながら想像しました。
なお、3.3で警告を出すようにするという言及はありましたが、3.3.0
という言及はありませんので、おそらく3.3.0にはこの変更は入らないのではと考えています。
まとめ
今回は、Ruby3.3でどのような変更が入るのかをどのように確認できるのかと、その変更点の一部について書きました。
これを書くのを通して、我々Rubyist、ひいてはソフトウェアエンジニアが偉大な巨人の肩の上に乗っていることを再認識しました。
巨人たちのように振る舞えなくても、何かを手伝ったり貢献がしたい!と少しでも思ってくれる人が増えるといいなぁと考えながらこと記事を書きました。
おまけのおまけ: We Are Hiring!
SmartHR では一緒に SmartHR を作りあげていく仲間を募集中です。カジュアル面談もやっていますので、以下のプロダクトエンジニア採用サイト(最近リニューアルしました!)からどうぞ〜〜〜
https://hello-world.smarthr.co.jp/