Satherの話をきっかけに、 静的型言語好きの前田くんと、 静的型について議論する。
Rubyなんて動的型の代表みたいな言語を作っている私だが、 実は昔はEiffelの影響を受けて静的型オブジェクト指向言語至上主義だったのだ。 卒論で作った言語も静的型言語だったし。
静的型のメリットと言えば、以下のようなものであろう。
最適化しやすい。
型情報が分かっていれば、 動的結合を省略して直接呼び出しを行ったり、 式の展開・畳み込みを行う余地がある。 Rubyみたいな言語を作ってると「お前は最適化にウラミでもあるのか」というくらい最適化しにくい。
間違いが検出しやすい。
型情報で全部の間違いが検出できるわけではないが、 単純なタイプミスやロジックミスが型の不整合として検出できるのは、 「実行してみないと分からない」動的言語よりも嬉しい
もちろん、どちらも嬉しいのだが、スクリプト言語が台頭した背景を考えてみると、 実行効率に貢献する「最適化」よりも開発高率に貢献する「間違いの検出」の方が重要度が高いといえるような気がする。
しかし、実際には最近登場する言語の多くは動的な性質を多く持ち、動的な型を持つ言語である。 静的型言語の方が優れているとはいちがいには言えない。
静的型のデメリットはこんな感じだろうか。
全ての変数に型を書くのは面倒くさい
たくさん書くことでチェックに使える情報を増やしているわけだから当然と言えば当然だ。 ただ、代入による型伝搬(Satherにある)や型推論(MLやHaskellにある)で軽減することができる。
柔軟性が減る
たとえば、Rubyであればwriteメソッドを持つオブジェクトならなんでも出力先にできるが、 静的型言語ではそのような柔軟性は困難だ。 いや、interfaceのようなものを用意してそれを継承すれば理屈では可能だが、 実際にはあまり活用されていないようだ。
ということは、実行効率にはとりあえずこだわらず、 できるだけ(動的型言語に近いレベルで)簡潔に記述でき、 かつ柔軟性を減らさないような型の運用を積極的に支援するような静的型言語の登場する余地はあるのではないか。
たとえば、こんな感じで。
なかなか面白い言語になると思うのだが。たぶん私はRubyと心中すると思うけど、 若い人には新しい発想の言語を作り出してほしい。
うーむ、langsmithネタかな。