No Programming, No Life

プログラミング関連の話題や雑記

私がGroovyを好きな9つの理由 2011年版


f:id:torazuka:20110814012523p:image
ぐるーびーたんと本 by id:torazuka

はじめに

G* Advent Calendar 2011 12/12(12日目)に参戦ということで。
そろそろGroovyについて語っておくベキかなと思ったのであらためて書いてみます。私なりの、Groovyを気に入っている理由を9つほど述べてみたいと思います。この記事を読み終わったころ、皆さんもGroovyの魅力が伝わっていれば幸いです。それではどうぞ。

1.シンプル

非常に短いコードで多くのことを可能に

Groovyはその簡潔さ故、非常に短いコードで様々な事が可能である。
たとえば、Groovyなら1行でできる97のことを見ていただければその強力さが伝わるでしょう。これはPerl使いが好むような、ワンライナーをGroovyで簡単に実現できる実例を示しています。
また、プログラミングGROOVY発売記念として行われたghelloなども140文字に収まるシンプルさで、様々なHello Worldが書ける例となっています。

クロージャの例

クロージャ(や、それと同様の機能)を備えた言語は多くあります。Groovyのクロージャでは引数を省略した場合、暗黙変数として "it" が使えます。例えば単純に "2を足す" クロージャは

{ it + 2 }

と書くことができます。
他の言語ではどうでしょう。たとえばRubyのブロックと比較してみると、Rubyのブロックでは

{ |x| x + 2 }

となります。C#のラムダ式では以下のような感じでしょうか。

(x => x + 2)

両言語は変数名を省略できないため、ほんのちょっとだけ、Groovyよりも複雑度が増しています。
また、Haskellでは (+2) のように極限まで省略できるのですが、「何にどうするか」は関数呼び出しのルールを覚えていなければならず、
Haskellに熟練のプログラマならすぐに理解できるでしょうが、そうでない場合、パッと見ただけでは分からないかもしれないですね。
その点、Groovyは「それに2を足す」とそのまま読み下せば処理内容が想像しやすいため、読みやすいのです。

オーバーライド可能な記号を限定している

演算子をオーバーライドできる言語な世の中に多数存在しています。例として、RubyとScalaを考えてみると、両者ともに文法的に許される限りで自由な記号を演算子として使うことができます。
そのため、!<< や :==: など、パッと見てどのような挙動をするかすぐには理解できないようなものも容易に作り出すことが可能です。
さて、Groovyはどうかと言うと、RubyやScalaのように演算子をオーバーライドすることは可能なのですが、オーバーライド可能な記号を限定している点が異なります。
例えば、+ 演算子をオーバーライドするには、plus() メソッドをオーバーライドすることで実現できます。*1

import groovy.transform.Canonical

@Canonical
class Hoge {
 int num = 0
 public Hoge plus(Hoge other) {
    new Hoge(this.num + other.num)
 }
}

def h1 = new Hoge(3)
def h2 = new Hoge(5)
assert h1 + h2 == new Hoge(8)

オーバーライド可能な記号とそのメソッド名の一覧はこちらを参照。
このように利用可能な記号を限定することで、DSLが理解しやすくなるという利点があるように思います。
RubyScalaなどは事実上、好きな記号を組み合わせて構文を作れるため、無限の可能性と無限の読みにくさ((いわゆる、俺俺DSL。自分は使いやすいが、他の人は非常に読みにくい。))が共存することになります。
DSLについては次節で触れます。

スマートな真偽判定

Groovyでの真偽判定(これをGroovy Truthと呼びます)は直感的でシンプルです。例えば整数型を例に取ってみると、0であればfalse、それ以外ならtrueといった具合に評価されます。リストであれば 空リスト [] なら false, 要素があればtrueとなります。詳細はこちらでどうぞ。

// 要素がある間繰り返す
def list = ['aaa', 'bbb', 'ccc']
while (list) {
 println(list.pop())
}

結果

ccc
bbb
aaa

この例のように、Groovy Trushを理解してうまく活用すれば、while (list) と書くだけで list に要素がある状態だけ繰り返すことが可能となります。スマートな真偽判定を覚えればあなたのコードはよりシンプルなものとなるでしょう。

2.パワフル

GDK

Groovyは言語レベルでJava標準ライブラリにてこ入れし、その力を底上げしている。

あらゆるものを繰り返す

eachというメソッドが定義されているおかげで、様々なものを“繰り返す”ことが容易にできます。例えば

'abcde'.each{ println it }

のように、文字列にeachすると、一文字一文字を繰り返せます。

AST変換がある

AST変換については, id:uehaj さんのブログが多分一番詳しいと思います。

DSLがある

