今年のYAPC Asia 2013にはTypes and Perl Languageというタイトルで話をしようと申し込んだのだけど、リジェクトされそうな気しかしないので話そうとしていることの概要を書いておく。なお、トークのタイトルは名著TaPLのオマージュである*1。
以下のGoのコードをきちんと型付けされていると言って、異論を持つ人は少ないだろう。
func inc(x int) int { return x + 1 }
では、以下のperlのコードはどうだろう?
sub inc { $_[0] + 1; }
型がないという人もいれば、実行時に型を意識しているのだから型はあると反論する人もいるだろう。しかし、さらに別の見方として、このコードは先ほどの正しく型付けされたGoのコードから型の指定をとりはらったものだとも言える。という事は、もし、GoとPerlでプログラムを実行するルールが大差ないとすれば、型を書いていないPerlのコードも型を明示したGoのコードと同様の安全性を持つと言えるだろう。
これを逆に考えると、Perlのような型のないコードからGoのように型を指定したコンパイルが通るコードが作れるかどうか考えることで、そのPerlのプログラムが静的に型を指定する言語と同程度に安全なのかどうかを判断できるということになる。ご存知の方も多いと思うが、この考え方は型推論と呼ばれている。
ところが、型による安全性の判断には、正しく動くものも拒否してしまうという問題が付きまとう*2。動的型付けの言語を好む人にとって、静的言語を好きになれない要因の1つだろう。例えば、ジェネリクスのない型システムでは以下のコードは型付けができず安全なコードだと判断することができない。idの引数がIntなのかStrなのかはっきりしないからだ。しかし、Perlでこのコードが正しく動くことは一目瞭然だ。
sub id { $_[0] } id(0); id("XYZ");
この問題については、多相型という型変数を伴う型を導入すれば、このプログラムも正しく型付けをして安全であると判断することができる。このように、型の付くプログラムは型の付けられないプログラムより自由度は低いが、型システムをリッチにすることで自由度を高めることはできる。型のついた安全なプログラムで、プログラマが不満を感じないよう表現力を高めることができるのは、型理論と呼ばれる研究分野の成果によるところが大きい。
YAPCではこのような型にまつわる話をもう少し詳しく説明すると共に、Perlにおける型推論の可能性について試行錯誤した内容を話そうと思っている。具体的には以下のようなトピックに触れるつもりだ。
興味を持った方はトークの応募ページからTwitterやfacebook、はてブ経由で投票して欲しい(じゃないとリジェクトされるので話せなくなる:p)。なお、サンプルの検査機としてTypedPerlなるものを鋭意実装しているので、この出来栄え次第で話の内容が変わることも付け加えておく。