名前推論

かなり前の話なのですが、d.y.d.さんにて名前推論というアイデアが。実際に Jikes をベースに Nikes という JavaVM 向けコンパイラを試作されているようです。興味深いのでメモ。

アイデアを要約すると、一時変数にもいちいち名前をつけるのも面倒なので、ひとつしか該当する変数がなければ型名からどのインスタンスかを推論させたり、長い識別子名を全部プログラムに書くのも面倒なので、名前の一部を書くだけで推論させたり、ということをコンパイラの機能に入れませんか、というものです。

一時変数に名前をつけさせる必要はないではないか、という主張にはとても同意します。僕は特に名前を考えるのが苦手なので、プログラミングしている時間のかなりの割合を名前付けが占めている気がします。

ただ、部分的な識別子名からの推論に関しては、やはり IDE のコード補完機能などの仕事ではないでしょうか。推論をコンパイラにさせるということは、推論結果をプログラマが確認できないということです。推論結果が意図したものになっていないことはよくあることですので、やっぱりコード上では一意な識別子の形で確認できたほうがよいような気がします。

コンパイラが同様に推論する関数のオーバーロードも同様に勘違いを生みかねませんので、あんまりいいものだとは思っていなかったりも。設計していて気持ちいいのは確かなんですが……。なお、推論の過程で誤解が生まれないようなヒントの与え方を強制する仕様であれば問題は少ないかな、とは思ってます。名前つきパラメータを導入するとか。

なお、コンパイラが勝手にする推論といえば、OCaml などの型推論もあります。しかし、型推論と今回の名前推論の大きな違いは、推論が意図どおり行われなかった場合の被害ではないでしょうか。型推論がこちらの意図どおりに行われないと、(よほど型多相な関数を多用していない限り)ほぼ間違いなくどこかで型エラーが出ます。一方、型名で名前推論をさせると、万が一意図とは違うものを推論してきてしまっても、型が同じなのでコンパイルは通ってしまいます。これは生産性の観点から見て、非常に大きな違いではないかと思うわけです。

型推論をやりすぎるとソースコードが読みにくい、というのは僕も同意見ですが、それに関しては関数の型くらいは明示的に書いておく、というスタイルを導入することで改善できますし、そうしている人もいるようです。