new feature of groovy2.0 g*workshop

65
Groovy2.0 の新機能 疾きこと CompileStaticのごとし 2012/10/26 JGGUG G*Workshop #24 NTTソフトウェア Grails推進室 上原潤二 http://www.flickr.com/photos/mrhermit/3214708288/ 121027日土曜日

Upload: junji-uehara

Post on 13-Jan-2015

4.750 views

Category:

Technology


1 download

DESCRIPTION

JGGUG G*ワークショップ「Vert.x+JavaOne+Groovy2.0なG*」での発表資料です。

TRANSCRIPT

Page 1: New feature of Groovy2.0 G*Workshop

Groovy2.0の新機能

疾きことCompileStaticのごとし

2012/10/26 JGGUG G*Workshop #24 NTTソフトウェア Grails推進室 上原潤二

http://www.flickr.com/photos/mrhermit/3214708288/12年10月27日土曜日

Page 2: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

自己紹介上原潤二(@uehaj)NTTソフトウェア株式会社Grails推進室JGGUG(日本Grails/Groovyユーザグループ)運営委員書籍執筆: プログラミングGROOVY(技術評論社), Grails徹底入門(翔泳社)ブログ「Grな日々」GroovyServ, LispBuilder, GVM開発者

12年10月27日土曜日

Page 3: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

お品書きGroovyの歴史を簡単にGroovy1.8の新機能(おさらい)Groovy2.0の新機能静的Groovyindy対応ライブラリ強化モジュール化

まとめGroovy 3.X

312年10月27日土曜日

Page 4: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

Groovyの歴史を簡単に

4

年 リリース トピックス2003 Groovy 開発開始2004 Groovy 1.0-jsr-01 JSR 2412007 Groovy 1.02007 Groovy 1.5(=1.1) Java5対応2009 Groovy 1.6 AST変換導入2009 Groovy 1.72011 Groovy 1.82012 Groovy 2.0(=1.9) Java SE 7対応

12年10月27日土曜日

Page 5: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

AST変換強化

ライブラリ強化

Java SE 7対応

静的Grovy

Groovy 2.0の新機能 その他

512年10月27日土曜日

Page 6: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

AST変換強化

ライブラリ強化

Java SE 7対応

静的Grovy

Groovy 2.0の新機能 その他

静的型チェック静的コンパイル

512年10月27日土曜日

Page 7: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

AST変換強化

ライブラリ強化

Java SE 7対応

静的Grovy

Groovy 2.0の新機能 その他

NotYetImplemented

TypeChecked, CompileStatic

静的型チェック静的コンパイル

512年10月27日土曜日

Page 8: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

AST変換強化

ライブラリ強化

Java SE 7対応

静的Grovy

Groovy 2.0の新機能 その他

NotYetImplemented

TypeChecked, CompileStatic

モジュール化

静的型チェック静的コンパイル

512年10月27日土曜日

Page 9: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

AST変換強化

ライブラリ強化

Java SE 7対応

静的Grovy

Groovy 2.0の新機能 その他

NotYetImplemented

TypeChecked, CompileStatic

モジュール化

静的型チェック静的コンパイル

5

Project Coin対応

indy対応

二進リテラル

マルチキャッチ

リテラル中の下線

12年10月27日土曜日

Page 10: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

AST変換強化

ライブラリ強化

Java SE 7対応

静的Grovy

Groovy 2.0の新機能 その他

NotYetImplemented

TypeChecked, CompileStatic

モジュール化

静的型チェック静的コンパイル

5

Project Coin対応

indy対応

二進リテラル

マルチキャッチ

リテラル中の下線Collection.inject()

Matcher.matchesPartially()

takeWhile/dropWhileCalendar.next/PreviouswithDefault/withEagar…

12年10月27日土曜日

Page 11: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

AST変換強化

ライブラリ強化

Java SE 7対応

静的Grovy

Groovy 2.0の新機能 その他

NotYetImplemented

TypeChecked, CompileStatic

モジュール化

