型の利用法
- lethevert is a programmer: 変数の型は2つの異なるレベルの概念が混在しているような気がする (http://d.hatena.ne.jp/lethevert/20051224/p1)
以下、自分用に整理してみる。
1. 計算機の物理的な演算機能やデータ形式を、コード上で明示する
2. 抽象的なデータの分類概念を、コード上で明示する
1.は、「データ型」と「値型、参照型」の2種類ある。つまりデータの種類を表す。2.は、それ以外の用途として型を利用する方法。
2つ目の型を利用するメリットを考えてみる。メリットは以下のもの。
型に付随する修飾子などにより決まる属性。
- 変数の寿命
- static
- 定数化、純粋化?
- const、Mutable、Immutable
- 継承不能
- final
- スコープ制御
- local、global
ユーザを助けてくれるもの。
- 型推論
- 型を動的に決定
いわゆる、型チェックがプログラマの生産性を下げる、と言っているときの型が、1つめの概念に相当し、型チェックがプログラマの生産性を上げる、と言っているときの型が、2つめの概念に相当するのではないか?
結局、動的にするか静的にするかはケースバイケース。動的より静的を研究して工夫するのは面白そう。しかし、『BEST SOFTWARE WRITING』のブルース・エッケルの記事で、
強い型付けではなく、強いテスト。
が重要と言っている。理由は、
C++のテストはコンパイル時に起きる...。Javaのテストは一部はコンパイル時に起き...、一部は実行時に起きる...。Pythonのテストの大部分はコンパイル時ではなく実行時に起きる。しかしそれはいずれにせよ起きるのであり、それが重要なことなのだ(いつ起きるかではなく)。そして私はPythonプログラムを同じ内容を持つC++/Java/C#プログラムよりずっと短時間で作ることができるので、本当のテストをより早く開始できる。
なるほど。しかし、
- jijixi's diary: 動的型付け言語でランダムテストを使った場合にあらわれるパラノイア (http://jijixi.azito.com/cgi-bin/diary/index.rb?date=20080316#p01)
にあるように、動的言語は、想定された型以外の型もテストする必要があるとしたらテストが複雑になりそう。
以下まとめ。但しパフォーマンスに議論が及ぶと研究が面白くない方向に行くので、ここでは無視する。
直感的に、型にデータの種類以上の意味を持たせて、型に助けてもらうことにメリットがありそう。問題は、型推論など工夫をして嫌な部分を取り除きつつ、メリットが表に顕在化する言語仕様とテクニックを研究すべきだと思う。それを研究できそうなのが、Scalaかな…?