2008-01-22
■ [prog] 型についてもうすこし考えてみた
前回の話題について。言及してくださった方ありがとうございます。
- http://mono.kmc.gr.jp/~yhara/d/?date=20080116#c01
- http://d.hatena.ne.jp/uehaj/20080119
- http://www.jmuk.org/diary/2008/01/16/1
んで、あれからちょっと考えてみたんだけど、全く考えがまとまらない罠。
型の効果
とりあえず、変数の型を明示することにはいろいろな効果がある。
- (A) コードを読むのに役立つ
- (B) 型チェックに役立つ (バグのないプログラムを書くのに役立つ)
- (C) 最適化に役立つ
変数の型、データの型
これは昔大林さんに聞いた話で、どっかに書いてあるかもしれないけどもっかい書く。
- | 変数に型がある | 変数に型がない |
---|---|---|
データに型がある | Javaとか(静的型) | Rubyとか(動的型) |
データに型がない | C/C++ | Forthとか(昔の言語) |
型ありと型なしのミックス
Javaは「全部、型を書く」で、Rubyは「全部、型を書かない」なんだけど、その中間のアプローチもある。
これには2種類あって、まず「基本は型ありで、省略可能」なもの。いわゆる型推論ですね。Haskellとか。
もう一つは、「基本は型なしで、付加可能」なもの。 Lisp系は一般的に変数に型がないけど、Common Lispはオプションで型を指定できることが仕様で規定されているらしい。 id:uehajさんが書いてらしたGroovyもそうだとか。
両者は似ているようで、決定的な違いがある。前者は型を省略した変数も型を持つ(型チェックされる)が、 後者は型を省略した変数には型がない(型チェックされない)。
というのを踏まえて
型の効果を見直してみる。
- (A) コードを読むのに役立つ
- このための型は省略不能。(省略したら意味がないw)
- (B) 型チェックに役立つ (バグのないプログラムを書くのに役立つ)
- このための型は省略可能。できれば書かない方が楽。
- (C) 最適化に役立つ
- このための型は省略可能。できれば書かない方が楽。
で
すごい中途半端なところで終わる(笑)。
型推論の結果をうまくコードに重ねて表示してくれる IDE があれば、(A) でも型が省略可能になるんですかね。
F# + VisualStudioだと型推論の結果もIntelliSenseしてくれますよー。
(A)の場合でも型は省略してもいいんじゃないでしょうか。もしも、型推論の結果を反映したドキュメントを自動生成できれば、ですけれども。Haskell では haddock がそれを行います。ドキュメントがなくても、インタプリタに食わせて、推論した型を聞くという対話的なアプローチも取ることができます。
そうそう、ツールの補助によるアプローチについてもう少し考えたかった。のです。かも。
(A)(B)は「コメント」の話に構図が似てるかもしれませんね。<br><br>(A)は「適切にコメントをつけると読みやすい」というような主張<br>(B)は「コードがドキュメント」「文書化ではなくコード自身に表現させよ」というような主張<br><br>まあ、いずれも一理あるのでしょう。<br><br>加えて与太話的に言うと、型指定をしたがらない人は、コメントもつけたがらないし、逆も真だとも思います。というか、用途とシチューエーションが全然違うんでしょうね。