この記事は何
Qiita株式会社では技術的な勉強会を定期的に開催しています。
この記事はRuby3から導入されたRBSについて発表をしたときの社内の資料をQiita用に修正したものです。
RBSとは
RBSというと大体二つの意味で話す。
- ruby3.0から導入されたRubyの型定義を記述するための言語。(RBS=Ruby Signeture) →この記事では便宜上
RBS
と書く - RBSファイルを扱うためのgem (https://github.com/ruby/rbs) →この記事では便宜上
rbs
と書く- 標準ライブラリ/組み込みクラスの型ドキュメント
- 特定の型に対しての親情報やメソッドの型情報を逆引きできる
- RBSの解析
- 標準ライブラリ/組み込みクラスの型ドキュメント
https://github.com/ruby/rbs より
RBS is a language to describe the structure of Ruby programs. You can write down the definition of a class or module: methods defined in the class, instance variables and their types, and inheritance/mix-in relations. It also allows declaring constants and global variables.
RBS自体は言語の定義でしかないので、これ自体に意味はない。
実際の業務では以下の二つのライブラリを用いることで、Rubyのプログラミングに型の恩恵を受けられるようになる
- TypeProf
- 型注釈のない Ruby コードを解析する静的型解析ライブラリ
- Steep
- Ruby の静的型検査ライブラリ
- LSPも含む
RBSではなく、RBIというStripeが独自に開発した型定義言語もある(Sorbetで利用)
ちなみにRBSとSorbetのプロジェクトは密接にコミュニケーションをとっているらしく、相互変換を行えるようにしていく模様
ここを読むとTapioca
というプロジェクトでRBS→RBIを実現できそう。
元々はRubyの標準もRBI想定していた模様。(SorbetのRBIとは別のものを指している可能性もあり)
背景とコンセプト
- Ruby3の3本の柱
- パフォーマンスの改善
- Concurrency
- 静的解析→この中で生まれたのがRBS
- 2010年代に入ってから静的型付け言語の人気が高まっており、動的型付け言語でも型注釈を提供する流れが出てきた
- 2010年前後に現れた言語: Go, TypeScript, Swift, Kotlin, etc...
- システムの大規模化の中で、静的型付けの強みである「保守性」「パフォーマンス」が注目されてきた
- LSPやIDEなどの開発環境の進化
- トラフィックの大規模化
- https://www.oracle.com/webfolder/technetwork/jp/javamagazine/Java-JF18-editorial.pdf
- 動的型付け言語の静的解析は「保守性」の部分を担保するためのアプローチ
- Rubyのアプローチは他の動的言語の型注釈とは違い、「型の情報は既存のRubyコードとは完全に分離する」というアプローチをとっている
- 理由
- Rubyは思想として「既存のRubyの書きごこち」を重要視している
- やりたいことをシンプルに記述できる
- 「書いていて楽しい言語」
- 型に対しても、できるだけ書き手が考えなくても良い状態を目指している
- 既存のコードからの型推論(TypeProf)
- →アウトプットとして別のファイルに書き出す
- Rubyは思想として「既存のRubyの書きごこち」を重要視している
- Ref
- 理由
RBSの現状
GitHubでの*.rbs
の検索結果→19,000ファイルほど
rbs_collection
を使うことで、gemにrbsファイルがあればその情報を取り込むことができる。
また、gems_rbs_collection
にgemのRBSが定義されている→npmの@types
と同じようなイメージ