RubyKaigi のセッションを楽しむための予習会をした - RubyKaigi 基礎知識編
Leaner 開発チームの黒曜(@kokuyouwind)です。
いよいよ RubyKaigi 2023 が目前に迫ってきましたね。
今年は弊社が Rubyスポンサー として協賛しており ドリンクアップも開催するうえ、なんと LT でも発表させていただけることになりました!
いろいろ盛りだくさんなので今から本当に楽しみです!
社内で RubyKaigi の予習会をした話
今回、弊社からは RubyKaigi が初めてのエンジニアも数名参加します。
思い返せば自分が初めて RubyKaigi に参加したのは RubyKaigi 2015 ですが、当時は Ruby や Rails に触れて半年ほどしか経っておらず、現地に行ってから「あ、 Rails の話はほとんどないんだなー」と思いつつセッションを聞いていたのを覚えています。
さすがに今回初参加のメンバーは当時の自分ほど知識が浅いわけではないですが、ある程度の基礎知識はあったほうが聞くセッションを選びやすいし楽しめるだろう、ということで「セッションを楽しむための予習会」を社内で行いました。
内容は以下の 2 点についてを大まかに話した形です。
- RubyKaigi の基礎知識
- RubyKaigi の特徴
- これまでどんな流れがあったか
- 今回はどんなセッションがあるか
- Ruby 処理系の基礎知識
- Ruby 処理系の種類
- CRuby でソースコードが実行されるまでの流れ
今回はこのときに話した内容のうち、「RubyKaigi の基礎知識」の部分を記事にまとめます。後半の「Ruby 処理系の基礎知識」については時間があったら頑張って別記事にまとめます。
RubyKaigi の基礎知識
RubyKaigi の特徴
RubyKaigi はその名前の通り、 Ruby 言語のカンファレンスです。ただ特徴的なのは、 Ruby の利用者だけではなく Ruby の開発者(コミッター)も多く集まっていることです。これは他の言語の国内カンファレンスでは珍しいと感じていて、国産言語ならではと言えるでしょう。
セッションの内容も Ruby on Rails のような「Ruby で何を作ったか」の話よりも、処理系の高速化や機能改善など「Ruby 言語自体の話」が多くなっています。また最近ではデバッガーや静的型付けなどの開発ツールの話も多いです。
そういった傾向があるため、大雑把にでも Ruby 言語自体がどう作られていてどう動いているのかを知っておくと「このセッションは構文解析の話だな」「このセッションは JIT とタイトルに入っているから高速化について話しそうだ」といった文脈を把握でき、セッション選びや聴講がより楽しくなります。
これまでどんな流れがあったか
Ruby 言語の機能開発・改善のセッション内容は、当然ながら今開発していて新しいバージョンの Ruby に入る、ないし入れたいものの話です。そのため、セッション内容の傾向は Matz やコミッター陣が「今後 Ruby をどう進化させたいか」が反映されていると言えます。
個人的な印象ですが、現在の Ruby 開発は Ruby 3 の開発時に Matz が掲げた目標の延長線にあるものが多いと感じます。なお Ruby 3 自体は 2020 年にリリースされており、現在の Ruby バージョンは 3.2 です。
ここで掲げられている目標は以下の 3 つです。
並行処理
複数コアを活かせるよう、並行処理を扱うための抽象度が高いモデルを提供するという目標です。 Fiber Scheduler と Ractor の開発に繋がりました。
Fiber Scheduler は軽量スレッドを扱うクラスである Fiber の切り替えを I/O などのブロック操作フックで行えるようにするものです。
Ractor はアクターモデルで並行処理を実現する機能です。アクター同士で共有できるリソースを限定することにより、各アクターが並行で実行できることを保証しています。
この 2 つの仕組みはどちらも Ruby 3.0.0 でリリースされています。 Ractor については experimental 扱いになっており、今も開発や機能改善が進められています。
人とマシンとの協調
賢いエラー表示や開発サポートのため、静的解析などを実現したいという目標です。特に静的型検査に力が入れられ、 RBS という型定義言語の策定と、 Steep・TypeProf の開発に繋がりました。
RBS は「Ruby の型宣言を記述する言語」です。他の言語では実コード内に型宣言を記述することが多いですが、 Ruby では型定義を別ファイルに別言語で記述する方式を取っています。[1]
Steep は RBS を使った静的型検査ツール、TypeProf は型レベル実行という仕組みで RBS を生成するためのツールです。
Ruby 3.0.0 では RBS 言語仕様及び RBS ファイルを扱うためのライブラリが同梱され、 Steep や TypeProf はサードパーティーツールという形を取っています。
なお、 RBS と似た仕組みとして Sorbet というツール、及びその型定義言語である RBI があります。こちらは Stripe 社が独自に作った型検査ツールです。 RBI と RBS に互換性はないため注意が必要です。[2]
Ruby 3x3
Ruby 2.0 より 3 倍速くするのを目標にするという目標です。特に JIT コンパイラに力が入れられ、 MJIT や YJIT の開発に繋がりました。
MJIT は CRuby の最初の JIT コンパイラで、 CPU 中心のベンチマークで 3 倍の高速化を達成しました。
YJIT は Spotify が Rails アプリをターゲットに開発した JIT コンパイラで、大規模アプリケーションでの性能向上を実現しています。
Ruby 2.6.0 で MJIT が実験的にリリースされた後に機能改善が進められました。 Ruby 3.1.0 では YJIT が Ruby 本体に実験的機能として導入され、 Ruby 3.2.0 では実験的フラグが外され実用段階になっています。
今回はどんなセッションがあるか
上記の開発目標の延長線にあるセッションを順にまとめます。
並行処理(Ractor)
Ractor については機能開発者の @ko1 さんによる "Ractor" reconsidered が Day 1 にあります。機能改善についての話がされそうで楽しみです。
人とマシンの協調(RBS / Steep / TypeProf)
前回の RubyKaigi 2022 では RBS をどう生成するかの話が多かったですが、今回は IDE や REPL でどう活用するかの話が多そうです。
また最終日の Keynote は Steep 開発者の @soutaro さんによるParsing RBSになっています。書いている途中のコードをどうパースするかということで、テクニカルで面白い話になりそうです。
人とマシンの協調(RBI / Sorbet)
静的型検査の中でも RBI や Sorbet は別のツールになるため節を分けました。
@Morriar さんによるGradual typing for Ruby: comparing RBS and RBI/Sorbet
は RBS と RBI/Sorbet の比較ということで、興味深い内容になりそうです。
Ruby 3x3(JIT)
JIT のセッションは C 言語やメモリ配置レベルのローレイヤー知識を求められることが多く、内容を理解するのが結構大変です。今回は @k0kubun さんによるRuby JIT Hacking Guideで Ruby を使った JIT の話があり、こちらは比較的聞きやすい内容になりそうです。
まとめ
RubyKaigi の特徴やセッションの傾向をまとめました。これを読むことで RubyKaigi 初参加の方がより楽しめるようになれば幸いです。
もし間違いなどあったらコメント欄などでご指摘いただけると助かります。
-
OCaml の
.mli
ファイルなど、インターフェイス宣言を別ファイルで行う言語もいくつかあります。 ↩︎ -
Sorbet FAQでは RBS フォーマットもサポートする予定と書かれていますが、ドキュメントを見た限りでは未対応のようです。 ↩︎
Discussion