uehaj's blog

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

Groovy 1.6-beta-1

Groovy 1.6-beta-1が出ました。
GroovyZoneの記事「Groovy 1.6-beta-1 is released」を簡単に訳してみました。



Location:
http://groovy.codehaus.org

G2OneとGroovy開発チームが1.6の最初のベータを出すことができたことについて、本当にうれしく思います。

73個のバグフィックスと、上のリリースノートにある24個の改善のなかで、もっとも注力されたのは性能の改善です。
コンパイル時間と実行時間の改善

1.5.5で気づいたと思いますが、コンパイラは以前のバージョンより3倍から5倍速くなりました。この改善は開発バージョンおよび1.5.xの安定ブランチで有効です。クラス検索キャッシュのおかげで、プロジェクトが大きければ大きいほどコンパイル時間は高速になります。

といいつつ、もっとも注目すべき変化は、Groovyの一般的なランタイムの性能向上です。改善の度合いを計るために、Great Language Shootoutにあるいくつかのベンチマークを使ってみましたが、いくつかのベンチマークでは、現在の1.5.6から比べて性能が150%から460%になりました。マイクロベンチマークがあなたのプロジェクトの反映ではないことは明らかですが、全体的な性能は明らかに向上することでしょう。

安定性と品質を保ちつつ、過去の10ヶ月は性能問題に注力してきました。Groovy 1.0と1.5.1の間で、80%の性能向上を行いました。また、いわゆる「ドットリリース(1.5.5〜1.5.6)」でも、40%以上は高速化しました。しかし、「advanced call site caching techniques」を統合し、ランタイムにおけるバイトコードをスリム化させた開発部ランチにおいて、前述の150-460%の性能向上を達成したのです。

重要な新機能

性能向上の作業とは別に、バグフィックスと地味な改善を行いました。開発中の2つの鍵となる機能を紹介しましょう。

多重代入

まずは、多重代入について説明します。

「百聞は1コードサンプルに如かず」というわけで、サンプルです:

def listOfN(numOfElem) { 0..numOfElem }

def a, b

// variables will contain each successive element of the list
// and variables beyond the count of elements will be null
[a, b] = listOfN(0) // a list of one element
assert a == 0
assert b == null

// if there are more elements, they won't be assigned to any variable
[a, b] = listOfN(9) // a list of ten elements
assert a == 0
assert b == 1

// and you can swap variables with this notation
[a, b] = [b, a]
assert a == 1
assert b == 0

AST変換

別のキーポイントはAST変換です。こちらは、Groovyの内部を知っている人にとって有用な、高度な機能といえましょう。しかし、うれしいことに、いくつかの実用な変換は、Swing開発者にとっては興味を引くかもしれません。

GroovyコンパイラがGroovyスクリプトとクラスをコンパイルするとき、あるいくつかのポイントにおいて、ソースコードは具象構文木の形でメモリ上に表現され、しかる後に抽象構文木に変換されます。AST変換の目的は、開発者がコンパイル過程をフックして、バイトコードに変換し、実行する前にASTを加工することができるようにすることです。特定クラス・フィールド・メソッドに対してにアノテーションを使用して指示しておくことで、それらの要素に対応するASTに対して変換が適用することができます。

AST変換として実現できるその種の変換の具体的な例は、新しい「@Bindableアノテーション」です。これはSwing開発者にとって特に有用でしょう。以下を見てください。

class MyBean {
@Bindable String prop
}

フィールドに@Bindableを指定したとき、プロパティチェンジリスナーのメソッドがこのクラスのバイトコードに透過的に追加され、そのメソッドを自分で書かなくても、このフィールドの変更をモニターすることができます。プロパティのセッターとかに、手動イベント変更イベントを発火させるためのaddPropertyListener()やremovePropertyListener()メソッドを書く必要はもはやありません。

Danno Ferrin がこのアノテーションについての興味深い概要を彼のブログに書いてくれています。

他の有用で興味深い変換とアノテーションも将来実現されるでしょう。
アノテーションの定義

最後になりましたが、これはとるにならないものではありません。前述のように、Groovy1.5ではGroovy自身でアノテーションを定義することはできませんでした。これらはJavaで書く必要がありました。いまや、Groovyそれ自身で、通常のJavaで書くのと同じように、アノテーションを定義することができます。

その他メモ

Groovy 1.6-beta-1はJDK 5向けに開発されているが、1.4向けには「レトロ変換」したバージョンのGroovyを提供します。しかしながら、JDK 1.4上で同様の性能向上は得られないかもしれません。なぜかというといくつかの拡張はJDK5(例えば
util.concurrent VM最適化)から得られているからです。

前述の様に、Groovyコンパイラが生成したバイトコードは、アノテーションenumジェネリックすを除き1.4 JVMバイトコードををターゲットにしています。

有用なリンク

新ベータは以下からダウンロードできる。

http://groovy.codehaus.org/Download

以下のJIRAからリリースノートを読みなさい:

http://jira.codehaus.org/secure/ReleaseNote.jspa?projectId=10242&styleName=Html&version=14008

さいごに

このリリースを出すことについて手伝ってくれた皆さんに感謝します。 ユーザー、コントリビュータ、コミッター、G2Oneの社員の方。性能の改善と革新的な新バージョンはみなさんのハードワークなしにはありえなかったでしょう。Paul King、Danno Ferrin, Alex Tkachman、 Jochen "blackdrag" Theodorouのコミットメントと質の高い作業に特別に感謝します。

このリリースについてのあなたのフィードバックにとても興味があります。これは1.6安定版のファイナルリリースではないし、業務では1.5.xを使っていると思いますが、このβプラットフォームはあなたのそれぞれのプロジェクトで動作させるためのノウハウを知りたいし、問題やデグレードがあったらぜひお知らせください。どんなことでも良いのでレポートください。


Enjoy!