«前の日記(2004年07月21日) 最新 次の日記(2004年07月23日)» 編集

Matzにっき


2004年07月22日 [長年日記]

_ [言語]静的型言語

Satherの話をきっかけに、 静的型言語好きの前田くんと、 静的型について議論する。

Rubyなんて動的型の代表みたいな言語を作っている私だが、 実は昔はEiffelの影響を受けて静的型オブジェクト指向言語至上主義だったのだ。 卒論で作った言語も静的型言語だったし。

静的型のメリットと言えば、以下のようなものであろう。

  • 最適化しやすい。

    型情報が分かっていれば、 動的結合を省略して直接呼び出しを行ったり、 式の展開・畳み込みを行う余地がある。 Rubyみたいな言語を作ってると「お前は最適化にウラミでもあるのか」というくらい最適化しにくい。

  • 間違いが検出しやすい。

    型情報で全部の間違いが検出できるわけではないが、 単純なタイプミスやロジックミスが型の不整合として検出できるのは、 「実行してみないと分からない」動的言語よりも嬉しい

もちろん、どちらも嬉しいのだが、スクリプト言語が台頭した背景を考えてみると、 実行効率に貢献する「最適化」よりも開発高率に貢献する「間違いの検出」の方が重要度が高いといえるような気がする。

しかし、実際には最近登場する言語の多くは動的な性質を多く持ち、動的な型を持つ言語である。 静的型言語の方が優れているとはいちがいには言えない。

静的型のデメリットはこんな感じだろうか。

  • 全ての変数に型を書くのは面倒くさい

    たくさん書くことでチェックに使える情報を増やしているわけだから当然と言えば当然だ。 ただ、代入による型伝搬(Satherにある)や型推論(MLやHaskellにある)で軽減することができる。

  • 柔軟性が減る

    たとえば、Rubyであればwriteメソッドを持つオブジェクトならなんでも出力先にできるが、 静的型言語ではそのような柔軟性は困難だ。 いや、interfaceのようなものを用意してそれを継承すれば理屈では可能だが、 実際にはあまり活用されていないようだ。

ということは、実行効率にはとりあえずこだわらず、 できるだけ(動的型言語に近いレベルで)簡潔に記述でき、 かつ柔軟性を減らさないような型の運用を積極的に支援するような静的型言語の登場する余地はあるのではないか。

たとえば、こんな感じで。

  • 型伝搬、型推論を積極的に行う。 ただし、型推論はHaskellほど強力にしない(すぐ分かんなくなっちゃうから)。
  • 既存のクラスにメソッドを追加することは禁止。 ただし、名前空間を使って「この名前空間においては、このクラスにはメソッドが多い(少ない)」というのはアリかも。
  • 型は構造ではなく、signatureで表現する。 型をメソッドの集合によって表現する。 メソッドの名前、それぞれの引数の数とsignatureがすべて一致する型は 同じ型であるとする。ちょっとドラスティックすぎるか。 型の互換性はsignatureの包含関係でチェックする。 Satherのように「構造の型」と「インタフェース(signature)の型」を分離するのも面白い。

なかなか面白い言語になると思うのだが。たぶん私はRubyと心中すると思うけど、 若い人には新しい発想の言語を作り出してほしい。

うーむ、langsmithネタかな。


«前の日記(2004年07月21日) 最新 次の日記(2004年07月23日)» 編集