uehaj's blog

Grな日々 - GroovyとかGrailsとかElmとかRustとかHaskellとかReactとかFregeとかJavaとか -

GroovyはJavaの拡張である

「Groovyとは何か」を一言で説明するとしたらみなさんどうします?


私の考えでは、「GroovyはJavaの拡張である」というのがシンプルな説明ではないかと思います。
C++がCの拡張であるのと同じように、GroovyはJavaの拡張。

  C++ = Cの拡張
Groovy = Javaの拡張

C++がCから拡張された部分を思いっきりおおざっぱに言うと、「オブジェクト指向」でしょう(まあ異論もあるでしょうけれども)。

C++ = C + オブジェクト指向

では、GroovyがJavaから拡張されたのは端的に言って何であるか。つまり、

Groovy = Java + ?

の「?」に何を入れるべきでしょうか。ご存知のように、Groovyは「言語機能の総合デパート」てなもんで、Javaからの拡張機能は分厚い本1冊ぐらいの機能はあるわけです。でもそこからひとつだけ挙げるとしたら、何であるか?


私の考えでは、ここに当てはめるとしたら、

の2つだと思う。(1つじゃねー)

Groovy = Java + 動的言語機能 + 簡潔記述

Groovyの文法はJavaのほぼ上位互換です*1
加えて、GroovyはJavaのオブジェクトモデル、実行プラットフォーム、API、セキュリティモデル、開発ツール、その他を共有しています。「拡張」というのがふさわしいでしょう。


オルタネイティブではなく、別言語ではなく、延長であり、拡張。実際、JavaっぽくGroovyを書いてもいいし。この点がGroovyをJRubyScalaなどから差別化しています。んで、その場合「拡張だから汚いのだ」という議論や批判も沸き起こってくるかと思います。確かにそーゆうところも微少にはありますが、問題視するほどのものはないと私は思っています。実際調べると、整合性がすごく考えられている。


話は変わりますが、昔は「Cの様にC++を使う人」が問題になりましたよね。将来は、それと同様に、「JavaのようにGroovyを書く人」が現れて困るかもしれませんね。つまり、Groovyを良く知らないでJavaから移行してきて、意図的ではなく、きちんとクラス定義・型指定して「冗長にGroovyを使う」人*2


ただ、Grailsから使うGroovyに限って言うと、サンプルコードとかがGroovyらしいものばかりだし、grailsコマンドで生成される雛形とかDSLもあるので、表記上はJavaっぽく書く余地がないっすね。


とりとめもなくこのへんで。

*1:完全に上位互換ということはありません。しかし、無名内部クラスや==演算子の扱いや数値の扱いなど、ごく一部を除いてGroovyの文法およびセマンティクスはJavaのそれをなるべく包含するようになっています。ちなみにC++も厳密にはCの上位互換ではない部分がある。

*2:本当にそうしたいなら普通にJavaで書いてGroovyから呼び出せばいいので、Groovyである意味がない