■1. Groovyとは |
■2. スクリプト起動を高速化するGroovyServ |
Groovyは、JavaやC言語などと同様にプログラミング言語の一つです。プログラム言語にもさまざまなものがあり、それぞれ特徴を持っていて、得意・不得意な分野があります。ではGroovyはどのような言語なのでしょうか?ひとことで言うと、Groovyは「Javaベースのスクリプト言語」です。
従来、システム開発ではJava言語がよく使われてきましたが、最近では、Ruby やPythonといった言語も使われるようになってきました。Rubyや Pythonは「スクリプト言語」というジャンルに分類される言語です。スクリプト言語の定義はそれほど明確なわけではありませんが、簡単にいうと、「簡単にプログラムを作成でき、すぐに実行ができるような簡易な言語」です。
プログラマにとっては、スクリプト言語は「やろうと思ったことを、即座に書き下し、すぐに結果を得る」といった用途で使いやすい言語であり、Groovyはこの特徴を備えています。
Groovyで「こんにちは!」と挨拶を表示するプログラムの例を示します。
println "こんにちは!"
非常にシンプルであることがわかると思います。もし、これと同じ処理をJava で書こうとすると以下のようになります。
public class HelloWorld {
public static void main(String[] args) {
System.out.println("こんにちは!");
}
}
Groovyプログラミング言語の詳細を解説することは本稿の目的ではないので割愛しますが、雰囲気として、処理したい内容だけを書けるような言語であることが伝わりますでしょうか。
RubyやPythonなどの他のスクリプト言語と比較したときのGroovyの特徴は、「Javaと親和性が高い」ということです。具体的には、まず、GroovyはJava VM(*1)上で動作します。それだけではなく、GroovyはJavaと組み合わせて利用することで最大限の利益を得ることができます。たとえば、GroovyからはJavaのすべてのAPIやライブラリを簡単に使用することができます。また、Groovyの文法はJavaのそれを引き継いでおり、Groovyは「簡易なJava」として使うことができます(*2)。
Javaは、世界中のプログラマや企業によって長期にわたって鍛えあげられてきた、歴史と実績のあるプログラミング言語です。また、Javaはプラットフォームとして性能面や安定性、スケーラビリティに優れており、特に大規模・大人数でのエンタープライズシステム開発を行う際にはJava技術が選択されることも多いでしょう。しかし反面、Javaでは、安全性のために記述量が増えプログラム記述が冗長になりがちであり、また、Javaプログラムを実行するためにはコンパイルなどの手続を踏む必要があります。
たとえると、Javaは「誤操作防止装置」が多くついた機械であると言えるでしょう。安全・高性能であるのは良いのですが、なにかをするたびに、チャイルドロックのような安全装置を解除したり、手続きや準備をしてからでないと結果を得ることができません。これに対して、スクリプト言語は、冗長性を排し、やりたいことだけを書くだけで気軽に即座に実行できるような体系です。
Java言語がもたらす安全性や性能はもちろん重要ですが、システム開発のすべての局面で、それが常に・最大限に必要であるわけではありません。場合によっては、Javaの「冗長性」が足枷になる局面もあります。
たとえば、開発チームが自分たちだけで使用するツールを記述したり、プロトタイプを迅速に開発したり、既存のコンポーネントを呼びだすだけのロジックや、頻繁にカスタマイズするようなビジネスロジックを書きたい、といった場面があります。このようなとき、JavaとGroovyで役割分担し、Javaに向いたところはJavaで、Groovyのほうがすばやく書ける部分はGroovyで書くことで、生産性を高めることができるのです。
また、Javaは非常に安定している言語ですが、その裏腹の関係として、機能の改善や拡張のペースがゆっくりとしています(*3)。これに対して、Groovyは、世界中の開発者が参加している活発なOSSプロジェクトで開発されており、有用な新機能が日々追加されてきています。Groovyに採用されて有用性が認められた機能が、のちにJavaに採用されることも珍しくありません。たとえば、Groovy には「クロージャ」機能があり、これはJavaではもう数年来にわたって採用するかどうかを議論している機能ですが、Groovyでは2005年の登場当初から使うことができていた機能なのです(*4)。
Groovyが提供する非常に豊富な機能セットを使いこなすことで、Javaだけでは得られない利点を、簡潔な記述で得ることができます。
Groovyは、諸般の事情により、日本ではまだあまり広くは使われていないようですが、欧米では多く利用されており、熱心な開発者も多く、業務で使われるケースも拡大してきています。Groovyのダウンロード数はピーク時に1日18万件とのことです(*5)。
GroovyServは、NTTソフトウェアがApache License, Version 2.0に基づき開発・公開しているオープンソースソフトウェアの1つです(*6)。Mac OS X、Linux、 Windows版で動作確認を行い、これらの環境用のバイナリ版も公開しています。2010年3月から公開を開始し、2010年12月には0.5版をリリースし、2011年3月現在でも開発を継続しています。
GroovyServの目的は、Groovyスクリプトの起動時間を短縮することです。 GroovyはJava VM上で動作することや、初期化などに時間を要することもあり、環境にもよりますが、スクリプトの起動に1秒以上、もしくは数秒程度もかかることは珍しくありません。GroovyServを用いることで、0コンマ何秒程度に起動時間を短縮することができ、快適にスクリプト開発を行うことができます。下図に起動時間の比較グラフを示しますが、通常のGroovyでの起動(「normal groovy」のケース)を1とすると、GroovyServを用いた場合、起動速度が最大で 35.8倍向上しています(「groovyclient(C)」のケース)。(*7)

主観になるかもしれませんが、スクリプト開発においてスクリプトの起動速度は非常に重要です。なぜなら、試行錯誤で修正していくことが多いため、開発時には起動を頻繁に繰り返し行うからです。Groovyはその機能からすると、 PerlやRuby、Pythonなどにも拮抗しうる強力なスクリプト言語ですが、起動速度が遅いことは積極的な利用を躊躇させる難点の一つでした。GroovyServを併せて使うことで、この問題を解決し、スクリプト言語Groovyが持つ本来のパワーを引き出すことができるようになります
NTTソフトウェアでは、将来的にはGroovyの標準的な起動方法の1つとなることを目標としてGroovyServの開発を行っています。
詳細は参考リンクを参照していただくとして、GroovyServの動作について簡単に説明します。アイデアは、Groovyの処理系を、あらかじめサーバ (groovyserver)として常駐起動させておき、Groovyスクリプト実行は groovyserverに処理を移譲する小さなCあるいはRubyのプログラム (groovyclient)を通じて行うというものです。
Java VMの起動や、基本的なクラス群のロード、初期化を、groovyserver起動時にあらかじめ行っておくことで、個々のgroovyclientの実行ではそれが不要となり、見た目の起動速度が高速化します。groovyserverとgroovyclient間はTCP/IPで通信を行います。
NTTソフトウェアは、Groovy言語およびGroovyで構築されたWebアプリケーションフレームワークであるGrailsの普及・促進のために設立された「日本 Grails/Groovyユーザグループ(JGGUG)」の設立当初からの(*8)法人会員であり、本記事の執筆者の一人である上原が運営委員を務めています。
NTTソフトウェアのメンバによるGroovy関連の発表などを、他のコミュニティに対するものも含めて多数回行っています。
NTTソフトウェアでは、本稿で説明したGroovyServ以外にもOSS開発活動に取り組んでおり、OSS開発やOSSへの機能追加・拡張を通じてソフトウェア開発技術力を高めるとともに、コミュニテイへの貢献を行っていきます。
【用語解説】