静的型チェック静的コンパイル

5

Project Coin対応

indy対応

二進リテラル

マルチキャッチ

リテラル中の下線Collection.inject()

Matcher.matchesPartially()

takeWhile/dropWhileCalendar.next/PreviouswithDefault/withEagar…

12年10月27日土曜日

Page 12: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

AST変換群SinceGroovy 2.0NotYetImplementedTypeCheckedCompileStatic

6

Since Groovy 1.7 Grabpower assert

SinceGroovy 1.8ListenerList AutoCloneAutoExternalizeCanonicalEqualsAndHashCodeFieldIndexedPropertyInheritConstructorsSynchronizedConditionalInterrupt ThreadInterruptTimedInterruptToStringTupleConstructorWithReadLock / WithWriteLockCommons / Log / Log4j / Slf4j

Since Groovy 1.6

BindableVetoableCategoryDelegateImmutableLazyMixinNewifySingletonPackageScope

2.0新機能

12年10月27日土曜日

Page 13: New feature of Groovy2.0 G*Workshop

静的Groovyhttp://www.flickr.com/photos/kaeru/501750/

12年10月27日土曜日

Page 14: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

静的型チェック/静的コンパイル@TypeChecked: 静的型チェック➡型を確定することでわかるエラーをコンパイル時にチェック

@CompileStatic: 静的コンパイル➡静的型チェックに加え、型が静的に定まっていることを前提としたコードが生成➡目的は性能向上AST変換アノテーションとして実装されている

これらのアノテーションをクラスやメソッドに指定すると、その範囲のメソッド内のコードが対象となる

8

2.0新機能

この2者を総称したものがGroovy2.0での「静的Groovy」

12年10月27日土曜日

Page 15: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

「静的Groovy」で何がどう変わるの?

変数・メソッド引数等に型宣言が必要となる(その結果キャスト等が必要になる場合がある)要はjavaといっしょだyo!!!ただし型推論により型宣言は省略できる場合がある

型推論対象:クロージャから参照されていないローカル変数やメソッド引数

型推論対象外(明示的型指定が必要):フィールドやバインディング変数クロージャ引数(itなど) クロージャから参照されているローカル変数やメソッド引数

9

変数への代入/初期化の右辺等により型を決める

他スレッドによる変数の値変更をコンパイラが把握できないため12年10月27日土曜日

Page 16: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

静的型チェックにより検出されるエラー例

10

import  groovy.transform.TypeChecked

