J2EE関連の最新仕様をわかりやすく解説

J2EE Watch [3]

標準化進む新スクリプト言語“Groovy

豆蔵
中原慶
2004/8/19


J2EE Watchでは、J2EE関連の最新仕様に関するトピックを取り上げ、分かりやすく解説します。(編集局)

 読者は、新しく登場したGroovyというプログラミング言語をご存じだろうか? GroovyはJava Virtual Machine(以下、JVM)上で動作するスクリプト言語である(注1)。ここで読者は疑問を抱かれることだろう。たしかにこのページは本来J2EEの最新仕様をキャッチアップするためのコーナーだ。しかし実は、GroovyはJCPで公認され、JSR-241で標準化が進められている。JSRでの活動により仕様が策定されると、将来のJava言語仕様に組み込まれる。従って、J2SEの標準機能として使用できるスクリプト言語となるのである。さらに付け加えれば、J2SE1.5 (Java5/Tiger) で追加されたAutoboxing/unboxing、Metadata 、Genericsなどと同じように、言語仕様としてJavaの実行系に組み込まれるということだ。

 そこで今回は、直接J2EEとは関係はないが、Javaの世界における最近のホットな話題の1つであるGroovyを紹介しよう。ところで、本稿ではGroovyが登場した背景、Groovyの特徴と用途、課題に関して解説する。Groovyの詳細な文法や機能に関しては、http://groovy.codehaus.org/を参照してほしい。

注1:Groovyを実行するには、JDK1.4.x が必要となる。

Java APIをシームレスに使えるGroovy

 Groovyの開発は、オープンソース・プロダクトで有名なJames Strachanと、XPathエンジンのJAXEN等で有名なBob McWhirterによって始められた。GroovyはJavaより簡単に手早く実装でき、楽しく開発を行うことを目標に、Java開発者によって開発されたオブジェクト指向スクリプト言語である。

 サーバサイドをはじめ、ここ数年でJavaテクノロジーは急速に発展した。その理由として、マルチプラットフォームでの動作をサポートしたオブジェクト指向言語であるところが大きい。JVMという動作環境が、プラットフォームの違いを吸収する。そのため、コンパイルされたバイトコードは、JVMが動作する環境であればプラットフォームに依存せず動作する。

 Groovyは、Javaの発展に伴い普及したJVMをインフラとして利用している。つまり、Javaと同じく「Write Once Run Anywhere」を実現したスクリプト言語である。JVM上で動作するスクリプト言語としては、JRubyやJythonといったスクリプト言語がすでに存在する。にもかかわらず、なぜ新しく開発されたGroovyが注目を集めているのだろうか?

 その理由は、Javaとの親和性にある。JRubyやJythonを利用するには、Javaプログラマは新たに文法やAPIを学習する必要がある。それに比べ、Groovyの文法はJavaの文法と非常によく似ている。しかも、既存のJava クラス(J2SE APIやJ2EE API)をJavaのコードから利用するのと同じように、シームレスに利用することができる。ラッパーを使う必要も、APIを区別する必要もない。つまり、Javaプログラマはほかの言語を習得するより容易にGroovyを習得することができる。更にGroovyのソースコードは、Groovyコンパイラ(groovyc)により100% Pure Javaのバイトコードにコンパイルすることができる。習得が容易だということは、Javaの世界に新しく登場する言語としての魅力といえる。

 しかし、Groovyの魅力はこれだけではない。GroovyにはJ2SE APIを拡張した機能や、言語レベルでの画期的な拡張が施されている。さらに、RubyやPython、Perlなどほかのオブジェクト指向スクリプト言語が持つ強力な機能を備えている。例えば、動的型付けによるジェネリックプログラミングが可能となっている。また、Javaの匿名内部クラスとよく似たクロージャをサポートしている。ほかにも、オブジェクト・ナビゲーションや、ListやMapを扱うための簡潔な文法が言語レベルでサポートされている。これらの機能を使うことにより、GroovyではJavaでの実装に比べ簡潔な実装が可能となる。

 JSFとそれをサポートしたSun Java Studio Creatorの登場により、近年サン・マイクロシステムズが提唱してきたEoD(Easy of Development)が実現に近づいた。GroovyもEoDに沿ったものだといえる。Java開発者が感じていたJavaに対する窮屈感や、RubyやPython、Perlの規制の緩い文法に対するあこがれを実現したのがGroovyだと筆者は考える。

