Rubyの静的型解析を触った感想を書いたりする

この記事は Opt Technologies Advent Calendar 2020 10 日目記事です
12/25にリリースしたRuby 3.0を使った話をしているので時空が歪んでるように見えますが気のせいです

9 日目の記事は @shachitaku さんの M5StickC x JoyStick HATで寝ながらパソコンを操作できるBluetoothマウスを作ってみた です
11 日目の記事は @shoyaokayama さんの LINEThingsとM5CoreInkを使ってO2Oマーケティングを体験してみる です


Ruby 3.0の目玉機能として静的型解析のサポートが挙げられるでしょう
最近仕事ではRailsを書いてるけど、もともと静的型付け派な自分としては大変気になる機能なので試してみて感想を書き残しておこうと思った次第

良かった点は静的に型情報を解析できるようになる、に尽きるので、基本的に足りない点を指摘することに終始する点、ご了承いただければと

結論

まだ早い(そりゃそう)
自分が求める体験との乖離が結構大きかったのと、エコシステムが粗く、これからどんどん変化していくと思うので追従が当面の間かなり大変だろうという所感
(実際に使ってフィードバックしたりして貢献していかないと進化していかないだろうから使いたい気持ちもある)

触った感想とか

  • steep checkが遅い
    • rails newしただけのコードを全解析すると15secほどかかった(MacBookPro 13inch 2019モデル)
    • ファイルに閉じてるエディタ上での解析は気にならないけど、やっぱりクラスを書き換えたらそのクラスの利用側でコンパイルエラーが出てる場所を全て見る、というような利用シーンにプロジェクト全体のコンパイルは必須なのでこれが遅いのはしんどい
  • 実装を変更するたびに型定義を更新しないといけない
    • watchモードもなさそう・仮にあったとしてもtsでの経験上、ファイルシステムを挟んでしまうと遅くなるので今後パフォーマンス対策大変そう(Steep,TypeProf,エディタがそれぞれ全て速くないと良い開発体験にならなそう)
    • これは仕組み上しょうがないので、上手いこと良い開発体験になるエコシステムが出来てくるといいなあと思った
  • エディタサポートが弱い
    • RubyMineやSolargraphが「実装への」定義ジャンプまでやってくれるのに対してsteep-vscodeは*.rbファイル上で実装を書くときにメソッドのシグネチャが補完されるだけ
    • RBSRuby本体にバンドルしているので、LanguageServer実装も本体に入れて実装へのジャンプや型定義取得などが自在にできるようになっててほしい(それが出来るのかは・・・)(RubyMineの定義ジャンプなんかはRails向けに相当気を利かせた実装になってるようだし、それ相当の体験をRuby本体がバンドルするようなツールが出来るのかというと・・・みたいな)
  • 現状はRBS作ってもuntypedな部分を厳格にしようとすると生成したコードを書き換える必要がありそう?
    • 理想的には実装を書き換える→TypeProfによるコード生成→自動で補完!だと思うけど、そうなると自動生成されたRBSファイルを直接変更じゃなくて上書きのような形にしないと継続的にTypeProfの世話になることが出来なくて難しそう。どういう方針なんだろう
  • 型定義ファイルの取得方法がgemなどのツールでサポートされていない(git submoduleとかで取ってきてそのパスを指定する必要がある)
    • これはSteepの問題ではあるけど、SteepってRubyにバンドルされてるわけじゃないから、そこまでgemなどの公式サイドのツール側でサポートしてくれるようになるんだろうか?という疑問はある
  • irbのようなREPL環境でも型情報が使えるようになってほしい

その他の感想

そもそも疑問なんだけど、型定義ファイルの生成と型定義ファイルそのものを扱うライブラリが本体にバンドルされても静的解析ツール(Steep)が本体に入らないのってどういう理由なんだろうか
RBSファイルの存在は最終的にSteepありきになるはずなのでSteepに特化した機能を入れたくなりそうなもんだけど非公式のツール相手にそこまでやれるもんなんか、みたいな
Rubyの開発方針とか詳しくないので、本体には入ってないけど実質公式みたいなもんだからいい、みたいなのもありそうではあるけど

終わりに

まだ実装を書いておらず、ほぼツールチェイン周りへの感想なのだけど、それでこれだけ出てくるので中々に前途多難を感じる
CIとか組み込んで実際の開発体制に組み込めるか?という点や型の解析周りでの感想は追々やっていけたらなと

参考資料・関連リンク

RBS Railsを使ってRailsアプリケーションにSteepを導入する - pockestrap

GitHub - soutaro/steep-vscode: VSCode extension for Steep

Rubyで型チェック!動かして理解するRBS入門 〜サンプルコードでわかる!Ruby 3.0の主な新機能と変更点 Part 1〜 - Qiita

rbs/syntax.md at master · ruby/rbs · GitHub

Ruby 3の静的解析機能のRBS、TypeProf、Steep、Sorbetの関係についてのノート - クックパッド開発者ブログ

Ruby 3 の静的解析ツール TypeProf の使い方 - クックパッド開発者ブログ