前提
ども、Rubyエンジニアです。
最近は静的型付け言語の流行に伴いRubyの人気が下がってきてるようで寂しいばかりです。
静的型付け言語が流行している理由を調べる中でRuby Kaigi 2021で遠藤さんがお話しされていた
TypeProf for IDEのことを思い出したので、動画振り返りながら自分の理解を深める為に所感含めてまとめてみました。
すでに変化している内容もあるかもしれませんがご了承ください。
なぜ静的型付け言語が流行っているのか?
まず静的型付け言語とは?
変数や返り値の型を明示的に定義する言語
例:Java, C言語, Go, TypeScript
型を定義しながら実装することで、現代的な開発体験ができるから流行しているらしい
現代的な開発体験って?
- エラーレポーティング
- 補完
- 引数のヒント
- 定義元へのジャンプ
が挙げられる(他にももっとある)ので、TypeScriptを例に順番に説明していきます
-
エラーレポーティング
実行前、もっと言えばファイルが保存される前にエラーの所在と原因を忠告してくれる
動的型付け言語と違って、実行して初めてエラーの発見することを避けることができます
-
補完
そもそもエラーを出しにくくしてくれるサポートです。
コードの文脈から次に書かれるであろうメソッドや引数をサジェスチョンしてくれる
-
引数のヒント
補完と似ていますが、引数を必要とするメソッド名を書いて「()」を書くだけで与えられるべき引数の個数と型をサジェスチョンしてくれる
-
定義元へのジャンプ
メソッドの呼び出し先で右クリックして「Go to Definition」をクリックすることで定義元へ飛ぶことができる
↑
たしかに便利。昔の開発体験を経験した訳じゃないが、現代的っぽい。
ただ、これって静的型付け言語で開発しないと受けられない恩恵だっけ?
いやrubyでもできるようにすればいい!というのがTypeProf for IDEです。
TypeProf for IDEの前に TypeProfって何?
動的型付け言語であるrubyの型を予想してくれる型推論のツールです
※TypeProf for IDEの型推論の仕組み
一般的な処理:引数に渡された値をメソッドの定義元で参照し、評価した結果を返す
型推論の処理:まずは引数の型を評価し、型の情報のみをメソッドが評価し、返り値の型を判定し返す
その上で実際に渡される値を改めて確認し計算する
実際にTypeProf for IDEをInstallしてみると
Use Ruby 3.1.0 or later, and TypeProf 0.20.0 or later
Add gem "typeprof" to your Gemfile, and execute bundle install
とあるので、Ruby 3.1.0 以降でTypeProf 0.20.0以降を使用し
typeprof gemをインストールすることで利用できるようになるそうです。
(今回は時間がなくて手元で動かせませんでしたmm)
おおおrubyファイルなのに静的型付け言語のように型の情報が表示されている!
これで先ほどの現代的な開発体験(エラーレポーティング・補完・引数のヒント・定義元へのジャンプ)がrubyでもできる!すごい!!!
ただ、まだ完璧ではなく欠点や注意点があります。
欠点・注意点
-
RBSに型を定義していくのが面倒
型を表示している薄いグレーになっている箇所をクリックすることで.rbsファイルに飛びすぐに定義ができるが、
やはり別ファイルに記載することは少し工数という印象 -
実行速度が遅い
遠藤さんも念を押してましたが、かなり遅くなるっぽい
理由としてはrequireしたgemやファイルがあればその中身をすべて解析し型推論する為
→しかしこれには対策を打っているみたいで、1秒以内に解析できないファイルは無視する実装になっている
これは1ファイルの実装量を減らすきっかけにもなるから完全悪ではないかなという印象(gemなどは仕方ないが) -
特殊な動き
- 引数に誤った型を渡すと、メソッドの定義元でエラー表示される
RBSで定義してしまえば呼び出し元でのエラーになる
表示の先頭に「#」がついていればRBSで定義済の意味 - エラーのハイライトが実行文全体に表示されてしまう
今後改善予定とのこと
- 引数に誤った型を渡すと、メソッドの定義元でエラー表示される
所感
業務で主にrubyを使っていますが色々調べていると静的型付け言語の開発体験の魅力にヤラれそうです。
ただこのようにrubyでも同様の恩恵が受けられるのであれば最高ですね!
今後もrubyと型の話は活発化しそうなので注目すると共に、手元で動かしてみるようにします