SlideShare uma empresa Scribd logo
1 de 66
Groovy2.0
        の新機能
                                             静かなること
                                            静的型のごとし
             2012/9/1 JGGUG G*Workshop in 福岡
                NTTソフトウェア Grails推進室 上原潤二


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



Slide #   JGGUG G*Workshop   Copyright(C) 2012 NTT Software Corporation All rights reserved.
お品書き
   Groovyの歴史を簡単に
   Groovy1.8の新機能(おさらい)
   Groovy2.0の新機能
       静的Groovy
       indy対応
       ライブラリ強化
       モジュール化
   まとめ
       Groovy 3.X


Slide # 3   JGGUG G*Workshop   Copyright(C) 2012 NTT Software Corporation All rights reserved.
Groovyの歴史を簡単に
  年                     リリース                      トピックス
2003                                              Groovy 開発開始
2004         Groovy      1.0-jsr-01               JSR 241
2007         Groovy      1.0
2007         Groovy      1.5(=1.1)                Java5対応
2009         Groovy      1.6                      AST変換導入
2009         Groovy      1.7
2011         Groovy      1.8
2012         Groovy      2.0(=1.9)                Java SE 7対応



 Slide # 4   JGGUG G*Workshop    Copyright(C) 2012 NTT Software Corporation All rights reserved.
クロージャ周り強化
                                                                  AST変換強化
  アノテーションのクロージャ引数
                                                                            多数のAST変換追加
     クロージャ合成
                                                                            ASTブラウザの強化
     トランポリン
     メモ化                         Groovy 1.8                                  ASTメタデータ


                                 の新機能
 部分適用(curry)の拡張



効率向上                                                                                 その他

                                                                                        実行可能jarによる
プリミティブ演算最適化                                                                             スクリプト実行、
                                                                                        Grab改良、
メソッドの直接呼び出し
                                          ライブラリ強化                                       GroovyDocカスタマ
                                                                                        イズ、モジュール化

    文法の拡張
                                                            GDK・Groovy APIメソッドの追加
                                                           GParsの標準添付
                  拡張コマンド式(GEP3)
                                                             GSqlのページング
                $/ドルスラッシュ文字列リテラル/$
              スラッシュ文字列リテラルの複数行対応

  Slide # 5   JGGUG G*Workshop     Copyright(C) 2012 NTT Software Corporation All rights reserved.
静的Grovy
                                                                   AST変換強化




                                  Groovy 2.0
Java SE 7対応
                                  の新機能                                             その他


                                    ライブラリ強化




   Slide # 6   JGGUG G*Workshop     Copyright(C) 2012 NTT Software Corporation All rights reserved.
静的Grovy
                                                                   AST変換強化

      静的型チェック
    静的コンパイル
                                  Groovy 2.0
Java SE 7対応
                                  の新機能                                             その他


                                    ライブラリ強化




   Slide # 6   JGGUG G*Workshop     Copyright(C) 2012 NTT Software Corporation All rights reserved.
静的Grovy
                                                                   AST変換強化

      静的型チェック                                                               NotYetImplemented
    静的コンパイル
                                  Groovy 2.0                             TypeChecked, CompileStatic




Java SE 7対応
                                  の新機能                                             その他


                                    ライブラリ強化




   Slide # 6   JGGUG G*Workshop     Copyright(C) 2012 NTT Software Corporation All rights reserved.
静的Grovy
                                                                   AST変換強化

      静的型チェック                                                               NotYetImplemented
    静的コンパイル
                                  Groovy 2.0                             TypeChecked, CompileStatic




Java SE 7対応
                                  の新機能                                             その他

                                                                                モジュール化
                                    ライブラリ強化




   Slide # 6   JGGUG G*Workshop     Copyright(C) 2012 NTT Software Corporation All rights reserved.
静的Grovy
                                                                    AST変換強化

       静的型チェック                                                               NotYetImplemented
     静的コンパイル
                                   Groovy 2.0                             TypeChecked, CompileStatic




Java SE 7対応
                                   の新機能                                             その他

Project Coin対応                                                                   モジュール化
     二進リテラル                          ライブラリ強化
    リテラル中の下線
    マルチキャッチ


   indy対応


    Slide # 6   JGGUG G*Workshop     Copyright(C) 2012 NTT Software Corporation All rights reserved.
静的Grovy
                                                                    AST変換強化

       静的型チェック                                                               NotYetImplemented
     静的コンパイル
                                   Groovy 2.0                             TypeChecked, CompileStatic




Java SE 7対応
                                   の新機能                                             その他

Project Coin対応                                                                   モジュール化
     二進リテラル                          ライブラリ強化
    リテラル中の下線
    マルチキャッチ                           Collection.inject()
                                     Matcher.matchesPartially()
                                     takeWhile/dropWhile
   indy対応                             Calendar.next/Previous
                                      withDefault/withEagar
                                       …
    Slide # 6   JGGUG G*Workshop     Copyright(C) 2012 NTT Software Corporation All rights reserved.
静的Grovy
                                                                    AST変換強化

       静的型チェック                                                               NotYetImplemented
     静的コンパイル
                                   Groovy 2.0                             TypeChecked, CompileStatic




Java SE 7対応
                                   の新機能                                             その他

Project Coin対応                                                                   モジュール化
     二進リテラル                          ライブラリ強化
    リテラル中の下線
    マルチキャッチ                           Collection.inject()
                                     Matcher.matchesPartially()
                                     takeWhile/dropWhile
   indy対応                             Calendar.next/Previous
                                      withDefault/withEagar
                                       …
    Slide # 6   JGGUG G*Workshop     Copyright(C) 2012 NTT Software Corporation All rights reserved.
AST変換群
                                                                                         2.0新機能
Since                        Since                               Since
Groovy 1.6                   Groovy 1.8                          Groovy 2.0
   Bindable                      ListenerList              NotYetImplemented
   Vetoable                      AutoClone                 TypeChecked
   Category                      AutoExternalize           CompileStatic
   Delegate                      Canonical
   Immutable                     EqualsAndHashCode
   Lazy                          Field
   Mixin                         IndexedProperty
   Newify                        InheritConstructors
   Singleton                     Synchronized
   PackageScope                  ConditionalInterrupt
                                 ThreadInterrupt
Since                            TimedInterrupt
Groovy 1.7                       ToString
                                 TupleConstructor
 Grab
 power assert                    WithReadLock / WithWriteLock
                                 Commons / Log / Log4j / Slf4j
  Slide # 7   JGGUG G*Workshop        Copyright(C) 2012 NTT Software Corporation All rights reserved.
静的Groovy
http://www.flickr.com/photos/kaeru/501750/
静的型チェック/静的コンパイル                                                                  2.0新機能

 @TypeChecked: 静的型チェック
 ➡型を確定することでわかるエラー                                                        この2者を総
  をコンパイル時にチェック                                                          称したものが
 @CompileStatic: 静的コンパイル                                                Groovy2.0で
 ➡静的型チェックに加え、                                                           の「静的
     型が静的に定まっている
     ことを前提としたコードを生成
 ➡目的は性能向上
 AST変換アノテーションとして実装されている
     これらのアノテーションをクラスやメソッドに指定すると、
     その範囲のメソッド内のコードが対象となる
 Slide # 9   JGGUG G*Workshop   Copyright(C) 2012 NTT Software Corporation All rights reserved.
「静的Groovy」で何がどう変るの?
 変数・メソッド引数等に型宣言が必要となる
 (その結果キャスト等が必要になる場合がある)
 要はjavaといっしょだyo!!!
   ただし型推論により型宣言は省略できる場合がある
         変数への代入/初期化の右辺等により型を決める
      型推論対象:
          クロージャから参照されていないローカル変数やメソッド引数
      型推論対象外(明示的型指定が必要):
          フィールドやバインディング変数
          クロージャから参照されているローカル変数やメソッド引数

 他スレッドによる変数の値変更をコンパイラが把握できない
 Slide # 10 JGGUG G*Workshop   Copyright(C) 2012 NTT Software Corporation All rights reserved.
静的型チェックにより検出されるエラー例

import groovy.transform.TypeChecked

@TypeChecked                              型が違う!
int 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
}
    Slide # 11 JGGUG G*Workshop   Copyright(C) 2012 NTT Software Corporation All rights reserved.
GGTS 3.0.0から利用




 Slide # 12 JGGUG G*Workshop   Copyright(C) 2012 NTT Software Corporation All rights reserved.
フローセンシティブタイピング

def a = -3

a.abs()
a.toUpperCase()

a = "ABC"

a.abs()
a.toUpperCase()
  Slide # 13 JGGUG G*Workshop   Copyright(C) 2012 NTT Software Corporation All rights reserved.
フローセンシティブタイピング

                                aはint型と見な
def a = -3

a.abs()
a.toUpperCase()

a = "ABC"

a.abs()
a.toUpperCase()
  Slide # 13 JGGUG G*Workshop   Copyright(C) 2012 NTT Software Corporation All rights reserved.
フローセンシティブタイピング

                                aはint型と見な
def a = -3

a.abs()
a.toUpperCase()

a = "ABC"                                aはString型と


a.abs()
a.toUpperCase()
  Slide # 13 JGGUG G*Workshop   Copyright(C) 2012 NTT Software Corporation All rights reserved.
フローセンシティブタイピング

                                aはint型と見な
def a = -3
                                                 [Static type checking] -
a.abs()                                         Cannot find matching method
                                                java.lang.Integer#toUpperCas
a.toUpperCase()                                 e()

a = "ABC"                                aはString型と


a.abs()
a.toUpperCase()
  Slide # 13 JGGUG G*Workshop   Copyright(C) 2012 NTT Software Corporation All rights reserved.
フローセンシティブタイピング

                                aはint型と見な
def a = -3
                                             [Static type checking] -
a.abs()                                     Cannot find matching method
                                            java.lang.Integer#toUpperCas
a.toUpperCase()                             e()

a = "ABC"                              aはString型と


a.abs()
                                         [Static type checking] - Cannot
a.toUpperCase()                         find matching method
  Slide # 13 JGGUG G*Workshop
                                        java.lang.String#abs() rights reserved.
                                Copyright(C) 2012 NTT Software Corporation All
静的コンパイル
 String foo(String s) {
     s.toUpperCase()
 }




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




   Slide #   JGGUG G*Workshop   Copyright(C) 2012 NTT Software Corporation All rights reserved.
静的コンパイル
 String foo(String s) {
     s.toUpperCase()
 }             public String            foo(String s)
                         {
                           CallSite acallsite[] = $getCallSiteArray();
                           return
                         (String)ScriptBytecodeAdapter.castToType(acallsite[0].
                         call(s), java/lang/String);
                         }
 @CompileStatic
 String bar(String s) {
     s.toUpperCase()
 }




   Slide #   JGGUG G*Workshop      Copyright(C) 2012 NTT Software Corporation All rights reserved.
