はじめまして、stmnで働いている@natsuokawaiと@starmiya_miyukiです。
stmnはRubyKaigi 2023にゴールドスポンサーとして協賛させていただいたので、エンジニア2人でRubyKaigi 2023にオフラインで参加してきました!
どのセッションも興味深かったのですが、本レポートでは特に社内でも話題に上がることの多い型関係の5つのセッションについてまとめてみます。
Day1
Generating RBIs for dynamic mixins with Sorbet and Tapioca
Slide: https://drive.google.com/file/d/1W4bmAePVOSbUVe-JUzVcGMbro1HBcWhO/view
tapiocaはRubyのソースコードを読み込み、クラスやモジュール内で定義された定数やメソッド定義の情報を元に型定義ファイルを生成するgemです。
基本的にはうまく動作していたが、dynamic mixins(クラスやモジュール定義の外で呼ばれる prepend、include 、extend)があるコードに関しては、静的な解析だけでは正しく型情報を生成できないという問題がありました。
そこでtapiocaでは、ソースコードのロード時に実際にmixinを実行する機構(これ自体もdynamic mixinである)を備えることにより、mixinされる定数やmixinの種類などの情報を取得できるようになりました。
コメント
メタプログラミングが使われているコードの型情報の生成が難しいという話は色んなところで目にする話題ですが、それに対して同じくメタプログラミングを使って情報を動的に取得するというのはRubyらしくて面白いアプローチだなと思いました。
RBS meets LLMs - Type inference using LLM
LLM(gpt-3.5-turbo)に実装コードから型定義(RBS)を生成してもらおうというお話。
.nameや.buildという自然言語からしっかりname: Stringのような推論をすることに成功していました。
一方で、たまにRBS構文がおかしかったり、不要な出力が混じっていたり、RBSがクラスごとに分割されていなかったりと課題もあったのですが、最終的にはFewShotで模範となるOutput Formatを入力してから推論させることにより、これらの課題を解決していました。
コメント
弊社でもすでに実装コードからSpecの生成にLLMに問い合わせを行っているエンジニアはいるので、RBSの生成タスクはLLMと相性が良さそうだと思いました。
また、明示的に型宣言をしない態度を取るRubyにおいて、自動で型推論してくれるLLM等の組み込みはかなり将来性があるのではないかと感じます。
Day2
Revisiting TypeProf - IDE support as a primary feature
TypeProfは静的型定義のないメソッドやオブジェクトの型を推論するツールです。
すでにRubyに同梱されてはいますが、現状あまり使われていないようです。その原因として、ユーザーのニーズとTypeProf v1が前提としていたことが噛み合っていなかったことが挙げられます。
具体的には、v1ではパフォーマンスを重視しておらず、サポートするコードも完全なコードのみを対象としていたのですが、実際のユーザーのニーズはIDE上でのDX向上なのでそれらはいずれもマストで満たすべき要件であることが分かりました。 そこで、前提を改めたv2をRuby3.3がリリースされるであろう2023年末を目指してリリースしたいということでした。
TypeProf: https://github.com/ruby/typeprof
コメント
TypeProfのデモではIDE(VSCode)上でメソッドの型が補完されている様子を確認できました。TypeProfは明示的に型宣言しないRubyにおいて、とても有力なツールになりえるので年末の高速化されたv2系のリリースが楽しみです。
Day3
Gradual typing for Ruby: comparing RBS and RBI/Sorbet
Rubyの静的型定義のツールとしてRBS/Steep、RBI/Sorbetの2つ存在している。前者はRuby公式であり、後者はStripeやShopifyといったRuby/Railsを使う会社によって開発・利用されている。
このセッションでは両者の型検査の実行速度や表現力の差、RBSをRBIに変換する際の課題などについて紹介していました。
RBI/Sorbet高速である一方でRubyの文法を使うので記法に制約が多い、RBS/Steepは独自の言語なので表現力が豊かである一方で現状Steepによる型検査は遅いのとRuby向けのツールが使えない、というのがざっくりとした比較になります。
コメント
スライドの中ではShopify社員が回答したアンケートの結果もあり、実際に業務でSorbetを使っているエンジニアがどう感じているのかを知れたのは良かったです。どちらのエコシステムもメリットとデメリットがあり、これからRubyに静的型を導入していこうと思うとどちらを使うのが良いかというのは悩ましいですね。
Let's write RBS
Slide: https://speakerdeck.com/pocke/lets-write-rbs
RBS3.1後のrbs subtractとrbs parseの機能について、それらがなぜ必要なのか、実際にどう使うのかがデモを通して解説されていました。
特にrbs subtractはrbs prototypeでRubyから生成された不完全なRBSを整形するために必要とのことでした。
コメント
実際のアプリケーションコードでRBSの修正がされていたので非常に見応えのある内容でした。また、RBS Railsというライブラリも開発されていたのでそちらも気になりました。
Parsing RBS
Slide: https://speakerdeck.com/soutaro/parsing-rbs
RBS(≠Ruby)のコードを書く際のエディタ支援のためにRBSのパーサーをどのように改良したかという話。
引数と返り値の型として同じものを予期している時に適切にサジェストできなかったり、クラス定義のendが閉じられていないと途中のメソッドの候補が表示されなかったりと言った問題があったが、パーサーを改良することにより解決した。
コメント
エディタ支援のために途中で解析を止めてしまわないパーサーをどう作るかという話を実例を交えて知ることができて面白かったです。
感想
RubyKaigiは初参加でしたが、セッション内容に大いに刺激を受け、新たな視点や知識を得ることができました。Ruby自体の実装の話が多かったものの、普段の業務に活かせそうな話題もあったので、社内でも動いていきたいです。
また、Rubyを作っている方々の思いを直接聞けたり、Twitterなどで繋がっていた方と実際にお話しできたりとコミュニティとの交流もでき、とても有意義な3日間になりました。
最後に
株式会社スタメンでは一緒にプロダクトを作っていくRubyistを募集しています。RubyKaigiに参加した方もそうでない方も、ぜひカジュアルにお話ししましょう!