たとえばGradleなどは専用のDSLでビルドスクリプトを記述してゆくスタイルを取っている。
Gradleについては同じG* Advent Calendar 2011に参戦中のid:nightmare_timさんの記事に譲りたいと思います。

ビルダーがある

GroovyをGroovyたらしめている定番機能として外せないのはやはりビルダーだろう。MarkupBuilderや

3.Javaフレンドリー

妥当なJavaコードはほぼそのまま妥当なGroovyコードです。
Java使いをGroovyに引き込むサンプル集 - No Programming, No Life

GroovyはJavaユーザが最初にはじめるべきLL言語です。*2

Javaクラスの挙動を確かめる

現場で使えるGroovy(その3)「JavaにREPLが無いならgroovysh, groovyConsoleを使えばいいじゃない」 - No Programming, No Life
Javaクラスの挙動を手軽に簡単に確かめるにはGroovyConsoleやGroovyShがうってつけ。
GroovyはJavaコードを貼付ければ大抵動くし、より簡単にクラスを試験できる。

GroovyはJavaの望ましい進化の先を走ってくれているようなものだ。GroovyはJavaの未来を見ている。Groovyを見ているとJavaもまだまだやれるという気になってくる。

4.テストしやすさ

GroovyはprivateにアクセスできるJavaです。by うさみみ超人こと id:kyon_mm

5.WriteOnceRunAnywhere

Groovyには@Grabがある。
@Grabというのは、Maven(Ivy)リポジトリに登録されているJar(Javaライブラリ)を依存関係を保った状態で、必要に応じて自動で取得してきて利用できる仕組みです。Groovyはこれを言語レベルでサポートしているため、気軽にそれこそimport文を書く感覚でインストール作業不要*3でいきなりライブラリを利用したコードを書き始めることができるのです。
俺俺リポジトリを作って、みんなに使ってもらうこともできる。

@Grabを使ったスクリプトファイルはWriteOnceRunAnywhereの最終形態。
.groovy のテキストファイルを持ち歩くだけで、どこでも動かせる、これが大人のスクリプト(by @nobeans)

6. 豊富なライブラリ

主要なライブラリは、でも触れている。

7.貪欲さ

多言語から多くの利点を吸収し続ける。
 例えば、Grails(Rails, Spring), GPars(ScalaのActor, ClujureのAgent)

遅出しじゃんけん

たとえばGroovyはRubyから多大な影響を受けている。他の言語の良い部分を貪欲にどんどん吸収し、成長し続けている。
この記事を書いている現時点ではGroovyはv1.8.4が最新であるが、v2.0, v3.0と日々進化を続けている。他の言語の成功した部分を後から取り入れていく。まさに遅出しじゃんけん。

8.マスコット

Groovyには冒頭でもご紹介したぐるーびーたんという素敵なマスコットがいます。id:torazuka 氏 作画です。

9.コミュニティー

JGGUG(Japan Grails/Groovy User Group) という組織があります*4。定期的に開催されている勉強会、G*ワークショップGrailsドキュメント会もくもくGroovyなど、Groovyの普及を強力にバックアップしています。

おわりに

というわけで、駆け足で紹介してきましたが、魅力が伝わったでしょうか。
もしちょっとでもいいなと思っていただけたら、今日から、いや、今すぐはじめましょう。

Groovy Web Console ならインストール不要ですぐにはじめられます。

Enjoy your code more groovier!

P.S.

ちょっと記事が手抜き気味ですがご了承下さい。私事ですが、最近業務が忙しく記事を書く時間が悉く削られておりました。それでは引き続き、G* Advent Calendar 2011をお楽しみ下さい。

書籍紹介

Groovyist必読書です。ぜひあなたの本棚にも。

プログラミングGROOVY

プログラミングGROOVY


Groovyイン・アクション

Groovyイン・アクション


Grails徹底入門

Grails徹底入門

  • 作者: 山田正樹,山本剛,上原潤二,永井昌子,杉山清美,杉浦孝博,笠原史郎,香月孝太,福岡竜一,伊堂寺北斗
  • 出版社/メーカー: 翔泳社
  • 発売日: 2008/08/26
  • メディア: 大型本
  • 購入: 2人 クリック: 34回
  • この商品を含むブログ (27件) を見る

更新履歴

  • 2011-12-12 (+2)の件と、Rubyについての部分を修正。

*1:@Canonicalについては[http://d.hatena.ne.jp/fumokmm/20110427/1303924658:title=こちら]を参照。

*2:ずっと言い続けていますが、Groovyこそ真の意味でのJavaScriptであると思っています。

*3:ただし、ネットワーク環境がないとだめですけど :-0

*4:私も中の人だったりします