静的型付けの何が良いか
以前、「動的型付け言語はやはり使用できない」というタイトルでエントリを書いたのだが、「Scalaスケーラブルプログラミング[コンセプト&コーディング] (Programming in Scala)」という本に言いたかったことが書かれていたので紹介する。
p.34 1.3.4 静的な型付け(簡潔性、柔軟性、検証可能性、安全性、ドキュメント性):
静的な型システムは、ある種のランタイムエラーが存在しないことを証明できる。たとえば、真偽値が整数に加算されていない、非公開変数がクラス外からアクセスされていない、関数が適切な数の引数に対して適用されている、文字列の集合に追加されているのは文字列だけである、といったことを保証できるのである。
しかし、今日の静的型システムでは、その他の種類のエラーは検出されない。たとえば、終了しない関数、配列の境界を越えたアクセス、0による除算などは検出されない。[中略]そのため、静的型システムは、一部の人々からはあまり役に立たないものだと軽視されている。さらに、静的型システムは単純なエラーを検出できるだけだが、「単体テストならもっと広い範囲のエラーを検出できるのだから、わざわざ静的型システムを使う必要はない」とまで言う人々もいる。
上記の意見は、前エントリのブルース・エッケルの意見と同じ方向だろう。これに対して、以下の反論が続く。
確かに、静的型システムは単体テストの代わりになるわけではないが、プログラムの性質を確認するために普通なら必要だった単体テストの数を減らしてくれる。さらに、単体テストは静的型付けの代わりにはならない。Edsger Dijkstra(エドガー・ダイクストラ)が言ったように、テストが証明できるのはエラーの存在であって、エラーの不在ではない。静的型付けが与えてくれる保証は単純なものかもしれないが、どれだけテストをしたとしても得られない本物の保証なのである。
ダックタイピングという言葉がある。動的型付けにおいて、ダック(と思われるもの)を用いたとき、テストは
- それがダックであることを確認する(鳴かせてみる)
- 鳴き声が妥当であることを確認する
の2種類が必要になる。一方、静的型付けにおいては、それがダックであることは確実なので(保証されているので)、
- 鳴き声が妥当であることを確認する
の1種類で済む。
テストコードを書く場合、もしかすると両者は同じ1つのテストケースで実行可能かもしれない。が、コードレビューを行う場合(実際にプログラムを実行できない場合)では、かなりの負荷になると思う。
最近のコメント