@TypeCheckedint  foo(String  s)  {    int  i  =  s    //  [Static  type  checking]  -­‐  Cannot  assign  value  of  type  java.lang.String  to  variable  of  type  int    String  result  =  s.toUppperCase()    //  [Static  type  checking]  -­‐  Cannot  find  matching  method  java.lang.String#toUppperCase().  Please  check  if  the  declared  type  is  right  and  if  the  method  exists.    return  result    //  [Static  type  checking]  -­‐  Cannot  return  value  of  type  java.lang.String  on  method  returning  type  int}

型が違う!

そんなメソッド無い!

型が違う!

12年10月27日土曜日

Page 17: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

GGTS 3.0.0から利用

1112年10月27日土曜日

Page 18: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

フローセンシティブタイピング

12

def a = -3

a.abs()a.toUpperCase()

a = "ABC"

a.abs()a.toUpperCase()

12年10月27日土曜日

Page 19: New feature of Groovy2.0 G*Workshop

aはint型と見なされる

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

フローセンシティブタイピング

12

def a = -3

a.abs()a.toUpperCase()

a = "ABC"

a.abs()a.toUpperCase()

12年10月27日土曜日

Page 20: New feature of Groovy2.0 G*Workshop

aはString型と見なされる

aはint型と見なされる

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

フローセンシティブタイピング

12

def a = -3

a.abs()a.toUpperCase()

a = "ABC"

a.abs()a.toUpperCase()

12年10月27日土曜日

Page 21: New feature of Groovy2.0 G*Workshop

aはString型と見なされる

aはint型と見なされる

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

フローセンシティブタイピング

12

def a = -3

a.abs()a.toUpperCase()

a = "ABC"

a.abs()a.toUpperCase()

[Static type checking] - Cannot find matching method java.lang.Integer#toUpperCase()

12年10月27日土曜日

Page 22: New feature of Groovy2.0 G*Workshop

aはString型と見なされる

aはint型と見なされる

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

フローセンシティブタイピング

12

def a = -3

a.abs()a.toUpperCase()

a = "ABC"

a.abs()a.toUpperCase()

[Static type checking] - Cannot find matching method java.lang.Integer#toUpperCase()

[Static type checking] - Cannot find matching method java.lang.String#abs()

12年10月27日土曜日

Page 23: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

静的コンパイル String foo(String s) {     s.toUpperCase() }

 @CompileStatic String bar(String s) {     s.toUpperCase() }

12年10月27日土曜日

Page 24: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

静的コンパイル String foo(String s) {     s.toUpperCase() }

 @CompileStatic String bar(String s) {     s.toUpperCase() }

public String foo(String s){ CallSite acallsite[] = $getCallSiteArray(); return (String)ScriptBytecodeAdapter.castToType(acallsite[0].call(s), java/lang/String);}

12年10月27日土曜日

Page 25: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

静的コンパイル String foo(String s) {     s.toUpperCase() }

 @CompileStatic String bar(String s) {     s.toUpperCase() }

public String foo(String s){ CallSite acallsite[] = $getCallSiteArray(); return (String)ScriptBytecodeAdapter.castToType(acallsite[0].call(s), java/lang/String);}

public String bar(String s){ return s.toUpperCase();}

12年10月27日土曜日

Page 26: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

ベンチマーク(CompileStatic)

14

https://github.com/alextkachman/fib-benchmark をベースに計測。グラフはJavaを1としたときの実行時間の比率(大きいほど速い)。

0.0##

0.2##

0.4##

0.6##

0.8##

1.0##

1.2##

[Binary#Trees]#

[Fannkuch]#

[Fasta]#

[Fib(sta<c#ternary)]#

[Fib(sta<c#if)]#

[Fib(instance#ternary)]#

[Fib(instance#if)]#

[Quicksort]#

[SpectralNorm]#

[ThreadRing]#

Groovy#1.8.2#

Groovy#2.0.1#

Groovy#2.0.1#CompileSta<c#

Java#SE#1.7.0u6#

CompileStatic

12年10月27日土曜日

Page 27: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

静的型のメリット・デメリット静的型のメリット:1.静的型情報に基づいた最適化による性能向上➡静的コンパイル

2.コンパイル時型チェックによる信頼性向上➡静的型チェック

3.作業効率向上(IDEによる入力補完機能、タイプミス早期検出)➡静的型チェック

4.ドキュメンテーションとしての型情報による保守性向上➡オプショナルタイピング(既存機能)

デメリット: 面倒臭い・字数が増える・多態コード・動的機能(EMC,Builderやマルチメソッドなど)が利用できない

15

総合的にいって、本当に向上するかは議論の余地がある

12年10月27日土曜日

Page 28: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

@CompileStatic適用の実際既存のGroovyコードを静的コンパイルするために必要なのは、@CompileStaticをつけて回るだけの簡単な作業・・・

静的コンパイルを通すための修正(例):型宣言を省略していたところを補う(def, 引数, it

を型指定して宣言)/Closure#call()の返り値はキャストする/nullを適宜キャストする/引数の動的型に基いたメソッド選択(マルチメソッド)を使用していた場合、静的に型が確定しているならキャストで。していなければ、Java的にダブルディスパッチで実装しなおす/ダックタイピングは複数メソッドに展開するかinterfaceを導入

➡規模が大きいと書き換えは相当面倒以下は対応不可EMC、カテゴリ、invokeMethod()などによる動的メソッド追加(結果としてのBuilder周り)メソッド引数でのSpread/Spread map operator (*)の使用アクセス修飾(private,protected,package private)が効いてアクセス不可

➡@CompileStatic(TypeCheckingMode.SKIP)で逃げる16

ではない!(少なくともGroovy 2.0.0では。)

12年10月27日土曜日

Page 29: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

CompileStaticとアクセス修飾静的コンパイルで生成されるコードはJavaのアクセス修飾子による制限に支配される他クラスのprivateメソッドは呼べない(Javaでは当たり前)ただし、Groovyで定義した(GroovyObjectを継承した)クラスに対して、フィールドに関してはブリッジメソッド経由でアクセス可

17

class  Target  {    private  int  field    private  void  method(){}}

@groovy.transform.CompileStaticclass  StaticCompiledClass  {    void  foo(Target  t)  {        t.method()    //  Cannot  call  private  method  Target#method        "ABC".value[0]  =  "x"  //  [STC]  -­‐  Access  to  java.lang.String#value  is  forbidden        t.field  =  3      //  OK    }}

ちなみに@TypeCheckedではエラーにならないのが仕様らしいが(GROOVY-5677)

12年10月27日土曜日

Page 30: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

余談:Grails 2.2での状況Grails 2.2ではGroovy 2.Xが採用される予定Grailsの最新ソースを「CompileStatic」でgrepしてみる

18

%  grep  -­‐r  CompileStatic  ../grails-­‐bootstrap/src/main/groovy/grails/util/BuildSettings.groovy:import  groovy.transform.CompileStatic./grails-­‐bootstrap/src/main/groovy/grails/util/BuildSettings.groovy:        @CompileStatic./grails-­‐bootstrap/src/main/groovy/grails/util/BuildSettings.groovy:        @CompileStatic./grails-­‐bootstrap/src/main/groovy/grails/util/BuildSettings.groovy:        @CompileStatic./grails-­‐bootstrap/src/main/groovy/grails/util/BuildSettings.groovy:        @CompileStatic./grails-­‐bootstrap/src/main/groovy/grails/util/BuildSettings.groovy:        @CompileStatic  :%  grep  -­‐r  CompileStatic  .  |  wc              124          247      13863

12年10月27日土曜日

Page 31: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

Groovy++と静的Groovy

19

Groovy++2009~2011(開発完)

@TypeChecked静的型チェック

@CompileStatic静的コンパイル

2011~

コードベースの継続性はない

Groovy 2.0

@Typedアノテーションによる静的Groovy

mixedモードコンパイル、末尾再帰最適化、traits..などの先進的な機能 対応物は今のところ

無し

12年10月27日土曜日

Page 32: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

ベンチマーク(vs. Groovy++)

20

0.0##

0.2##

0.4##

0.6##

0.8##

1.0##

1.2##

[Binary#Trees]#

[Fannkuch]#

[Fasta]#

[Fib(sta<c#ternary)]#

[Fib(sta<c#if)]#

[Fib(instance#ternary)]#

[Fib(instance#if)]#

[Quicksort]#

[SpectralNorm]#

[ThreadRing]#

Groovy#1.8.2#

Groovy#2.0.1#

Groovy#2.0.1#CompileSta<c#

Java#SE#1.7.0u6#

Groovy#2.0.1#indy#

Groovy++0.9.0/1.8.2#

Grroovy++

12年10月27日土曜日

Page 34: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

indyとその利用方法

groovy/groovycコマンドから使う<GROOVY_HOME>/lib,embeddeable/配下の、-indy接尾辞のついたjarファイルを-indyなしにリネームgroovyコマンド、もしくはgroovycコマンドで--indyを指定

gradle(1.1以降)から使う

22

dependencies  {        groovy  group:  'org.codehaus.groovy',  name:  'groovy-­‐all',  version:'2.0.1',  classifier:'indy'}compileGroovy  {        groovyOptions.optimizationOptions.indy=true}

indy…Java VM上での動的言語実行の効率化を目的とした機能拡張(JSR292)の通称。Java SE 7(JDK)から利用可

2.0新機能

12年10月27日土曜日

Page 35: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

ベンチマーク(indy)

23

0.0##

0.2##

0.4##

0.6##

0.8##

1.0##

1.2##

[Binary#Trees]#

[Fannkuch]#

[Fasta]#

[Fib(sta<c#ternary)]#

[Fib(sta<c#if)]#

[Fib(instance#ternary)]#

[Fib(instance#if)]#

[Quicksort]#

[SpectralNorm]#

[ThreadRing]#

Groovy#1.8.2#

Groovy#2.0.1#

Groovy#2.0.1#CompileSta<c#

Java#SE#1.7.0u6#

Groovy#2.0.1#indy#

Groovy 2.0.1 -indy

12年10月27日土曜日

Page 36: New feature of Groovy2.0 G*Workshop

ライブラリ強化

http://www.flickr.com/photos/aloudnoise/5133172272/12年10月27日土曜日

Page 37: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

injectのおさらい

25

[e1,e2,e3,e4,e5].inject(ini){acc,val-­‐>式}  →  <結果>

assert  [1,2,3,4,5].inject(0){a,b  -­‐>  a+b}  ==  1512年10月27日土曜日

Page 38: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

injectのおさらい

25

[e1,e2,e3,e4,e5].inject(ini){acc,val-­‐>式}  →  <結果>

ini e1, e2, e3, e4, e5 ][

assert  [1,2,3,4,5].inject(0){a,b  -­‐>  a+b}  ==  1512年10月27日土曜日

Page 39: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

injectのおさらい

25

{acc,val-­‐>式}

[e1,e2,e3,e4,e5].inject(ini){acc,val-­‐>式}  →  <結果>

ini e1, e2, e3, e4, e5 ][

assert  [1,2,3,4,5].inject(0){a,b  -­‐>  a+b}  ==  1512年10月27日土曜日

Page 40: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

injectのおさらい

25

{acc,val-­‐>式}

{acc,val-­‐>式}

[e1,e2,e3,e4,e5].inject(ini){acc,val-­‐>式}  →  <結果>

ini e1, e2, e3, e4, e5 ][

assert  [1,2,3,4,5].inject(0){a,b  -­‐>  a+b}  ==  1512年10月27日土曜日

Page 41: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

injectのおさらい

25

{acc,val-­‐>式}

{acc,val-­‐>式}

{acc,val-­‐>式}

[e1,e2,e3,e4,e5].inject(ini){acc,val-­‐>式}  →  <結果>

ini e1, e2, e3, e4, e5 ][

assert  [1,2,3,4,5].inject(0){a,b  -­‐>  a+b}  ==  1512年10月27日土曜日

Page 42: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

injectのおさらい

25

{acc,val-­‐>式}

{acc,val-­‐>式}

{acc,val-­‐>式}

{acc,val-­‐>式}

[e1,e2,e3,e4,e5].inject(ini){acc,val-­‐>式}  →  <結果>

ini e1, e2, e3, e4, e5 ][

assert  [1,2,3,4,5].inject(0){a,b  -­‐>  a+b}  ==  1512年10月27日土曜日

Page 43: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

injectのおさらい

25

{acc,val-­‐>式}

{acc,val-­‐>式}

{acc,val-­‐>式}

{acc,val-­‐>式}

{acc,val-­‐>式}

[e1,e2,e3,e4,e5].inject(ini){acc,val-­‐>式}  →  <結果>

ini e1, e2, e3, e4, e5 ][

assert  [1,2,3,4,5].inject(0){a,b  -­‐>  a+b}  ==  1512年10月27日土曜日

Page 44: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

injectのおさらい

25

{acc,val-­‐>式}

{acc,val-­‐>式}

{acc,val-­‐>式}

{acc,val-­‐>式}

{acc,val-­‐>式} →  <結果>

[e1,e2,e3,e4,e5].inject(ini){acc,val-­‐>式}  →  <結果>

ini e1, e2, e3, e4, e5 ][

assert  [1,2,3,4,5].inject(0){a,b  -­‐>  a+b}  ==  1512年10月27日土曜日

Page 45: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

初期値無しinject

26

e1

{acc,val-­‐>式}

{acc,val-­‐>式}

{acc,val-­‐>式}

{acc,val-­‐>式} →  <結果>

[e1,e2,e3,e4,e5].inject{acc,val-­‐>式}  →  <結果>

e2, e3, e4, e5 ][

2.0新機能

assert  [1,2,3,4,5].inject{a,b  -­‐>  a+b}  ==  1512年10月27日土曜日

Page 46: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

Matcher#matchesPartially()

27

(x=~p).matchesPartially()の結果

➡インタラクティブなバリデーションなどに使用可能

assert  ("1"          =~  /\d\d\d/).matchesPartially()assert  ("12"        =~  /\d\d\d/).matchesPartially()assert  ("123"      =~  /\d\d\d/).matchesPartially()assert  !("12a"    =~  /\d\d\d/).matchesPartially()assert  !("1234"  =~  /\d\d\d/).matchesPartially()

true …文字列xの末尾になんらかの文字列を追加したものは、 パターンpにマッチする可能性がある

false …文字列xの末尾にどんな文字列を追加しても、 パターンpにマッチすることは有り得ない

2.0新機能

12年10月27日土曜日

Page 47: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

(List,CharSequence,Map,T[]).takeWhile{}

28

[e1,e2,e3,e4,e5].takeWhile{it-­‐>式}  →  <結果>

リストの要素を順にたどり、クロージャを適用した結果が真である要素のみからなる先頭部分を返す。

assert  [1,2,3,4,3].takeWhile{it<=3}  ==  [1,2,3]

[ ]

][

2.0新機能

12年10月27日土曜日

Page 48: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

(List,CharSequence,Map,T[]).takeWhile{}

28

[e1,e2,e3,e4,e5].takeWhile{it-­‐>式}  →  <結果>

リストの要素を順にたどり、クロージャを適用した結果が真である要素のみからなる先頭部分を返す。

assert  [1,2,3,4,3].takeWhile{it<=3}  ==  [1,2,3]

[ ]

][

e1,

e1,

{it-­‐>式}がtrue

2.0新機能

12年10月27日土曜日

Page 49: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

(List,CharSequence,Map,T[]).takeWhile{}

28

[e1,e2,e3,e4,e5].takeWhile{it-­‐>式}  →  <結果>

リストの要素を順にたどり、クロージャを適用した結果が真である要素のみからなる先頭部分を返す。

assert  [1,2,3,4,3].takeWhile{it<=3}  ==  [1,2,3]

[ ]

][

e1,

e1,

{it-­‐>式}がtrue

e2,

e2,

{it-­‐>式}がtrue

2.0新機能

12年10月27日土曜日

Page 50: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

(List,CharSequence,Map,T[]).takeWhile{}

28

[e1,e2,e3,e4,e5].takeWhile{it-­‐>式}  →  <結果>

リストの要素を順にたどり、クロージャを適用した結果が真である要素のみからなる先頭部分を返す。

assert  [1,2,3,4,3].takeWhile{it<=3}  ==  [1,2,3]

[ ]

][

e1,

e1,

{it-­‐>式}がtrue

e2,

e2,

{it-­‐>式}がtrue

e3,

{it-­‐>式}がtrue

e3

2.0新機能

12年10月27日土曜日

Page 51: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

(List,CharSequence,Map,T[]).takeWhile{}

28

[e1,e2,e3,e4,e5].takeWhile{it-­‐>式}  →  <結果>

リストの要素を順にたどり、クロージャを適用した結果が真である要素のみからなる先頭部分を返す。

assert  [1,2,3,4,3].takeWhile{it<=3}  ==  [1,2,3]

[ ]

][

e1,

e1,

{it-­‐>式}がtrue

e2,

e2,

{it-­‐>式}がtrue

e4,

{it-­‐>式}がfalse

e3,

{it-­‐>式}がtrue

e3

2.0新機能

12年10月27日土曜日

Page 52: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

(List,CharSequence,Map,T[]).takeWhile{}

28

[e1,e2,e3,e4,e5].takeWhile{it-­‐>式}  →  <結果>

リストの要素を順にたどり、クロージャを適用した結果が真である要素のみからなる先頭部分を返す。

assert  [1,2,3,4,3].takeWhile{it<=3}  ==  [1,2,3]

e5

{it-­‐>式}がtrue

[ ]

][

e1,

e1,

{it-­‐>式}がtrue

e2,

e2,

{it-­‐>式}がtrue

e4,

{it-­‐>式}がfalse

e3,

{it-­‐>式}がtrue

e3

2.0新機能

12年10月27日土曜日

Page 53: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

(List,CharSequence,Map,T[]).dropWhile{}

29

[e1,e2,e3,e4,e5].dropWhile{it-­‐>式}  →  <結果>

リストの要素を順にたどり、クロージャを適用した結果が偽である初めての要素以降を返す。

assert  [1,2,3,4,3].dropWhile{it<=3}  ==  [4,5]

[ ]

][

2.0新機能

12年10月27日土曜日

Page 54: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

(List,CharSequence,Map,T[]).dropWhile{}

29

[e1,e2,e3,e4,e5].dropWhile{it-­‐>式}  →  <結果>

リストの要素を順にたどり、クロージャを適用した結果が偽である初めての要素以降を返す。

assert  [1,2,3,4,3].dropWhile{it<=3}  ==  [4,5]

[ ]

][

e1,

{it-­‐>式}がtrue

2.0新機能

12年10月27日土曜日

Page 55: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

(List,CharSequence,Map,T[]).dropWhile{}

29

[e1,e2,e3,e4,e5].dropWhile{it-­‐>式}  →  <結果>

リストの要素を順にたどり、クロージャを適用した結果が偽である初めての要素以降を返す。

assert  [1,2,3,4,3].dropWhile{it<=3}  ==  [4,5]

[ ]

][

e1,

{it-­‐>式}がtrue

e2,

{it-­‐>式}がtrue

2.0新機能

12年10月27日土曜日

Page 56: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

(List,CharSequence,Map,T[]).dropWhile{}

29

[e1,e2,e3,e4,e5].dropWhile{it-­‐>式}  →  <結果>

リストの要素を順にたどり、クロージャを適用した結果が偽である初めての要素以降を返す。

assert  [1,2,3,4,3].dropWhile{it<=3}  ==  [4,5]

[ ]

][

e1,

{it-­‐>式}がtrue

e2,

{it-­‐>式}がtrue

e3,

{it-­‐>式}がtrue

2.0新機能

12年10月27日土曜日

Page 57: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

(List,CharSequence,Map,T[]).dropWhile{}

29

[e1,e2,e3,e4,e5].dropWhile{it-­‐>式}  →  <結果>

リストの要素を順にたどり、クロージャを適用した結果が偽である初めての要素以降を返す。

assert  [1,2,3,4,3].dropWhile{it<=3}  ==  [4,5]

[ ]

][

e1,

{it-­‐>式}がtrue

e2,

{it-­‐>式}がtrue

e3,

{it-­‐>式}がtrue

e4,

{it-­‐>式}がfalse

e4,

2.0新機能

12年10月27日土曜日

Page 58: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

(List,CharSequence,Map,T[]).dropWhile{}

29

[e1,e2,e3,e4,e5].dropWhile{it-­‐>式}  →  <結果>

リストの要素を順にたどり、クロージャを適用した結果が偽である初めての要素以降を返す。

assert  [1,2,3,4,3].dropWhile{it<=3}  ==  [4,5]

[ ]

][

e1,

{it-­‐>式}がtrue

e2,

{it-­‐>式}がtrue

e3,

{it-­‐>式}がtrue

e4,

{it-­‐>式}がfalse

e4,

e5

{it-­‐>式}がtrue

e5

2.0新機能

12年10月27日土曜日

Page 59: New feature of Groovy2.0 G*Workshop

モジュール化http://www.flickr.com/photos/aplumb/3890003295/

12年10月27日土曜日

Page 60: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

モジュール化(1)

groovy-1.8.2.jar…5,529,556バイトgroovy-2.0.1.jar…3,270,730バイト➡切り出されたもの: groovy-ant, groovy-bsf, groovy-console, groovy-docgenerator,

groovy-groovydoc, groovy-groovysh, groovy-jmx, groovy-json, groovy-jsr223, groovy-servlet, groovy-sql, groovy-swing, groovy-templates, groovy-test, groovy-testng, groovy-xml

利用者(Groovyプログラマ)にはあまり影響ないmaven pomモジュールとしても分割されている依存性がきっちり定義されている

31

groovy-X.X.X.jarを「拡張モジュール」の集合として再構成

2.0新機能

しゅりんく!

12年10月27日土曜日

Page 61: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

モジュール化(2)拡張モジュールは「カスタム拡張メソッド」を提供できるGDKメソッドのように既存クラスにメソッドを追加するカテゴリとは異なり、静的Groovy配下で利用可能

@Grabで取り込んだ場合でもカスタム拡張メソッドは有効。

拡張モジュールは誰でも作れ、実体は以下のような内容の「org.codehaus.groovy.runtime.ExtensionModule」ファイルをMETA-INF/services directoryに含めたJarファイル

32

moduleName=groovy-­‐streammoduleVersion=0.5.1extensionClasses=groovy.stream.StreamExtensionstaticExtensionClasses=

12年10月27日土曜日

Page 62: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.33

まとめhttp://www.flickr.com/photos/limonada/214375219/

12年10月27日土曜日

Page 63: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

Groovyの今後(1)Groovy 2.1遅くとも2012年中invokedynamicバイトコード命令サポートを完成させるDelegateTo(DSLに対する静的型サポート)言語レベルの改良も継続的に行っている

Groovy 3.02013年

GEP11 - Groovy 3 semantics and new MOPとして検討invokedynamicを前提としたMOP(Groovyの動的コア)の全面見直し

invokedynamicサポートから最大の利点を得るGroovy自体をもっとGroovy自身で書き直す

3412年10月27日土曜日

Page 64: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

まとめ静的Groovyは2.0の目玉ではあるものの、誰もが使わなければならないものでもない実開発への適用はもうちょっと待った方が良いかもGrailsでの採用を経て鍛錬されることを期待indy対応はまだまだですね今後は、非標準拡張モジュールによるエコシステム成長(プラグイン化)が期待される

3512年10月27日土曜日

Page 65: New feature of Groovy2.0 G*Workshop

Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

参考URL・商標http://www.slideshare.net/glaforge/groovy-20-devoxx-france-2012http://www.infoq.com/jp/articles/new-groovy-20http://www.jroller.com/melix/entry/groovy_2_0_from_anhttp://docs.codehaus.org/display/GROOVY/Creating+an+extension+modulehttp://d.hatena.ne.jp/ksky/20100513/p1http://docs.codehaus.org/display/GroovyJSR/GEP+11+-+Groovy+3+semantics+and+new+MOPhttp://glaforge.appspot.com/article/minor-new-features-of-groovy-2-0http://glaforge.appspot.com/article/incomplete-string-regex-matchinghttp://docs.oracle.com/javase/specs/jvms/se7/jvms7.pdfhttp://melix.github.com/talks/s2gx-typechecking/slides.htmlhttp://m.infoworld.com/d/application-development/groovy-the-roadmap-the-popular-jvm-language-202990?page=0,1OracleとJavaは、Oracle Corporation 及びその子会社、関連会社の米国及びその他の国における登録商標です。文中の社名、商品名等は各社の商標または登録商標である場合があります。記載されているロゴ、システム名、製品名は各社及び商標権者の登録商標あるいは商標です

3612年10月27日土曜日