Groovyの「静的型付け」はホンモノか!?


(先日、id:uehaj さんと珈琲屋で議論した話題でもあり、ネタがかぶってしまいましたが、書きかけてたのでそのまま出しちゃいます)

Groovyの説明ではよく「Groovyは静的型付けも動的型付けもサポートしており、これを"Optional Typing"(任意の型付け)と呼ぶ」みたいに言われます(というか私もそう書いたことがありますw)。動的型付けについてはDuck Typingのサポート等、確かにその特性・機能を備えていると思いますが、静的型付けについてはどうでしょうか。

一般に、静的型付けのメリットは:

  1. 型情報に基づいた最適化による性能向上
  2. コンパイル時型チェックによる信頼性向上
  3. ドキュメンテーションとしての型情報による保守性向上

と言われます。(まつもとさんも同じことを言ってますね)

しかし、Groovyでは型を指定しても

  1. 型情報は最適化には一切利用されない。むしろ実行時型チェックのため(わずかに)遅くなる。(試してみて)
  2. 型の整合性はコンパイルには全然チェックされない。以下のコードは何の問題もなくgroovycでコンパイルできる。(やったことない人はショックを受けるかも!)
  int i = "hello"
  Date d = new File()

というわけで、実は上の中では 3. のメリットしかありません。(もちろん、実行時の自動的な型チェックはあるけど)

「静的型付け」の厳密な定義は知りませんが、これで真に「静的型をサポートしている」と言えるのでしょうか?個人的には、静的型付けのありがたさはうっかりミスを機械的に予防してくれる安心感(動的型なプログラミングではちょっとした不注意でわけのわからないトラブルに陥る場合もまだまだ多い)だと思っているので、上記のような現状で堂々と「Groovyは静的型でも動的型でもどっちでもばっちりさ!」とは言えない気分です。

このごろは「Groovyは動的型言語だが、任意に型情報を記述することもでき、その場合は実行時に自動的にチェックしてくれる」くらいが正確な表現ではないかと思っています。

なお、最近話題のGroovy++はまさに上記 1. と 2. の実現を目指しており、これが完成して本体に取り込まれた暁には、胸を張って「これが究極のオプショナルタイピングだぜ、まいったか!」くらい言えるようになると信じています。