Groovyの特徴と用途

 Groovyには実装を簡単に、手早く、楽しく行うような機能や文法が備わっている。その特徴を生かした用途を筆者なりに考察してみよう。

XMLの代替としてのGroovy

 Groovyには、SQLによるデータベース操作、単体テスト、Beanの扱い方などを簡潔に実装する機能が用意されている。ここでは、XMLやSwingによるユーザーインターフェイス等、階層化された構造をクロージャを使って表す方法について見てみよう。

 現在、軽量コンテナ(PicoContaineやSpring等)やアプリケーションサーバ、Antのビルドファイルなど、ほとんどの設定ファイルはXMLで記述されている。XMLの階層構造は、コンピュータから扱うには容易だが、プログラマには複雑である。たった1つのタグの間違いを見つけ出すために、長い時間を費やした読者も多いのではないだろうか。GroovyのMarkupBuilderクラスは、XMLやHTML等のマークアップ言語を、何らかのストリームに出力する機能を持っている。MarkupBuilderクラスは、XMLの煩わしさからプログラマを解放してくれる。

 簡単なXMLデータをGroovyのプログラムから出力する例を見てみよう。出力対象となるリスト1のようなXMLがあるとしよう。

リスト1:出力対象のXML
<foods>
  <food category='Vegetables'>
    <detail name='Carrot' id='1' />
    <detail name='Onion' id='2' />
    <detail name='Potato' id='3' />
  </food>
  <food category='Fish'>
    <detail name='Tuna' id='1' />
    <detail name='Salmon7' id='2' />
    <detail name='Bonito' id='3' />
  </food>
  <food category='Meat'>
    <detail name='Beaf' id='1' />
    <detail name='Pork' id='2' />
    <detail name='Chicken' id='3' />
  </food>