静的コンパイル
 String foo(String s) {
     s.toUpperCase()
 }             public String            foo(String s)
                         {
                           CallSite acallsite[] = $getCallSiteArray();
                           return
                         (String)ScriptBytecodeAdapter.castToType(acallsite[0].
                         call(s), java/lang/String);
                         }
 @CompileStatic
 String bar(String s) {
     s.toUpperCase()
 }
                          public String bar(String s)
                          {
                            return s.toUpperCase();
                          }

   Slide #   JGGUG G*Workshop      Copyright(C) 2012 NTT Software Corporation All rights reserved.
ベンチマーク(CompileStatic)
 1.2##


 1.0##


 0.8##
                                                                                                   CompileStatic

 0.6##
                                                                                                Groovy#1.8.2#

 0.4##                                                                                          Groovy#2.0.1#

                                                                                                Groovy#2.0.1#CompileSta<c#
 0.2##                                                                                          Java#SE#1.7.0u6#

 0.0##
              ]#




                                                                       #


                                                                     )]#


                                                                       #


                                                                      ]#


                                                                     )]#




                                                                      ]#


                                                                       #
                         ]#




                                                                       #
                                                                   a]




                                                                   f)]




                                                                   g]
                                                                  rt]
           es




                                                                 y)




                                                                 m
                      ch




                                                                ry




                                                                #i f




                                                               in
                                st




                                                              c#i




                                                              so
                                                              ar




                                                              or
         re


                   ku




                                                             ce
                                                            na
                                 a




                                                            dR
                                                           a<


                                                           rn




                                                           ck


                                                           lN
                              [F
    y#T


               nn




                                                         an
                                                         er




                                                        ea
                                                       #te




                                                        ui
                                                      ( st




                                                        ra
  ar




                                                     c#t
                a




                                                      st


                                                    [Q




                                                    hr
                                                    ct
             [F




                                                  ce
                                                   ib




                                                 (i n
  in




                                                a<




                                                pe


                                                [T
                                                [F


                                               an
[B




                                              ib
                                ( st




                                             [S
                                            st


                                           [F
                                 ib




                                       (i n
                              [F




                                    ib
                                 [F




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

             Slide # 15 JGGUG G*Workshop            Copyright(C) 2012 NTT Software Corporation All rights reserved.
静的型のメリット・デメリット
静的型のメリット:
                                                                       総合的にいっ
1.静的型情報に基づいた最適化による性能向上
                                                                       て、本当に向上
 ➡静的コンパイル
                                                                       するかは議論の
2.コンパイル時型チェックによる信頼性向上
 ➡静的型チェック
3.作業効率向上(IDEによる入力補完機能、タイプミス早期検出)
 ➡静的型チェック
4.ドキュメンテーションとしての型情報による保守性向上
 ➡オプショナルタイピング(既存機能)
デメリット:                  面倒臭い・字数が増える・多態コード・動的機能
(EMC,Builderやマルチメソッドなど)が利用できない

 Slide # 16 JGGUG G*Workshop   Copyright(C) 2012 NTT Software Corporation All rights reserved.
@CompileStatic適用の実際
 既存のGroovyコードを静的コンパイルするために必要なの
 は、@CompileStaticをつけて回るだけの簡単な作業・・・
 ではない!(少なくともGroovy 2.0.0では。)
 静的コンパイルを通すための修正(例):型宣言を省略していたところを補う(def,
 引数, itを型指定して宣言)/Closure#call()の返り値はキャストする/nullを適宜キャストする/引数の動的型に基
 いたメソッド選択(マルチメソッド)を使用していた場合、静的に型が確定しているならキャストで。していなけれ
 ば、Java的にダブルディスパッチで実装しなおす/ダックタイピングは複数メソッドに展開するかinterfaceを導入

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

➡@CompileStatic(TypeCheckingMode.SKIP)で逃げる
   Slide # 17 JGGUG G*Workshop   Copyright(C) 2012 NTT Software Corporation All rights reserved.
CompileStaticとアクセス修飾
 静的コンパイルで生成されるコードはJavaのアクセス修飾
 子による制限に支配される
    例えば他クラスのprivateメソッドは呼べない(Javaでは当たり前)
    ただし、Groovyで定義した(GroovyObjectを継承した)クラスに
    対して、フィールドに関してはpublicアクセス可

class Target {
  private int field
  private void method(){}
}
@groovy.transform.CompileStatic
class StaticCompiledClass {
  void foo(Target t) {
    t.method()  // Cannot call private method Target#method
    "ABC".vaue[0] = "x" // [STC] - No such property: vaue for class: java.lang.String
    t.field = 3   // OK
  }
}

     Slide # 18 JGGUG G*Workshop            Copyright(C) 2012 NTT Software Corporation All rights reserved.
余談:Grails 2.2での状況
  Grails 2.2ではGroovy 2.Xが採用される予定
  Grailsの最新ソースを「CompileStatic」で
  grepしてみる
% 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


    Slide # 19 JGGUG G*Workshop   Copyright(C) 2012 NTT Software Corporation All rights reserved.
Groovy++と静的Groovy
Groovy++                                             Groovy 2.0
2009∼2011(開発完)                                       2011∼




                                     コードベースの継続性はない
  @Typedアノテー                                                @TypeChecked
  ションによる                                                    静的型チェック
  静的Groovy                                                  @CompileStatic
                                                            静的コンパイル


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

  Slide # 20 JGGUG G*Workshop   Copyright(C) 2012 NTT Software Corporation All rights reserved.
ベンチマーク(vs. Groovy++)
 1.2##
                                                                                                              Grroovy++
 1.0##


 0.8##
                                                                                                             Groovy#1.8.2#
 0.6##
                                                                                                             Groovy#2.0.1#

 0.4##                                                                                                       Groovy#2.0.1#CompileSta<c#

                                                                                                             Java#SE#1.7.0u6#
 0.2##                                                                                                       Groovy#2.0.1#indy#

                                                                                                             Groovy++0.9.0/1.8.2#
 0.0##
              ]#




                                   #


                                             )]#


                                                                                   )]#


                                                                                    ]#


                                                                                   )]#




                                                                                    ]#


                                                                                     #
                         ]#




                                                                                     #
                                 a]




                                                                                 g]
                                                                                rt]
           es




                                                                               y)




                                                                               m
                      ch




                                           ry


                                                          f




                                                                              #i f




                                                                             in
                                st




                                                      c#i




                                                                           so
                                                                            ar




                                                                           or
         re


                   ku




                                                                          ce
                                            na
                                 a




                                                                         dR
                                                   a<


                                                                         rn




                                                                         ck


                                                                        lN
                              [F
    y#T


               nn




                                                                       an
                                          er




                                                                      ea
                                                                     #te




                                                                      ui
                                                 ( st




                                                                      ra
  ar




                                      c#t
                a




                                                                    st


                                                                  [Q




                                                                  hr
                                                                  ct
             [F




                                                                ce
                                                ib




                                                               (i n
  in




                                  a<




                                                             pe


                                                              [T
                                             [F


                                                         an
[B




                                                            ib
                                ( st




                                                          [S
                                                      st


                                                         [F
                                 ib




                                                     (i n
                              [F




                                                    ib
                                                 [F




             Slide # 21 JGGUG G*Workshop                         Copyright(C) 2012 NTT Software Corporation All rights reserved.
indy対応
http://www.flickr.com/photos/tdar/6330565982/
indyとその利用方法                                                                     2.0新機能

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

groovy/groovycコマンドから使う
  <GROOVY_HOME>/lib,embeddeable/配下の、-indy接尾
  辞のついたjarファイルを-indyなしにリネーム
  groovyコマンド、もしくはgroovycコマンドで--indyを指定
gradle(1.1以降)から使う
 dependencies {
     groovy group: 'org.codehaus.groovy', name: 'groovy-all',
 version:'2.0.1', classifier:'indy'
 }
 compileGroovy {
     groovyOptions.optimizationOptions.indy=true
 }
 Slide # 23 JGGUG G*Workshop   Copyright(C) 2012 NTT Software Corporation All rights reserved.
ベンチマーク(indy)
 1.2##


 1.0##


 0.8##


 0.6##                                                                                                        Groovy#1.8.2#

                                                                                                              Groovy#2.0.1#
 0.4##
                                                                                                              Groovy#2.0.1#CompileSta<c#

                                                                                                              Java#SE#1.7.0u6#
 0.2##
                                                                                                              Groovy#2.0.1#indy#
 0.0##
              ]#




                                   #


                                             )]#


                                                                                   )]#


                                                                                    ]#


                                                                                   )]#




                                                                                    ]#


                                                                                     #
                         ]#




                                                                                     #
                                 a]




                                                                                 g]
                                                                                rt]
           es




                                                                               y)




                                                                               m
                      ch




                                           ry


                                                          f




                                                                              #i f




                                                                             in
                                st




                                                      c#i




                                                                            so
                                                                            ar




                                                                            or
         re


                   ku




                                                                           ce
                                            na
                                 a




                                                                          dR
                                                   a<


                                                                         rn




                                                                         ck


                                                                         lN
                              [F
    y#T


               nn




                                                                       an
                                          er




                                                                      ea
                                                                     #te




                                                                      ui
                                                 ( st




                                                                      ra
  ar




                                      c#t
                a




                                                                    st


                                                                  [Q




                                                                  hr
                                                                  ct
             [F




                                                                ce
                                                ib




                                                               (i n
  in




                                  a<




                                                             pe


                                                              [T
                                             [F


                                                         an
[B




                                                            ib
                                ( st




                                                          [S
                                                      st


                                                         [F




                                                                                                         Groovy 2.0.1 -indy
                                 ib




                                                     (i n
                              [F




                                                    ib
                                                 [F




               Slide # 24 JGGUG G*Workshop                        Copyright(C) 2012 NTT Software Corporation All rights reserved.
ライブラリ
                   強化
http://www.flickr.com/photos/aloudnoise/5133172272/
injectのおさらい
[e1,e2,e3,e4,e5].inject(ini){acc,val->式} → <結果>




assert# [1,2,3,4,5].inject(0){a,b 2012 NTT Software Corporation All rights reserved.
   26
    Slide JGGUG G*Workshop Copyright(C) -> a+b} == 15
injectのおさらい
[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 2012 NTT Software Corporation All rights reserved.
   26
    Slide JGGUG G*Workshop Copyright(C) -> a+b} == 15
injectのおさらい
[e1,e2,e3,e4,e5].inject(ini){acc,val->式} → <結果>


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


     {acc,val->式}




assert# [1,2,3,4,5].inject(0){a,b 2012 NTT Software Corporation All rights reserved.
   26
    Slide JGGUG G*Workshop Copyright(C) -> a+b} == 15
injectのおさらい
[e1,e2,e3,e4,e5].inject(ini){acc,val->式} → <結果>


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


     {acc,val->式}
                   {acc,val->式}




assert# [1,2,3,4,5].inject(0){a,b 2012 NTT Software Corporation All rights reserved.
   26
    Slide JGGUG G*Workshop Copyright(C) -> a+b} == 15
injectのおさらい
[e1,e2,e3,e4,e5].inject(ini){acc,val->式} → <結果>


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


     {acc,val->式}
                   {acc,val->式}

                              {acc,val->式}




assert# [1,2,3,4,5].inject(0){a,b 2012 NTT Software Corporation All rights reserved.
   26
    Slide JGGUG G*Workshop Copyright(C) -> a+b} == 15
injectのおさらい
[e1,e2,e3,e4,e5].inject(ini){acc,val->式} → <結果>


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


     {acc,val->式}
                   {acc,val->式}

                              {acc,val->式}

                                          {acc,val->式}



assert# [1,2,3,4,5].inject(0){a,b 2012 NTT Software Corporation All rights reserved.
   26
    Slide JGGUG G*Workshop Copyright(C) -> a+b} == 15
injectのおさらい
[e1,e2,e3,e4,e5].inject(ini){acc,val->式} → <結果>


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


     {acc,val->式}
                   {acc,val->式}

                              {acc,val->式}

                                          {acc,val->式}
                                                      {acc,val->式}

assert# [1,2,3,4,5].inject(0){a,b 2012 NTT Software Corporation All rights reserved.
   26
    Slide JGGUG G*Workshop Copyright(C) -> a+b} == 15
injectのおさらい
[e1,e2,e3,e4,e5].inject(ini){acc,val->式} → <結果>


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


     {acc,val->式}
                   {acc,val->式}

                              {acc,val->式}

                                          {acc,val->式}
                                                      {acc,val->式} → <結果
                                                                             >
assert# [1,2,3,4,5].inject(0){a,b 2012 NTT Software Corporation All rights reserved.
   26
    Slide JGGUG G*Workshop Copyright(C) -> a+b} == 15
初期値無しinject                                                 2.0新機能

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


   e1                     [    e2,    e3,     e4,     e5    ]



    {acc,val->式}
                {acc,val->式}

                         {acc,val->式}

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


assert# [1,2,3,4,5].inject{a,b -> a+b} == 15 All rights reserved.
   27
    Slide JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation
Matcher#matchesPartially()                                                      2.0新機能

(x= p).matchesPartially()の結果
     true    …文字列xの末尾になんらかの文字列を追加したものは、
             パターンpにマッチする可能性がある
     false     …文字列xの末尾にどんな文字列を追加しても、
              パターンpにマッチすることは有り得ない


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


➡インタラクティブなバリデーションなどに使用可能
  Slide # 28 JGGUG G*Workshop   Copyright(C) 2012 NTT Software Corporation All rights reserved.
(List,CharSequence,Map,T[]).takeWhile{}                                    2.0新機


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

    [                                                                      ]




[                                            ]

    リストの要素を順にたどり、クロージャを適用した結果が
    真である要素のみからなる先頭部分を返す。
assert #[1,2,3,4,3].takeWhile{it<=3} Software Corporation All rights reserved.
    Slide 29 JGGUG G*Workshop Copyright(C) 2012 NTT == [1,2,3]
(List,CharSequence,Map,T[]).takeWhile{}                                    2.0新機


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

    [    e1,                                                               ]


        {it->式}
        がtrue


[       e1,                                  ]

    リストの要素を順にたどり、クロージャを適用した結果が
    真である要素のみからなる先頭部分を返す。
assert #[1,2,3,4,3].takeWhile{it<=3} Software Corporation All rights reserved.
    Slide 29 JGGUG G*Workshop Copyright(C) 2012 NTT == [1,2,3]
(List,CharSequence,Map,T[]).takeWhile{}                                    2.0新機


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

    [    e1,         e2,                                                   ]


        {it->式}    {it->式}
        がtrue      がtrue


[       e1,          e2,                     ]

    リストの要素を順にたどり、クロージャを適用した結果が
    真である要素のみからなる先頭部分を返す。
assert #[1,2,3,4,3].takeWhile{it<=3} Software Corporation All rights reserved.
    Slide 29 JGGUG G*Workshop Copyright(C) 2012 NTT == [1,2,3]
(List,CharSequence,Map,T[]).takeWhile{}                                    2.0新機


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

    [    e1,         e2,            e3,                                    ]


        {it->式}    {it->式}         {it->式}
        がtrue      がtrue           がtrue


[       e1,          e2,            e3       ]

    リストの要素を順にたどり、クロージャを適用した結果が
    真である要素のみからなる先頭部分を返す。
assert #[1,2,3,4,3].takeWhile{it<=3} Software Corporation All rights reserved.
    Slide 29 JGGUG G*Workshop Copyright(C) 2012 NTT == [1,2,3]
(List,CharSequence,Map,T[]).takeWhile{}                                    2.0新機


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

    [    e1,         e2,            e3,            e4,                     ]


        {it->式}    {it->式}         {it->式}        {it->式}
        がtrue      がtrue           がtrue          がfalse


[       e1,          e2,            e3       ]

    リストの要素を順にたどり、クロージャを適用した結果が
    真である要素のみからなる先頭部分を返す。
assert #[1,2,3,4,3].takeWhile{it<=3} Software Corporation All rights reserved.
    Slide 29 JGGUG G*Workshop Copyright(C) 2012 NTT == [1,2,3]
(List,CharSequence,Map,T[]).takeWhile{}                                    2.0新機


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

    [    e1,         e2,            e3,            e4,            e5       ]


        {it->式}    {it->式}         {it->式}        {it->式}        {it->式}
        がtrue      がtrue           がtrue          がfalse         がtrue


[       e1,          e2,            e3       ]

    リストの要素を順にたどり、クロージャを適用した結果が
    真である要素のみからなる先頭部分を返す。
assert #[1,2,3,4,3].takeWhile{it<=3} Software Corporation All rights reserved.
    Slide 29 JGGUG G*Workshop Copyright(C) 2012 NTT == [1,2,3]
(List,CharSequence,Map,T[]).dropWhile{}                                      2.0新機

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

 [                                                                           ]




                                            [                            ]

  リストの要素を順にたどり、クロージャを適用した結果が
  偽である初めての要素以降を返す。
assert #[1,2,3,4,3].dropWhile{it<=3}Software Corporation All rights reserved.
    Slide 30 JGGUG G*Workshop Copyright(C) 2012 NTT == [4,5]
(List,CharSequence,Map,T[]).dropWhile{}                                      2.0新機

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

 [    e1,                                                                    ]


     {it->式}
     がtrue


                                            [                            ]

  リストの要素を順にたどり、クロージャを適用した結果が
  偽である初めての要素以降を返す。
assert #[1,2,3,4,3].dropWhile{it<=3}Software Corporation All rights reserved.
    Slide 30 JGGUG G*Workshop Copyright(C) 2012 NTT == [4,5]
(List,CharSequence,Map,T[]).dropWhile{}                                      2.0新機

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

 [    e1,            e2,                                                     ]


     {it->式}       {it->式}
     がtrue         がtrue


                                            [                            ]

  リストの要素を順にたどり、クロージャを適用した結果が
  偽である初めての要素以降を返す。
assert #[1,2,3,4,3].dropWhile{it<=3}Software Corporation All rights reserved.
    Slide 30 JGGUG G*Workshop Copyright(C) 2012 NTT == [4,5]
(List,CharSequence,Map,T[]).dropWhile{}                                      2.0新機

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

 [    e1,            e2,           e3,                                       ]


     {it->式}       {it->式}        {it->式}
     がtrue         がtrue          がtrue


                                            [                            ]

  リストの要素を順にたどり、クロージャを適用した結果が
  偽である初めての要素以降を返す。
assert #[1,2,3,4,3].dropWhile{it<=3}Software Corporation All rights reserved.
    Slide 30 JGGUG G*Workshop Copyright(C) 2012 NTT == [4,5]
(List,CharSequence,Map,T[]).dropWhile{}                                      2.0新機

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

 [    e1,            e2,           e3,            e4,                        ]


     {it->式}       {it->式}        {it->式}        {it->式}
     がtrue         がtrue          がtrue          がfalse


                                            [     e4,                    ]

  リストの要素を順にたどり、クロージャを適用した結果が
  偽である初めての要素以降を返す。
assert #[1,2,3,4,3].dropWhile{it<=3}Software Corporation All rights reserved.
    Slide 30 JGGUG G*Workshop Copyright(C) 2012 NTT == [4,5]
(List,CharSequence,Map,T[]).dropWhile{}                                      2.0新機

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

 [    e1,            e2,           e3,            e4,             e5         ]


     {it->式}       {it->式}        {it->式}        {it->式}        {it->式}
     がtrue         がtrue          がtrue          がfalse         がtrue


                                            [     e4,            e5      ]

  リストの要素を順にたどり、クロージャを適用した結果が
  偽である初めての要素以降を返す。
assert #[1,2,3,4,3].dropWhile{it<=3}Software Corporation All rights reserved.
    Slide 30 JGGUG G*Workshop Copyright(C) 2012 NTT == [4,5]
モジュール化
http://www.flickr.com/photos/aplumb/3890003295/
モジュール化(1)                                                                        2.0新機能

groovy-X.X.X.jarを「拡張モジュール」の集合とし
て再構成
 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モジュールとしても分割されている
 依存性がきっちり定義されている

 Slide # 32 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
ファイル
moduleName=groovy-stream
moduleVersion=0.5.1
extensionClasses=groovy.stream.StreamExtension
staticExtensionClasses=

Slide # 33 JGGUG G*Workshop   Copyright(C) 2012 NTT Software Corporation All rights reserved.
まとめ
Slide # 34
                    http://www.flickr.com/photos/limonada/214375219/
             JGGUG G*Workshop     Copyright(C) 2012 NTT Software Corporation All rights reserved.
GEP11から見るGroovy 3
 GEP11 - Groovy 3 semantics and new MOP
  問題のあるセマンティクスを修正・改善
     Removing default null argument
     Removing automatic list expansion
     Changing Safe Navigation to stop evaluation
  ユーザ提案
     Instance based Categories
  MOP2 … invokedynamicを前提としたMOPの全面見直し
     invokeMethodは単なるメソッドコールではなく、
     MethodHandlerで置換されるプレースホルダとなる


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


Slide # 36 JGGUG G*Workshop   Copyright(C) 2012 NTT Software Corporation All rights reserved.
参考URL
http://www.slideshare.net/glaforge/groovy-20-devoxx-france-2012
http://www.infoq.com/jp/articles/new-groovy-20
http://www.jroller.com/melix/entry/groovy_2_0_from_an
http://docs.codehaus.org/display/GROOVY/Creating+an+extension+module
http://d.hatena.ne.jp/ksky/20100513/p1
http://docs.codehaus.org/display/GroovyJSR/GEP+11+-+Groovy
+3+semantics+and+new+MOP
http://glaforge.appspot.com/article/minor-new-features-of-groovy-2-0
http://glaforge.appspot.com/article/incomplete-string-regex-matching
http://docs.oracle.com/javase/specs/jvms/se7/jvms7.pdf




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

Mais conteúdo relacionado

Mais procurados

Groovy Shell Scripting 2015
Groovy Shell Scripting 2015Groovy Shell Scripting 2015
Groovy Shell Scripting 2015Uehara Junji
 
enterprise grails challenge, 2013 Summer
enterprise grails challenge, 2013 Summerenterprise grails challenge, 2013 Summer
enterprise grails challenge, 2013 SummerUehara Junji
 
Introduce Groovy 2.3 trait
Introduce Groovy 2.3 trait Introduce Groovy 2.3 trait
Introduce Groovy 2.3 trait Uehara Junji
 
Java One 2012 Tokyo JVM Lang. BOF(Groovy)
Java One 2012 Tokyo JVM Lang. BOF(Groovy)Java One 2012 Tokyo JVM Lang. BOF(Groovy)
Java One 2012 Tokyo JVM Lang. BOF(Groovy)Uehara Junji
 
New features of Groovy 2.0 and 2.1
New features of Groovy 2.0 and 2.1New features of Groovy 2.0 and 2.1
New features of Groovy 2.0 and 2.1Uehara Junji
 
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...NTT DATA Technology & Innovation
 
C#でOpenCL with OpenTK + Cloo
C#でOpenCL with OpenTK + ClooC#でOpenCL with OpenTK + Cloo
C#でOpenCL with OpenTK + Clooaokomoriuta
 
Synthesijer jjug 201504_01
Synthesijer jjug 201504_01Synthesijer jjug 201504_01
Synthesijer jjug 201504_01Takefumi MIYOSHI
 
Head toward Java 16 (Night Seminar Edition)
Head toward Java 16 (Night Seminar Edition)Head toward Java 16 (Night Seminar Edition)
Head toward Java 16 (Night Seminar Edition)Yuji Kubota
 
HeapStats @ Seasar Conference 2015 LT
HeapStats @ Seasar Conference 2015 LTHeapStats @ Seasar Conference 2015 LT
HeapStats @ Seasar Conference 2015 LTYuji Kubota
 
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例Yoshifumi Kawai
 
Java SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心にJava SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心にTaku Miyakawa
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugMasatoshi Tada
 
コンテナを突き破れ!! ~コンテナセキュリティ入門基礎の基礎~(Kubernetes Novice Tokyo #11 発表資料)
コンテナを突き破れ!! ~コンテナセキュリティ入門基礎の基礎~(Kubernetes Novice Tokyo #11 発表資料)コンテナを突き破れ!! ~コンテナセキュリティ入門基礎の基礎~(Kubernetes Novice Tokyo #11 発表資料)
コンテナを突き破れ!! ~コンテナセキュリティ入門基礎の基礎~(Kubernetes Novice Tokyo #11 発表資料)NTT DATA Technology & Innovation
 
Migration Guide from Java 8 to Java 11 #jjug
Migration Guide from Java 8 to Java 11 #jjugMigration Guide from Java 8 to Java 11 #jjug
Migration Guide from Java 8 to Java 11 #jjugYuji Kubota
 
RLSを用いたマルチテナント実装 for Django
RLSを用いたマルチテナント実装 for DjangoRLSを用いたマルチテナント実装 for Django
RLSを用いたマルチテナント実装 for DjangoTakayuki Shimizukawa
 
OpenJDK トラブルシューティング #javacasual
OpenJDK トラブルシューティング #javacasualOpenJDK トラブルシューティング #javacasual
OpenJDK トラブルシューティング #javacasualYuji Kubota
 

Mais procurados (20)

Groovy Shell Scripting 2015
Groovy Shell Scripting 2015Groovy Shell Scripting 2015
Groovy Shell Scripting 2015
 
enterprise grails challenge, 2013 Summer
enterprise grails challenge, 2013 Summerenterprise grails challenge, 2013 Summer
enterprise grails challenge, 2013 Summer
 
Introduce Groovy 2.3 trait
Introduce Groovy 2.3 trait Introduce Groovy 2.3 trait
Introduce Groovy 2.3 trait
 
Java One 2012 Tokyo JVM Lang. BOF(Groovy)
Java One 2012 Tokyo JVM Lang. BOF(Groovy)Java One 2012 Tokyo JVM Lang. BOF(Groovy)
Java One 2012 Tokyo JVM Lang. BOF(Groovy)
 
New features of Groovy 2.0 and 2.1
New features of Groovy 2.0 and 2.1New features of Groovy 2.0 and 2.1
New features of Groovy 2.0 and 2.1
 
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
 
C#でOpenCL with OpenTK + Cloo
C#でOpenCL with OpenTK + ClooC#でOpenCL with OpenTK + Cloo
C#でOpenCL with OpenTK + Cloo
 
Synthesijer jjug 201504_01
Synthesijer jjug 201504_01Synthesijer jjug 201504_01
Synthesijer jjug 201504_01
 
Head toward Java 16 (Night Seminar Edition)
Head toward Java 16 (Night Seminar Edition)Head toward Java 16 (Night Seminar Edition)
Head toward Java 16 (Night Seminar Edition)
 
HeapStats @ Seasar Conference 2015 LT
HeapStats @ Seasar Conference 2015 LTHeapStats @ Seasar Conference 2015 LT
HeapStats @ Seasar Conference 2015 LT
 
Hls friends 20161122.key
Hls friends 20161122.keyHls friends 20161122.key
Hls friends 20161122.key
 
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
 
Java SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心にJava SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心に
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
 
コンテナを突き破れ!! ~コンテナセキュリティ入門基礎の基礎~(Kubernetes Novice Tokyo #11 発表資料)
コンテナを突き破れ!! ~コンテナセキュリティ入門基礎の基礎~(Kubernetes Novice Tokyo #11 発表資料)コンテナを突き破れ!! ~コンテナセキュリティ入門基礎の基礎~(Kubernetes Novice Tokyo #11 発表資料)
コンテナを突き破れ!! ~コンテナセキュリティ入門基礎の基礎~(Kubernetes Novice Tokyo #11 発表資料)
 
Migration Guide from Java 8 to Java 11 #jjug
Migration Guide from Java 8 to Java 11 #jjugMigration Guide from Java 8 to Java 11 #jjug
Migration Guide from Java 8 to Java 11 #jjug
 
RLSを用いたマルチテナント実装 for Django
RLSを用いたマルチテナント実装 for DjangoRLSを用いたマルチテナント実装 for Django
RLSを用いたマルチテナント実装 for Django
 
OpenJDK トラブルシューティング #javacasual
OpenJDK トラブルシューティング #javacasualOpenJDK トラブルシューティング #javacasual
OpenJDK トラブルシューティング #javacasual
 
Microblaze loader
Microblaze loaderMicroblaze loader
Microblaze loader
 
Ll tiger clojure
Ll tiger clojureLl tiger clojure
Ll tiger clojure
 

Semelhante a G* Workshop in fukuoka 20120901

Unified JVM Logging
Unified JVM LoggingUnified JVM Logging
Unified JVM LoggingYuji Kubota
 
明日から使えるgradle
明日から使えるgradle明日から使えるgradle
明日から使えるgradlekimukou_26 Kimukou
 
Groovy indy 20120222
Groovy indy 20120222Groovy indy 20120222
Groovy indy 20120222Nobuhiro Sue
 
JavaOne2012報告会 Java ME
JavaOne2012報告会 Java MEJavaOne2012報告会 Java ME
JavaOne2012報告会 Java MEHiroki Ooyama
 
Introduction to GraalVM and Native Image
Introduction to GraalVM and Native ImageIntroduction to GraalVM and Native Image
Introduction to GraalVM and Native ImageKoichi Sakata
 
全部入り!WGPで高速JavaScript+HML5体験
全部入り!WGPで高速JavaScript+HML5体験全部入り!WGPで高速JavaScript+HML5体験
全部入り!WGPで高速JavaScript+HML5体験AdvancedTechNight
 
Oracle Code One - Java KeynoteとJava SE
Oracle Code One - Java KeynoteとJava SEOracle Code One - Java KeynoteとJava SE
Oracle Code One - Java KeynoteとJava SEYuichi Sakuraba
 
G* Workshop in Fukuoka - Introduction
G* Workshop in Fukuoka - IntroductionG* Workshop in Fukuoka - Introduction
G* Workshop in Fukuoka - IntroductionKazuchika Sekiya
 
JavaScript The Good Parts Chapter 7
JavaScript The Good Parts Chapter 7JavaScript The Good Parts Chapter 7
JavaScript The Good Parts Chapter 7y torazuka
 
GraalVM を普通の Java VM として使う ~クラウドベンチマークなどでの比較~
GraalVM を普通の Java VM として使う ~クラウドベンチマークなどでの比較~GraalVM を普通の Java VM として使う ~クラウドベンチマークなどでの比較~
GraalVM を普通の Java VM として使う ~クラウドベンチマークなどでの比較~Shinji Takao
 
詳解!自動結合テスト #jasst
詳解!自動結合テスト #jasst詳解!自動結合テスト #jasst
詳解!自動結合テスト #jasstkyon mm
 
脱・独自改造! GebでWebDriverをもっとシンプルに
脱・独自改造! GebでWebDriverをもっとシンプルに脱・独自改造! GebでWebDriverをもっとシンプルに
脱・独自改造! GebでWebDriverをもっとシンプルにHiroko Tamagawa
 
JavaOne2015報告またはこれからのJava
JavaOne2015報告またはこれからのJavaJavaOne2015報告またはこれからのJava
JavaOne2015報告またはこれからのJavaなおき きしだ
 
JVMの中身を可視化してみた
JVMの中身を可視化してみたJVMの中身を可視化してみた
JVMの中身を可視化してみたKengo Toda
 
Gwt+objectifyでラクラクGAEアプリ開発
Gwt+objectifyでラクラクGAEアプリ開発Gwt+objectifyでラクラクGAEアプリ開発
Gwt+objectifyでラクラクGAEアプリ開発Y OCHI
 
2012年javaメモリリーク
2012年javaメモリリーク2012年javaメモリリーク
2012年javaメモリリークtorutk
 
2011年javaの旅
2011年javaの旅2011年javaの旅
2011年javaの旅torutk
 

Semelhante a G* Workshop in fukuoka 20120901 (20)

Unified JVM Logging
Unified JVM LoggingUnified JVM Logging
Unified JVM Logging
 
明日から使えるgradle
明日から使えるgradle明日から使えるgradle
明日から使えるgradle
 
Groovy indy 20120222
Groovy indy 20120222Groovy indy 20120222
Groovy indy 20120222
 
JavaOne2012報告会 Java ME
JavaOne2012報告会 Java MEJavaOne2012報告会 Java ME
JavaOne2012報告会 Java ME
 
Introduction to GraalVM and Native Image
Introduction to GraalVM and Native ImageIntroduction to GraalVM and Native Image
Introduction to GraalVM and Native Image
 
SimpleModeler
SimpleModelerSimpleModeler
SimpleModeler
 
全部入り!WGPで高速JavaScript+HML5体験
全部入り!WGPで高速JavaScript+HML5体験全部入り!WGPで高速JavaScript+HML5体験
全部入り!WGPで高速JavaScript+HML5体験
 
Oracle Code One - Java KeynoteとJava SE
Oracle Code One - Java KeynoteとJava SEOracle Code One - Java KeynoteとJava SE
Oracle Code One - Java KeynoteとJava SE
 
G* Workshop in Fukuoka - Introduction
G* Workshop in Fukuoka - IntroductionG* Workshop in Fukuoka - Introduction
G* Workshop in Fukuoka - Introduction
 
JavaScript The Good Parts Chapter 7
JavaScript The Good Parts Chapter 7JavaScript The Good Parts Chapter 7
JavaScript The Good Parts Chapter 7
 
GraalVM を普通の Java VM として使う ~クラウドベンチマークなどでの比較~
GraalVM を普通の Java VM として使う ~クラウドベンチマークなどでの比較~GraalVM を普通の Java VM として使う ~クラウドベンチマークなどでの比較~
GraalVM を普通の Java VM として使う ~クラウドベンチマークなどでの比較~
 
詳解!自動結合テスト #jasst
詳解!自動結合テスト #jasst詳解!自動結合テスト #jasst
詳解!自動結合テスト #jasst
 
脱・独自改造! GebでWebDriverをもっとシンプルに
脱・独自改造! GebでWebDriverをもっとシンプルに脱・独自改造! GebでWebDriverをもっとシンプルに
脱・独自改造! GebでWebDriverをもっとシンプルに
 
JavaOne2015報告またはこれからのJava
JavaOne2015報告またはこれからのJavaJavaOne2015報告またはこれからのJava
JavaOne2015報告またはこれからのJava
 
Scalaでもgae
ScalaでもgaeScalaでもgae
Scalaでもgae
 
いまさら触るAwt
いまさら触るAwtいまさら触るAwt
いまさら触るAwt
 
JVMの中身を可視化してみた
JVMの中身を可視化してみたJVMの中身を可視化してみた
JVMの中身を可視化してみた
 
Gwt+objectifyでラクラクGAEアプリ開発
Gwt+objectifyでラクラクGAEアプリ開発Gwt+objectifyでラクラクGAEアプリ開発
Gwt+objectifyでラクラクGAEアプリ開発
 
2012年javaメモリリーク
2012年javaメモリリーク2012年javaメモリリーク
2012年javaメモリリーク
 
2011年javaの旅
2011年javaの旅2011年javaの旅
2011年javaの旅
 

Mais de Uehara Junji

Shibuya JVM Groovy 20150418
Shibuya JVM Groovy 20150418Shibuya JVM Groovy 20150418
Shibuya JVM Groovy 20150418Uehara Junji
 
Groovy kisobenkyoukai20130309
Groovy kisobenkyoukai20130309Groovy kisobenkyoukai20130309
Groovy kisobenkyoukai20130309Uehara Junji
 
JJUG CCC 2012 Real World Groovy/Grails
JJUG CCC 2012 Real World Groovy/GrailsJJUG CCC 2012 Real World Groovy/Grails
JJUG CCC 2012 Real World Groovy/GrailsUehara Junji
 
Java x Groovy: improve your java development life
Java x Groovy: improve your java development lifeJava x Groovy: improve your java development life
Java x Groovy: improve your java development lifeUehara Junji
 
Groovy 1.8の新機能について
Groovy 1.8の新機能についてGroovy 1.8の新機能について
Groovy 1.8の新機能についてUehara Junji
 
Let's go Developer 2011 sendai Let's go Java Developer (Programming Language ...
Let's go Developer 2011 sendai Let's go Java Developer (Programming Language ...Let's go Developer 2011 sendai Let's go Java Developer (Programming Language ...
Let's go Developer 2011 sendai Let's go Java Developer (Programming Language ...Uehara Junji
 
Jggug ws 15th LT 20110224
Jggug ws 15th LT 20110224Jggug ws 15th LT 20110224
Jggug ws 15th LT 20110224Uehara Junji
 
Easy Going Groovy 2nd season on DevLOVE
Easy Going Groovy 2nd season on DevLOVEEasy Going Groovy 2nd season on DevLOVE
Easy Going Groovy 2nd season on DevLOVEUehara Junji
 
Easy Going Groovy(Groovyを気軽に使いこなそう)
Easy Going Groovy(Groovyを気軽に使いこなそう)Easy Going Groovy(Groovyを気軽に使いこなそう)
Easy Going Groovy(Groovyを気軽に使いこなそう)Uehara Junji
 
Groovy, Transforming Language
Groovy, Transforming LanguageGroovy, Transforming Language
Groovy, Transforming LanguageUehara Junji
 
Jggug Nagoya 20090925 Groovy
Jggug Nagoya 20090925 GroovyJggug Nagoya 20090925 Groovy
Jggug Nagoya 20090925 GroovyUehara Junji
 
G*WS 3rd Lightning talk
G*WS 3rd Lightning talkG*WS 3rd Lightning talk
G*WS 3rd Lightning talkUehara Junji
 
Groovy Now And Future
Groovy Now And FutureGroovy Now And Future
Groovy Now And FutureUehara Junji
 
Seasar Conference2008 Grails(Final)
Seasar Conference2008 Grails(Final)Seasar Conference2008 Grails(Final)
Seasar Conference2008 Grails(Final)Uehara Junji
 
Groovy Conference2008 Nttsoft
Groovy Conference2008 NttsoftGroovy Conference2008 Nttsoft
Groovy Conference2008 NttsoftUehara Junji
 

Mais de Uehara Junji (17)

Shibuya JVM Groovy 20150418
Shibuya JVM Groovy 20150418Shibuya JVM Groovy 20150418
Shibuya JVM Groovy 20150418
 
Groovy kisobenkyoukai20130309
Groovy kisobenkyoukai20130309Groovy kisobenkyoukai20130309
Groovy kisobenkyoukai20130309
 
JJUG CCC 2012 Real World Groovy/Grails
JJUG CCC 2012 Real World Groovy/GrailsJJUG CCC 2012 Real World Groovy/Grails
JJUG CCC 2012 Real World Groovy/Grails
 
Java x Groovy: improve your java development life
Java x Groovy: improve your java development lifeJava x Groovy: improve your java development life
Java x Groovy: improve your java development life
 
Groovy 1.8の新機能について
Groovy 1.8の新機能についてGroovy 1.8の新機能について
Groovy 1.8の新機能について
 
Let's go Developer 2011 sendai Let's go Java Developer (Programming Language ...
Let's go Developer 2011 sendai Let's go Java Developer (Programming Language ...Let's go Developer 2011 sendai Let's go Java Developer (Programming Language ...
Let's go Developer 2011 sendai Let's go Java Developer (Programming Language ...
 
Jggug ws 15th LT 20110224
Jggug ws 15th LT 20110224Jggug ws 15th LT 20110224
Jggug ws 15th LT 20110224
 
Easy Going Groovy 2nd season on DevLOVE
Easy Going Groovy 2nd season on DevLOVEEasy Going Groovy 2nd season on DevLOVE
Easy Going Groovy 2nd season on DevLOVE
 
Easy Going Groovy(Groovyを気軽に使いこなそう)
Easy Going Groovy(Groovyを気軽に使いこなそう)Easy Going Groovy(Groovyを気軽に使いこなそう)
Easy Going Groovy(Groovyを気軽に使いこなそう)
 
Clojure
ClojureClojure
Clojure
 
Groovy, Transforming Language
Groovy, Transforming LanguageGroovy, Transforming Language
Groovy, Transforming Language
 
Jggug Nagoya 20090925 Groovy
Jggug Nagoya 20090925 GroovyJggug Nagoya 20090925 Groovy
Jggug Nagoya 20090925 Groovy
 
Lisp Builder
Lisp BuilderLisp Builder
Lisp Builder
 
G*WS 3rd Lightning talk
G*WS 3rd Lightning talkG*WS 3rd Lightning talk
G*WS 3rd Lightning talk
 
Groovy Now And Future
Groovy Now And FutureGroovy Now And Future
Groovy Now And Future
 
Seasar Conference2008 Grails(Final)
Seasar Conference2008 Grails(Final)Seasar Conference2008 Grails(Final)
Seasar Conference2008 Grails(Final)
 
Groovy Conference2008 Nttsoft
Groovy Conference2008 NttsoftGroovy Conference2008 Nttsoft
Groovy Conference2008 Nttsoft
 

Último

スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 

Último (9)

スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 

G* Workshop in fukuoka 20120901

  • 1. Groovy2.0 の新機能 静かなること 静的型のごとし 2012/9/1 JGGUG G*Workshop in 福岡 NTTソフトウェア Grails推進室 上原潤二 http://www.flickr.com/photos/cedric_foll/1103944944/
  • 2. 自己紹介 上原潤二(@uehaj) NTTソフトウェア株式会社Grails推進室 JGGUG(日本Grails/Groovyユーザグルー プ)運営委員 書籍執筆: プログラミングGROOVY(技術 評論社), Grails徹底入門(翔泳社) ブログ「Grな日々」 GroovyServ, LispBuilder, GVM開発者 Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
  • 3. お品書き Groovyの歴史を簡単に Groovy1.8の新機能(おさらい) Groovy2.0の新機能 静的Groovy indy対応 ライブラリ強化 モジュール化 まとめ Groovy 3.X Slide # 3 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
  • 4. Groovyの歴史を簡単に 年 リリース トピックス 2003 Groovy 開発開始 2004 Groovy 1.0-jsr-01 JSR 241 2007 Groovy 1.0 2007 Groovy 1.5(=1.1) Java5対応 2009 Groovy 1.6 AST変換導入 2009 Groovy 1.7 2011 Groovy 1.8 2012 Groovy 2.0(=1.9) Java SE 7対応 Slide # 4 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
  • 5. クロージャ周り強化 AST変換強化 アノテーションのクロージャ引数 多数のAST変換追加 クロージャ合成 ASTブラウザの強化 トランポリン メモ化 Groovy 1.8 ASTメタデータ の新機能 部分適用(curry)の拡張 効率向上 その他 実行可能jarによる プリミティブ演算最適化 スクリプト実行、 Grab改良、 メソッドの直接呼び出し ライブラリ強化 GroovyDocカスタマ イズ、モジュール化 文法の拡張 GDK・Groovy APIメソッドの追加 GParsの標準添付 拡張コマンド式(GEP3) GSqlのページング $/ドルスラッシュ文字列リテラル/$ スラッシュ文字列リテラルの複数行対応 Slide # 5 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
  • 6. 静的Grovy AST変換強化 Groovy 2.0 Java SE 7対応 の新機能 その他 ライブラリ強化 Slide # 6 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
  • 7. 静的Grovy AST変換強化 静的型チェック 静的コンパイル Groovy 2.0 Java SE 7対応 の新機能 その他 ライブラリ強化 Slide # 6 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
  • 8. 静的Grovy AST変換強化 静的型チェック NotYetImplemented 静的コンパイル Groovy 2.0 TypeChecked, CompileStatic Java SE 7対応 の新機能 その他 ライブラリ強化 Slide # 6 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
  • 9. 静的Grovy AST変換強化 静的型チェック NotYetImplemented 静的コンパイル Groovy 2.0 TypeChecked, CompileStatic Java SE 7対応 の新機能 その他 モジュール化 ライブラリ強化 Slide # 6 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
  • 10. 静的Grovy AST変換強化 静的型チェック NotYetImplemented 静的コンパイル Groovy 2.0 TypeChecked, CompileStatic Java SE 7対応 の新機能 その他 Project Coin対応 モジュール化 二進リテラル ライブラリ強化 リテラル中の下線 マルチキャッチ indy対応 Slide # 6 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
  • 11. 静的Grovy AST変換強化 静的型チェック NotYetImplemented 静的コンパイル Groovy 2.0 TypeChecked, CompileStatic Java SE 7対応 の新機能 その他 Project Coin対応 モジュール化 二進リテラル ライブラリ強化 リテラル中の下線 マルチキャッチ Collection.inject() Matcher.matchesPartially() takeWhile/dropWhile indy対応 Calendar.next/Previous withDefault/withEagar … Slide # 6 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
  • 12. 静的Grovy AST変換強化 静的型チェック NotYetImplemented 静的コンパイル Groovy 2.0 TypeChecked, CompileStatic Java SE 7対応 の新機能 その他 Project Coin対応 モジュール化 二進リテラル ライブラリ強化 リテラル中の下線 マルチキャッチ Collection.inject() Matcher.matchesPartially() takeWhile/dropWhile indy対応 Calendar.next/Previous withDefault/withEagar … Slide # 6 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
  • 13. AST変換群 2.0新機能 Since Since Since Groovy 1.6 Groovy 1.8 Groovy 2.0 Bindable ListenerList NotYetImplemented Vetoable AutoClone TypeChecked Category AutoExternalize CompileStatic Delegate Canonical Immutable EqualsAndHashCode Lazy Field Mixin IndexedProperty Newify InheritConstructors Singleton Synchronized PackageScope ConditionalInterrupt ThreadInterrupt Since TimedInterrupt Groovy 1.7 ToString TupleConstructor Grab power assert WithReadLock / WithWriteLock Commons / Log / Log4j / Slf4j Slide # 7 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
  • 15. 静的型チェック/静的コンパイル 2.0新機能 @TypeChecked: 静的型チェック ➡型を確定することでわかるエラー この2者を総 をコンパイル時にチェック 称したものが @CompileStatic: 静的コンパイル Groovy2.0で ➡静的型チェックに加え、 の「静的 型が静的に定まっている ことを前提としたコードを生成 ➡目的は性能向上 AST変換アノテーションとして実装されている これらのアノテーションをクラスやメソッドに指定すると、 その範囲のメソッド内のコードが対象となる Slide # 9 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
  • 16. 「静的Groovy」で何がどう変るの? 変数・メソッド引数等に型宣言が必要となる (その結果キャスト等が必要になる場合がある) 要はjavaといっしょだyo!!! ただし型推論により型宣言は省略できる場合がある 変数への代入/初期化の右辺等により型を決める 型推論対象: クロージャから参照されていないローカル変数やメソッド引数 型推論対象外(明示的型指定が必要): フィールドやバインディング変数 クロージャから参照されているローカル変数やメソッド引数 他スレッドによる変数の値変更をコンパイラが把握できない Slide # 10 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
  • 17. 静的型チェックにより検出されるエラー例 import groovy.transform.TypeChecked @TypeChecked 型が違う! int 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 } Slide # 11 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
  • 18. GGTS 3.0.0から利用 Slide # 12 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
  • 19. フローセンシティブタイピング def a = -3 a.abs() a.toUpperCase() a = "ABC" a.abs() a.toUpperCase() Slide # 13 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
  • 20. フローセンシティブタイピング aはint型と見な def a = -3 a.abs() a.toUpperCase() a = "ABC" a.abs() a.toUpperCase() Slide # 13 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
  • 21. フローセンシティブタイピング aはint型と見な def a = -3 a.abs() a.toUpperCase() a = "ABC" aはString型と a.abs() a.toUpperCase() Slide # 13 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
  • 22. フローセンシティブタイピング aはint型と見な def a = -3 [Static type checking] - a.abs() Cannot find matching method java.lang.Integer#toUpperCas a.toUpperCase() e() a = "ABC" aはString型と a.abs() a.toUpperCase() Slide # 13 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
  • 23. フローセンシティブタイピング aはint型と見な def a = -3 [Static type checking] - a.abs() Cannot find matching method java.lang.Integer#toUpperCas a.toUpperCase() e() a = "ABC" aはString型と a.abs() [Static type checking] - Cannot a.toUpperCase() find matching method Slide # 13 JGGUG G*Workshop java.lang.String#abs() rights reserved. Copyright(C) 2012 NTT Software Corporation All
  • 24. 静的コンパイル  String foo(String s) {      s.toUpperCase()  }  @CompileStatic  String bar(String s) {      s.toUpperCase()  } Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
  • 25. 静的コンパイル  String foo(String s) {      s.toUpperCase()  } public String foo(String s) { CallSite acallsite[] = $getCallSiteArray(); return (String)ScriptBytecodeAdapter.castToType(acallsite[0]. call(s), java/lang/String); }  @CompileStatic  String bar(String s) {      s.toUpperCase()  } Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
  • 26. 静的コンパイル  String foo(String s) {      s.toUpperCase()  } public String foo(String s) { CallSite acallsite[] = $getCallSiteArray(); return (String)ScriptBytecodeAdapter.castToType(acallsite[0]. call(s), java/lang/String); }  @CompileStatic  String bar(String s) {      s.toUpperCase()  } public String bar(String s) { return s.toUpperCase(); } Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
  • 27. ベンチマーク(CompileStatic) 1.2## 1.0## 0.8## CompileStatic 0.6## Groovy#1.8.2# 0.4## Groovy#2.0.1# Groovy#2.0.1#CompileSta<c# 0.2## Java#SE#1.7.0u6# 0.0## ]# # )]# # ]# )]# ]# # ]# # a] f)] g] rt] es y) m ch ry #i f in st c#i so ar or re ku ce na a dR a< rn ck lN [F y#T nn an er ea #te ui ( st ra ar c#t a st [Q hr ct [F ce ib (i n in a< pe [T [F an [B ib ( st [S st [F ib (i n [F ib [F https://github.com/alextkachman/fib-benchmark をベースに計測。 グラフはJavaを1としたときの実行時間の比率(大きいほど速い)。 Slide # 15 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
  • 28. 静的型のメリット・デメリット 静的型のメリット: 総合的にいっ 1.静的型情報に基づいた最適化による性能向上 て、本当に向上 ➡静的コンパイル するかは議論の 2.コンパイル時型チェックによる信頼性向上 ➡静的型チェック 3.作業効率向上(IDEによる入力補完機能、タイプミス早期検出) ➡静的型チェック 4.ドキュメンテーションとしての型情報による保守性向上 ➡オプショナルタイピング(既存機能) デメリット: 面倒臭い・字数が増える・多態コード・動的機能 (EMC,Builderやマルチメソッドなど)が利用できない Slide # 16 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
  • 29. @CompileStatic適用の実際 既存のGroovyコードを静的コンパイルするために必要なの は、@CompileStaticをつけて回るだけの簡単な作業・・・ ではない!(少なくともGroovy 2.0.0では。) 静的コンパイルを通すための修正(例):型宣言を省略していたところを補う(def, 引数, itを型指定して宣言)/Closure#call()の返り値はキャストする/nullを適宜キャストする/引数の動的型に基 いたメソッド選択(マルチメソッド)を使用していた場合、静的に型が確定しているならキャストで。していなけれ ば、Java的にダブルディスパッチで実装しなおす/ダックタイピングは複数メソッドに展開するかinterfaceを導入 ➡規模が大きいと書き換えは相当面倒 以下は対応不可 EMC、カテゴリ、invokeMethod()などによる動的メソッド追加(結果 としてのBuilder周り) アクセス修飾(private,protected,package private)が効いてアクセス 不可 ➡@CompileStatic(TypeCheckingMode.SKIP)で逃げる Slide # 17 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
  • 30. CompileStaticとアクセス修飾 静的コンパイルで生成されるコードはJavaのアクセス修飾 子による制限に支配される 例えば他クラスのprivateメソッドは呼べない(Javaでは当たり前) ただし、Groovyで定義した(GroovyObjectを継承した)クラスに 対して、フィールドに関してはpublicアクセス可 class Target {   private int field   private void method(){} } @groovy.transform.CompileStatic class StaticCompiledClass {   void foo(Target t) {     t.method()  // Cannot call private method Target#method     "ABC".vaue[0] = "x" // [STC] - No such property: vaue for class: java.lang.String     t.field = 3   // OK   } } Slide # 18 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
  • 31. 余談:Grails 2.2での状況 Grails 2.2ではGroovy 2.Xが採用される予定 Grailsの最新ソースを「CompileStatic」で grepしてみる % 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 Slide # 19 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
  • 32. Groovy++と静的Groovy Groovy++ Groovy 2.0 2009∼2011(開発完) 2011∼ コードベースの継続性はない @Typedアノテー @TypeChecked ションによる 静的型チェック 静的Groovy @CompileStatic 静的コンパイル mixedモードコンパイル、 末尾再帰最適化、traits.. などの先進的な機能 対応物は今のところ 無し Slide # 20 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
  • 33. ベンチマーク(vs. Groovy++) 1.2## Grroovy++ 1.0## 0.8## Groovy#1.8.2# 0.6## Groovy#2.0.1# 0.4## Groovy#2.0.1#CompileSta<c# Java#SE#1.7.0u6# 0.2## Groovy#2.0.1#indy# Groovy++0.9.0/1.8.2# 0.0## ]# # )]# )]# ]# )]# ]# # ]# # a] g] rt] es y) m ch ry f #i f in st c#i so ar or re ku ce na a dR a< rn ck lN [F y#T nn an er ea #te ui ( st ra ar c#t a st [Q hr ct [F ce ib (i n in a< pe [T [F an [B ib ( st [S st [F ib (i n [F ib [F Slide # 21 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
  • 35. indyとその利用方法 2.0新機能 indy…Java VM上での動的言語実行の効率化を目的とした 機能拡張(JSR292)の通称。Java SE 7(JDK)から利用可 groovy/groovycコマンドから使う <GROOVY_HOME>/lib,embeddeable/配下の、-indy接尾 辞のついたjarファイルを-indyなしにリネーム groovyコマンド、もしくはgroovycコマンドで--indyを指定 gradle(1.1以降)から使う dependencies {     groovy group: 'org.codehaus.groovy', name: 'groovy-all', version:'2.0.1', classifier:'indy' } compileGroovy {     groovyOptions.optimizationOptions.indy=true } Slide # 23 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
  • 36. ベンチマーク(indy) 1.2## 1.0## 0.8## 0.6## Groovy#1.8.2# Groovy#2.0.1# 0.4## Groovy#2.0.1#CompileSta<c# Java#SE#1.7.0u6# 0.2## Groovy#2.0.1#indy# 0.0## ]# # )]# )]# ]# )]# ]# # ]# # a] g] rt] es y) m ch ry f #i f in st c#i so ar or re ku ce na a dR a< rn ck lN [F y#T nn an er ea #te ui ( st ra ar c#t a st [Q hr ct [F ce ib (i n in a< pe [T [F an [B ib ( st [S st [F Groovy 2.0.1 -indy ib (i n [F ib [F Slide # 24 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
  • 37. ライブラリ 強化 http://www.flickr.com/photos/aloudnoise/5133172272/
  • 38. injectのおさらい [e1,e2,e3,e4,e5].inject(ini){acc,val->式} → <結果> assert# [1,2,3,4,5].inject(0){a,b 2012 NTT Software Corporation All rights reserved. 26 Slide JGGUG G*Workshop Copyright(C) -> a+b} == 15
  • 39. injectのおさらい [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 2012 NTT Software Corporation All rights reserved. 26 Slide JGGUG G*Workshop Copyright(C) -> a+b} == 15
  • 40. injectのおさらい [e1,e2,e3,e4,e5].inject(ini){acc,val->式} → <結果> ini [ e1, e2, e3, e4, e5 ] {acc,val->式} assert# [1,2,3,4,5].inject(0){a,b 2012 NTT Software Corporation All rights reserved. 26 Slide JGGUG G*Workshop Copyright(C) -> a+b} == 15
  • 41. injectのおさらい [e1,e2,e3,e4,e5].inject(ini){acc,val->式} → <結果> ini [ e1, e2, e3, e4, e5 ] {acc,val->式} {acc,val->式} assert# [1,2,3,4,5].inject(0){a,b 2012 NTT Software Corporation All rights reserved. 26 Slide JGGUG G*Workshop Copyright(C) -> a+b} == 15
  • 42. injectのおさらい [e1,e2,e3,e4,e5].inject(ini){acc,val->式} → <結果> ini [ e1, e2, e3, e4, e5 ] {acc,val->式} {acc,val->式} {acc,val->式} assert# [1,2,3,4,5].inject(0){a,b 2012 NTT Software Corporation All rights reserved. 26 Slide JGGUG G*Workshop Copyright(C) -> a+b} == 15
  • 43. injectのおさらい [e1,e2,e3,e4,e5].inject(ini){acc,val->式} → <結果> ini [ e1, e2, e3, e4, e5 ] {acc,val->式} {acc,val->式} {acc,val->式} {acc,val->式} assert# [1,2,3,4,5].inject(0){a,b 2012 NTT Software Corporation All rights reserved. 26 Slide JGGUG G*Workshop Copyright(C) -> a+b} == 15
  • 44. injectのおさらい [e1,e2,e3,e4,e5].inject(ini){acc,val->式} → <結果> ini [ e1, e2, e3, e4, e5 ] {acc,val->式} {acc,val->式} {acc,val->式} {acc,val->式} {acc,val->式} assert# [1,2,3,4,5].inject(0){a,b 2012 NTT Software Corporation All rights reserved. 26 Slide JGGUG G*Workshop Copyright(C) -> a+b} == 15
  • 45. injectのおさらい [e1,e2,e3,e4,e5].inject(ini){acc,val->式} → <結果> ini [ e1, e2, e3, e4, e5 ] {acc,val->式} {acc,val->式} {acc,val->式} {acc,val->式} {acc,val->式} → <結果 > assert# [1,2,3,4,5].inject(0){a,b 2012 NTT Software Corporation All rights reserved. 26 Slide JGGUG G*Workshop Copyright(C) -> a+b} == 15
  • 46. 初期値無しinject 2.0新機能 [e1,e2,e3,e4,e5].inject{acc,val->式} → <結果> e1 [ e2, e3, e4, e5 ] {acc,val->式} {acc,val->式} {acc,val->式} {acc,val->式} → <結果> assert# [1,2,3,4,5].inject{a,b -> a+b} == 15 All rights reserved. 27 Slide JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation
  • 47. Matcher#matchesPartially() 2.0新機能 (x= p).matchesPartially()の結果 true …文字列xの末尾になんらかの文字列を追加したものは、 パターンpにマッチする可能性がある false …文字列xの末尾にどんな文字列を追加しても、 パターンpにマッチすることは有り得ない assert ("1"     =~ /ddd/).matchesPartially() assert ("12"    =~ /ddd/).matchesPartially() assert ("123"   =~ /ddd/).matchesPartially() assert !("12a"  =~ /ddd/).matchesPartially() assert !("1234" =~ /ddd/).matchesPartially() ➡インタラクティブなバリデーションなどに使用可能 Slide # 28 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
  • 48. (List,CharSequence,Map,T[]).takeWhile{} 2.0新機 [e1,e2,e3,e4,e5].takeWhile{it->式} → <結果> [ ] [ ] リストの要素を順にたどり、クロージャを適用した結果が 真である要素のみからなる先頭部分を返す。 assert #[1,2,3,4,3].takeWhile{it<=3} Software Corporation All rights reserved. Slide 29 JGGUG G*Workshop Copyright(C) 2012 NTT == [1,2,3]
  • 49. (List,CharSequence,Map,T[]).takeWhile{} 2.0新機 [e1,e2,e3,e4,e5].takeWhile{it->式} → <結果> [ e1, ] {it->式} がtrue [ e1, ] リストの要素を順にたどり、クロージャを適用した結果が 真である要素のみからなる先頭部分を返す。 assert #[1,2,3,4,3].takeWhile{it<=3} Software Corporation All rights reserved. Slide 29 JGGUG G*Workshop Copyright(C) 2012 NTT == [1,2,3]
  • 50. (List,CharSequence,Map,T[]).takeWhile{} 2.0新機 [e1,e2,e3,e4,e5].takeWhile{it->式} → <結果> [ e1, e2, ] {it->式} {it->式} がtrue がtrue [ e1, e2, ] リストの要素を順にたどり、クロージャを適用した結果が 真である要素のみからなる先頭部分を返す。 assert #[1,2,3,4,3].takeWhile{it<=3} Software Corporation All rights reserved. Slide 29 JGGUG G*Workshop Copyright(C) 2012 NTT == [1,2,3]
  • 51. (List,CharSequence,Map,T[]).takeWhile{} 2.0新機 [e1,e2,e3,e4,e5].takeWhile{it->式} → <結果> [ e1, e2, e3, ] {it->式} {it->式} {it->式} がtrue がtrue がtrue [ e1, e2, e3 ] リストの要素を順にたどり、クロージャを適用した結果が 真である要素のみからなる先頭部分を返す。 assert #[1,2,3,4,3].takeWhile{it<=3} Software Corporation All rights reserved. Slide 29 JGGUG G*Workshop Copyright(C) 2012 NTT == [1,2,3]
  • 52. (List,CharSequence,Map,T[]).takeWhile{} 2.0新機 [e1,e2,e3,e4,e5].takeWhile{it->式} → <結果> [ e1, e2, e3, e4, ] {it->式} {it->式} {it->式} {it->式} がtrue がtrue がtrue がfalse [ e1, e2, e3 ] リストの要素を順にたどり、クロージャを適用した結果が 真である要素のみからなる先頭部分を返す。 assert #[1,2,3,4,3].takeWhile{it<=3} Software Corporation All rights reserved. Slide 29 JGGUG G*Workshop Copyright(C) 2012 NTT == [1,2,3]
  • 53. (List,CharSequence,Map,T[]).takeWhile{} 2.0新機 [e1,e2,e3,e4,e5].takeWhile{it->式} → <結果> [ e1, e2, e3, e4, e5 ] {it->式} {it->式} {it->式} {it->式} {it->式} がtrue がtrue がtrue がfalse がtrue [ e1, e2, e3 ] リストの要素を順にたどり、クロージャを適用した結果が 真である要素のみからなる先頭部分を返す。 assert #[1,2,3,4,3].takeWhile{it<=3} Software Corporation All rights reserved. Slide 29 JGGUG G*Workshop Copyright(C) 2012 NTT == [1,2,3]
  • 54. (List,CharSequence,Map,T[]).dropWhile{} 2.0新機 [e1,e2,e3,e4,e5].dropWhile{it->式} → <結果> [ ] [ ] リストの要素を順にたどり、クロージャを適用した結果が 偽である初めての要素以降を返す。 assert #[1,2,3,4,3].dropWhile{it<=3}Software Corporation All rights reserved. Slide 30 JGGUG G*Workshop Copyright(C) 2012 NTT == [4,5]
  • 55. (List,CharSequence,Map,T[]).dropWhile{} 2.0新機 [e1,e2,e3,e4,e5].dropWhile{it->式} → <結果> [ e1, ] {it->式} がtrue [ ] リストの要素を順にたどり、クロージャを適用した結果が 偽である初めての要素以降を返す。 assert #[1,2,3,4,3].dropWhile{it<=3}Software Corporation All rights reserved. Slide 30 JGGUG G*Workshop Copyright(C) 2012 NTT == [4,5]
  • 56. (List,CharSequence,Map,T[]).dropWhile{} 2.0新機 [e1,e2,e3,e4,e5].dropWhile{it->式} → <結果> [ e1, e2, ] {it->式} {it->式} がtrue がtrue [ ] リストの要素を順にたどり、クロージャを適用した結果が 偽である初めての要素以降を返す。 assert #[1,2,3,4,3].dropWhile{it<=3}Software Corporation All rights reserved. Slide 30 JGGUG G*Workshop Copyright(C) 2012 NTT == [4,5]
  • 57. (List,CharSequence,Map,T[]).dropWhile{} 2.0新機 [e1,e2,e3,e4,e5].dropWhile{it->式} → <結果> [ e1, e2, e3, ] {it->式} {it->式} {it->式} がtrue がtrue がtrue [ ] リストの要素を順にたどり、クロージャを適用した結果が 偽である初めての要素以降を返す。 assert #[1,2,3,4,3].dropWhile{it<=3}Software Corporation All rights reserved. Slide 30 JGGUG G*Workshop Copyright(C) 2012 NTT == [4,5]
  • 58. (List,CharSequence,Map,T[]).dropWhile{} 2.0新機 [e1,e2,e3,e4,e5].dropWhile{it->式} → <結果> [ e1, e2, e3, e4, ] {it->式} {it->式} {it->式} {it->式} がtrue がtrue がtrue がfalse [ e4, ] リストの要素を順にたどり、クロージャを適用した結果が 偽である初めての要素以降を返す。 assert #[1,2,3,4,3].dropWhile{it<=3}Software Corporation All rights reserved. Slide 30 JGGUG G*Workshop Copyright(C) 2012 NTT == [4,5]
  • 59. (List,CharSequence,Map,T[]).dropWhile{} 2.0新機 [e1,e2,e3,e4,e5].dropWhile{it->式} → <結果> [ e1, e2, e3, e4, e5 ] {it->式} {it->式} {it->式} {it->式} {it->式} がtrue がtrue がtrue がfalse がtrue [ e4, e5 ] リストの要素を順にたどり、クロージャを適用した結果が 偽である初めての要素以降を返す。 assert #[1,2,3,4,3].dropWhile{it<=3}Software Corporation All rights reserved. Slide 30 JGGUG G*Workshop Copyright(C) 2012 NTT == [4,5]
  • 61. モジュール化(1) 2.0新機能 groovy-X.X.X.jarを「拡張モジュール」の集合とし て再構成 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モジュールとしても分割されている 依存性がきっちり定義されている Slide # 32 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
  • 62. モジュール化(2) 拡張モジュールは「カスタム拡張メソッド」を提供できる GDKメソッドのように既存クラスにメソッドを追加する カテゴリとは異なり、静的Groovy配下で利用可能 @Grabで取り込んだ場合でもカスタム拡張メソッドは有効。 拡張モジュールは誰でも作れ、実体は以下のような内容の 「org.codehaus.groovy.runtime.ExtensionModule」 ファイルをMETA-INF/services directoryに含めたJar ファイル moduleName=groovy-stream moduleVersion=0.5.1 extensionClasses=groovy.stream.StreamExtension staticExtensionClasses= Slide # 33 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
  • 63. まとめ Slide # 34 http://www.flickr.com/photos/limonada/214375219/ JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
  • 64. GEP11から見るGroovy 3 GEP11 - Groovy 3 semantics and new MOP 問題のあるセマンティクスを修正・改善 Removing default null argument Removing automatic list expansion Changing Safe Navigation to stop evaluation ユーザ提案 Instance based Categories MOP2 … invokedynamicを前提としたMOPの全面見直し invokeMethodは単なるメソッドコールではなく、 MethodHandlerで置換されるプレースホルダとなる GEP…Groovy Enhancement Proposal Slide # 35 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
  • 65. まとめ 静的Groovyは2.0の目玉ではあるものの、誰 もが使わなければならないものでもない 実開発への適用はもうちょっと待った方が良いかも Grailsでの採用を経て鍛錬されることを期待 indy対応はまだまだですね 今後は、非標準拡張モジュールによるエコシ ステム成長(プラグイン化)が期待される Slide # 36 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

Notas do Editor

  1. \n
  2. Gr&amp;#x306A;&amp;#x65E5;&amp;#x3005;&amp;#x3001;2007&amp;#x5E74;&amp;#x304B;&amp;#x3089;&amp;#x57F7;&amp;#x7B46;&amp;#x3057;&amp;#x3066;&amp;#x3044;&amp;#x307E;&amp;#x3059;&amp;#x3002;\n&amp;#x65E5;&amp;#x672C;&amp;#x521D;&amp;#x306E;&amp;#x30AA;&amp;#x30EA;&amp;#x30B8;&amp;#x30CA;&amp;#x30EB;&amp;#x66F8;&amp;#x7C4D;&amp;#x30D7;&amp;#x30ED;&amp;#x30B0;&amp;#x30E9;&amp;#x30DF;&amp;#x30F3;&amp;#x30B0;Groovy&amp;#x3092;&amp;#x57F7;&amp;#x7B46;&amp;#x3057;&amp;#x307E;&amp;#x3057;&amp;#x305F;&amp;#x3002;\n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. &amp;#x3053;&amp;#x308C;&amp;#x3089;&amp;#x304C;&amp;#x52B9;&amp;#x304F;&amp;#x306E;&amp;#x306F;a&amp;#x304C;&amp;#x30ED;&amp;#x30FC;&amp;#x30AB;&amp;#x30EB;&amp;#x5909;&amp;#x6570;&amp;#x3060;&amp;#x304B;&amp;#x3089;&amp;#x3067;&amp;#x3042;&amp;#x308A;&amp;#x3001;&amp;#x3042;&amp;#x308B;&amp;#x3044;&amp;#x306F;&amp;#x30E1;&amp;#x30BD;&amp;#x30C3;&amp;#x30C9;&amp;#x5F15;&amp;#x6570;&amp;#x306E;&amp;#x5834;&amp;#x5408;&amp;#x3060;&amp;#x3051;&amp;#x3067;&amp;#x3042;&amp;#x308A;&amp;#x3001;&amp;#x30AF;&amp;#x30E9;&amp;#x30B9;&amp;#x306E;&amp;#x30D5;&amp;#x30A3;&amp;#x30FC;&amp;#x30EB;&amp;#x30C9;&amp;#x3067;&amp;#x306F;&amp;#x30A8;&amp;#x30E9;&amp;#x30FC;&amp;#x3068;&amp;#x306A;&amp;#x308B;&amp;#x3002;\n
  19. &amp;#x3053;&amp;#x308C;&amp;#x3089;&amp;#x304C;&amp;#x52B9;&amp;#x304F;&amp;#x306E;&amp;#x306F;a&amp;#x304C;&amp;#x30ED;&amp;#x30FC;&amp;#x30AB;&amp;#x30EB;&amp;#x5909;&amp;#x6570;&amp;#x3060;&amp;#x304B;&amp;#x3089;&amp;#x3067;&amp;#x3042;&amp;#x308A;&amp;#x3001;&amp;#x3042;&amp;#x308B;&amp;#x3044;&amp;#x306F;&amp;#x30E1;&amp;#x30BD;&amp;#x30C3;&amp;#x30C9;&amp;#x5F15;&amp;#x6570;&amp;#x306E;&amp;#x5834;&amp;#x5408;&amp;#x3060;&amp;#x3051;&amp;#x3067;&amp;#x3042;&amp;#x308A;&amp;#x3001;&amp;#x30AF;&amp;#x30E9;&amp;#x30B9;&amp;#x306E;&amp;#x30D5;&amp;#x30A3;&amp;#x30FC;&amp;#x30EB;&amp;#x30C9;&amp;#x3067;&amp;#x306F;&amp;#x30A8;&amp;#x30E9;&amp;#x30FC;&amp;#x3068;&amp;#x306A;&amp;#x308B;&amp;#x3002;\n
  20. &amp;#x3053;&amp;#x308C;&amp;#x3089;&amp;#x304C;&amp;#x52B9;&amp;#x304F;&amp;#x306E;&amp;#x306F;a&amp;#x304C;&amp;#x30ED;&amp;#x30FC;&amp;#x30AB;&amp;#x30EB;&amp;#x5909;&amp;#x6570;&amp;#x3060;&amp;#x304B;&amp;#x3089;&amp;#x3067;&amp;#x3042;&amp;#x308A;&amp;#x3001;&amp;#x3042;&amp;#x308B;&amp;#x3044;&amp;#x306F;&amp;#x30E1;&amp;#x30BD;&amp;#x30C3;&amp;#x30C9;&amp;#x5F15;&amp;#x6570;&amp;#x306E;&amp;#x5834;&amp;#x5408;&amp;#x3060;&amp;#x3051;&amp;#x3067;&amp;#x3042;&amp;#x308A;&amp;#x3001;&amp;#x30AF;&amp;#x30E9;&amp;#x30B9;&amp;#x306E;&amp;#x30D5;&amp;#x30A3;&amp;#x30FC;&amp;#x30EB;&amp;#x30C9;&amp;#x3067;&amp;#x306F;&amp;#x30A8;&amp;#x30E9;&amp;#x30FC;&amp;#x3068;&amp;#x306A;&amp;#x308B;&amp;#x3002;\n
  21. &amp;#x3053;&amp;#x308C;&amp;#x3089;&amp;#x304C;&amp;#x52B9;&amp;#x304F;&amp;#x306E;&amp;#x306F;a&amp;#x304C;&amp;#x30ED;&amp;#x30FC;&amp;#x30AB;&amp;#x30EB;&amp;#x5909;&amp;#x6570;&amp;#x3060;&amp;#x304B;&amp;#x3089;&amp;#x3067;&amp;#x3042;&amp;#x308A;&amp;#x3001;&amp;#x3042;&amp;#x308B;&amp;#x3044;&amp;#x306F;&amp;#x30E1;&amp;#x30BD;&amp;#x30C3;&amp;#x30C9;&amp;#x5F15;&amp;#x6570;&amp;#x306E;&amp;#x5834;&amp;#x5408;&amp;#x3060;&amp;#x3051;&amp;#x3067;&amp;#x3042;&amp;#x308A;&amp;#x3001;&amp;#x30AF;&amp;#x30E9;&amp;#x30B9;&amp;#x306E;&amp;#x30D5;&amp;#x30A3;&amp;#x30FC;&amp;#x30EB;&amp;#x30C9;&amp;#x3067;&amp;#x306F;&amp;#x30A8;&amp;#x30E9;&amp;#x30FC;&amp;#x3068;&amp;#x306A;&amp;#x308B;&amp;#x3002;\n
  22. \n
  23. \n
  24. \n
  25. &amp;#x300C;&amp;#x9AD8;&amp;#x6A5F;&amp;#x80FD;&amp;#x306A;Java&amp;#x300D;&amp;#x300C;&amp;#x7C21;&amp;#x6F54;&amp;#x306A;Java&amp;#x300D;&amp;#x300C;&amp;#x30B3;&amp;#x30F3;&amp;#x30D1;&amp;#x30A4;&amp;#x30EB;&amp;#x4E0D;&amp;#x8981;Java&amp;#x300D;&amp;#x3068;&amp;#x3057;&amp;#x3066;Groovy&amp;#x3092;&amp;#x4F7F;&amp;#x3046;&amp;#x4EBA;&amp;#x3082;&amp;#x5C11;&amp;#x306A;&amp;#x304B;&amp;#x3089;&amp;#x305A;&amp;#x3044;&amp;#x308B;\n\n
  26. Java&amp;#x306E;&amp;#x3088;&amp;#x3046;&amp;#x306B;&amp;#x9762;&amp;#x5012;&amp;#x306B;&amp;#x306A;&amp;#x308B;&amp;#x3002;\n
  27. \n
  28. \n
  29. Groovy++&amp;#x306F;mixed&amp;#x30E2;&amp;#x30FC;&amp;#x30C9;&amp;#x30B3;&amp;#x30F3;&amp;#x30D1;&amp;#x30A4;&amp;#x30EB;&amp;#x3001;traits&amp;#x306A;&amp;#x3069;Groovy 2.x&amp;#x7CFB;&amp;#x306B;&amp;#x3068;&amp;#x308A;&amp;#x3053;&amp;#x307E;&amp;#x308C;&amp;#x306A;&amp;#x304B;&amp;#x3063;&amp;#x305F;&amp;#x5148;&amp;#x9032;&amp;#x7684;&amp;#x306A;&amp;#x6A5F;&amp;#x80FD;&amp;#x3092;&amp;#x6301;&amp;#x3063;&amp;#x3066;&amp;#x3044;&amp;#x305F;&amp;#x304C;&amp;#x3001;&amp;#x958B;&amp;#x767A;&amp;#x306F;&amp;#x505C;&amp;#x6B62;&amp;#x3057;&amp;#x3066;&amp;#x3044;&amp;#x308B;&amp;#x3002;\n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. &amp;#x300C;&amp;#x4F55;&amp;#x5272;&amp;#x524A;&amp;#x6E1B;&amp;#x300D;&amp;#x3068;&amp;#x304B;&amp;#x3067;&amp;#x306F;&amp;#x306A;&amp;#x304F;&amp;#x3001;&amp;#x7279;&amp;#x5B9A;&amp;#x90E8;&amp;#x5206;&amp;#x3092;&amp;#x300C;&amp;#x30BC;&amp;#x30ED;&amp;#x300D;&amp;#x306B;&amp;#x3059;&amp;#x308B;\n\n
  61. \n