Groovy(グルービー)は、JVM(Java Virtual Machine)上で動作するスクリプト言語である。
Groovyの処理系はオープンソースソフトウェアであり、James Starachan氏らを中心に、
オープンソース開発サイトであるcodehaus上でBSD/Apacheライクなライセンスにて開発・公開されている。
Groovyは2003年8月27日に開発が開始された(CVSへの最初のコミットがなされた)。
概要
GroovyはJVM上で動作する言語処理系および言語の名称であり、Javaとの直接的な連携を特徴とする。
例えばGroovyからすべてのJ2SE APIや、Javaで書かれた任意のサードパーティ製のコンパイル済みのライブラリなどを呼び出すことができる。
言語の記述能力としては、Javaで記述できることは、
(無名内部クラスの定義など一部の例外を除き)基本的にGroovyでも記述することができる
(逆に言うとJavaで記述できない機能は記述できないがJavaと同様にC言語などで書かれたネイティブメソッドなどは呼び出すことができる)。
Groovyは動的な言語であり、直接スクリプトを実行することができる。Groovyコード断片をコマンドラインに与えワンライナーとして実行することも可能である。
なおこの時、中間的にJavaソースコードが生成されることはなく、
バイトコードがメモリ上に生成されて直接実行される。
また、groovycコマンド(groovyコンパイラ)を使ってクラスファイルをあらかじめ生成しておくこともできる。
いずれにせよGroovyコードは内部的にはJavaバイトコードに変換されてJVM上で実行される。
このとき、GroovyコードもJavaコードも、JVMからみると両方ともJavaバイトコードとして解釈実行されるという意味で区別がない。Groovyのこのような仕組みから、GroovyはJavaと極めて親和性が高く、
Java技術でつち使われてきた開発インフラやライブラリ、ノウハウ、ツール、
JVM最適化技術などの多くをそのまま流用することができる。
Groovyから生成したクラスファイルは通常のクラスファイルであるので、
Javaクラスファイルを要求するプラグインなどをGroovyで記述することも容易である。
Groovyは、同じ実行時システムを共有する、Javaコードの別の表記法だと考えることもできる。
言語仕様
Groovyの言語仕様はJavaのそれをベースとしており、基本的にJavaプログラマにとって慣れ親しみやすいものである。
Groovyはスクリプト言語として大幅に簡易化された記述を許している。以下に簡略な記述を可能とするGroovy言語の特徴を示す。
- Groovyコードはクラス定義中にある必要はなく、クラス定義の外側でのメソッドの定義や実行文の記述が可能である。
- 変数の型宣言は不要である。宣言をしなかった場合Object型として扱われ、メソッド呼び出しはすべて動的ディスパッチによって解決される(変数の型の宣言をすることも可能であり、静的なスタイルと動的なスタイルの場合に応じた使い分けることができる)
- メソッド呼び出しの括弧は省略できる。
- 行末のセミコロンは省略できる。
- リストやマップの初期化を記述する組み込み構文を持つ。
- 演算子のオーバーロード定義(ユーザ定義演算子)が可能である。
- リストやマップを扱う演算子が定義されている。
- BigDecimal、BigInteger型などについては四則演算がオーバーロード定義されている。
- 検査例外をthrowsするメソッドを呼び出す際にもtry/catchで囲んだり呼び出し側メソッドをthrows宣言する必要はない。
- プリミティブ型はリファレンス型と同様に扱うことができる(明示的な変換を行う必要はない)。
- switch/case文は任意の型に対して分岐することができるように拡張されている。
- for(i in ..)形式のfor文(J2SE 5.0("Tiger")のそれと同様)。
- J2SEの正規表現クラスを扱うための組み込みの演算子(=~や==~など)が用意されている。また構文上も特別扱いされておりPerlやRubyと似た使用ができる。
- 文字列定数中に任意のGroovyの式を埋め込むことができる(${}の記法を用いる。GStringと呼ぶ)。
- Getter、Setterメソッドの自動生成。
- フィールドアクセスの記法でGetter、Setterメソッドを呼び出すことができる。
- デフォルト引数(メソッド・コンストラクタ呼び出しチェインの自動生成)。
- 名前つき引数でのメソッド呼び出し。
特徴的な言語機能
Groovyの特徴的な言語機能のいくつかを以下に示す。
GroovyMarkup
Groovyコードの表記を使ってツリーデータ構造の組み上げを行う。
具体的には、クロージャやダイナミックなメソッド追加の機能を用いて、
新規ノードの追加をメソッド呼び出しとして、
その新規ノードが持つ子ノード群をクロージャとして記述する。
GroovyMarkupは基本的な機能であり、GroovyMarkupを使った具体的な
ライブラリとしては、SwingのGUIコンポーネントの組み立てを行うSwingBuilder、
DOMのようなXMLデータ構造を組み立てるMarkupBuilderなどがある。
クロージャ
Groovyではコードブロックを一級市民オブジェクトとして生成し、
変数に格納したりメソッド引数や戻り値として受け渡したりすることができる。
Groovyのライブラリは繰り返し処理や入出力処理などを中心にクロージャが駆使されており、
簡潔な表記を行うことができる。
Groovy JDK
GroovyからJ2SEの標準APIをすべて呼び出すことができるが、
この際にGroovyから使うと便利なメソッドがリフレクションを用いてJ2SEクラスに擬似的に多数追加されている。例えば、クロージャをとるFile.eachLine()といったメソッドを使用することができ、
以下の様な記述が可能となっている。
new java.io.File("test.txt").eachLine{
println it
}
他の言語からの影響
James Strachan氏はGroovyはオブジェクト指向スクリプト言語Rubyから大きな影響を受けていることを何度か公言している。
実際、クロージャの仕様や表記、その他予約語の選択などにおいてRubyからの影響を色濃く見ることができる。
その他、Python、Dylan、Smalltalkなどからも言語機能が取り込まれている。
適用分野
Groovは開発中の言語でありバグや問題点も少なくないが、
現状で有用な用途としては、
Javaシステム開発におけるテストコードの記述を上げることができる(Groovyには標準でJUnit機能が組み込まれている)。もちろんスクリプト言語として、フィルタ的なツールをやプロトタイプを書き下すことも容易である。
アプリケーションの複雑なコンフィグレーションやカスタマイズ用の
言語として用いるということも注目されている。Antの設定ファイル(build.xml)をGroobyで記述する
機能は標準で組み込まれているし、いくつかのDIコンテナ(依存性注入コンテナ、IoCコンテナ)
と呼ばれるアプリケーションフレームワークにおける起動時設定ファイル
の記述言語として採用されるなど、XMLの代用として採用されはじめている。
将来的には、既存Javaシステムを連携させるグルー言語として、
Windowsの世界におけるVBやVBAの役割をJavaシステム全般において果たせる可能性がある。
標準化
Groovyは2004年3月29日にJava技術の標準化プロセスJCPにおいてJSR 294として受理され仕様の標準化がすすめられている。このことによってcodehausによる実装以外の実装が出てくる可能性が生まれている。また各社製品ベンダによってサポートが進められていくことが期待される。
サンプルコード
以下にGroovyのサンプルコードを示す。
println "hello world"
[1,2,3,4,5].each {println "${it * 2}"}
map = ["taro":1, "jiro":2]
map["taro"] = 3
println map["taro"]