</foods>

 このXMLデータを出力するGroovyプログラムがリスト2だ。このプログラムでは、foodData変数に出力するデータを格納している。XMLの出力に関する記述は、xml=new MarkupBuilder()以下である。なお、このプログラムではクロージャやListの扱いなど、Groovy特有の文法の知識が必要となる。これらの文法に関してはGroovyの本家サイト(http://groovy.codehaus.org/)を参照してほしい。

リスト 2:リスト1のXMLデータを出力するGroovyプログラム
import groovy.xml.MarkupBuilder

foodData = ['Vegetables':[1:'Carrot', 2:'Onion', 3:'Potato'],
            'Meat':[1:'Beaf', 2:'Pork', 3:'Chicken'],
            'Fish':[1:'Tuna', 2:'Salmon7', 3:'Bonito']]
               
xml = new MarkupBuilder()
foods = xml.foods() {
            for ( genre in foodData ) {
                food ( category:genre.key ) {
                    for ( foodDetail in genre.value ) {
                        detail ( id:foodDetail.key,
                                 name:foodDetail.value )
                    }
                }
            }
        }

 Groovyでは、要素名となるクロージャを作成することでXMLデータの要素を表わす。引数には要素の属性を指定する。要素を表すクロージャの中でさらにクロージャを定義することで階層構造を表している。クロージャ内では、繰り返しや条件分岐の処理を行うことができる。

 すなわち、XMLデータをGroovyで作成すれば、動的なXMLデータの作成が可能になるのだ。例えばデータベースから値を取得し、そのデータに従ったXMLデータを作成したり、現在日時に従って動的に変化するXMLデータを作成することができる。これを利用し、設定ファイルをXMLファイルではなくGroovyで定義することで、動的な設定が可能となるわけだ。この実例としては、すでにSeasar2のようにGroovyを設定ファイルとして利用するためのライブラリが存在する軽量コンテナも登場している。

その他の特徴

 Groovyの特徴には、前述のマークアップ機能のほかにも、テストコードの簡潔な作成や、テキスト中に埋め込まれたスクリプトレットや式言語を解析し文字列に変換するテンプレート機能、簡潔なデータベース操作などがある。

 特にJUnitのテストコードをGroovyで作成する機能は、テストコード作成において非常に有効だ。GroovyとJavaの親和性の高さと文法の類似性により、Javaプログラマは容易にGroovyでテストコードを作成することができる。このことは、単体テストコードを簡潔に、素早くJavaプログラマが記述できることを意味する。JUnitがGroovyのランタイムに含まれていることで、GroovyでJUnitのテストコードを記述することを可能としている。さらに、GroovyではJUnitのアサートメソッドに加え、独自のassertメソッドが用意されている。GroovyでJUnitテストコードを作成する利点に関しては、Groovyの本家サイト(http://groovy.codehaus.org/Unit+Testing)に記述があるので参照してほしい。

 以上、Groovyの特徴と用途について述べた。Groovyの魅力は、Javaに比べ文法の規定が緩く、簡単にコード作成ができるということである。素早く、簡単にプログラム作成ができることから、ラピッド・プロトタイピングやテスト駆動型の開発に向いているといえるだろう。

Groovyの課題と今後

 Groovyは、Perlなどほかのスクリプト言語と同じように、Groovyのみでアプリケーションを構築することは可能である。しかし、まだ生まれたばかりの言語だ。執筆時点でのGroovyのバージョンはGroovy 1.0-beta-6であり、このバージョンではまだ不具合が存在する。また、言語仕様が変更される可能性もある。しかし、その特徴から、Groovyは今後のJavaプラットフォームを利用したアプリケーション構築に活用されている可能性があり、評価する価値はあるのではないだろうか。

 今後解決されるべき課題としてはパフォーマンスがある。GroovyのパフォーマンスはJavaに比べ劣っている(注2)。現状のパフォーマンスでは、Groovyのみでアプリケーションを構築することは現実的ではない。

注2:OPEN SOURCE CONVENTION(2004/7/28)でRod CopeとJames Strachaが発表した資料によると、GroovyはJavaに比べパフォーマンスで20〜90%劣るとされている(http://www.codehaus.org/~jstrachan/GroovyOSCon-2004.ppt

 もう1つの大きな課題は、Groovyのエラーを解読するのは非常に困難である点だ。現状では、スタックトレースがコンソールに表示されるが、重要な情報がそれ以外の情報の中に埋もれてしまっている。この問題が解決され、JSR-241での標準化が進み正式リリースされれば、Groovyに対応した開発ツールが多数登場すると思われる。

 このように、Groovyにはまだ多くの改善すべき課題が存在する。しかし筆者は、Groovyの登場により厳格な言語であるJavaに柔軟性が加わったと考える。Groovyの文法は規制が緩く、簡単にプログラムを作成することができる。Groovyによる手早い開発はテストやXMLの代替をはじめとして、今後Javaの開発に多く取り込まれていくと考えられる。つまり、Groovyの登場によりJavaの開発は、よりアジャイルな開発に適用しやすくなっていくのではないだろうか。

筆者プロフィール
中原慶(なかはら けい)

3年半の間、ソフトハウスにて多種多様なシステム開発に従事する。システム開発を通し、次々に登場する理想的な技術と、実際の開発現場で使われる技術に温度差を感じる。その後、自分自身が、よりよい開発プロセスや技術を実際の開発現場に浸透させる橋渡しなろうと考え、株式会社豆蔵に入社。現在の興味の対象は、より実践的なモデリング。




Java Solution全記事一覧

 



Java Agile フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Java Agile 記事ランキング

本日 月間