SlideShare una empresa de Scribd logo
1 de 43
Descargar para leer sin conexión
Groovyなう&ふゅーちゃー
それからのGroovy

      GCR 16th
 NTTソフトウェア上原潤二
      2009/1/15
Groovyイン・アクション(GinA)
• 国内初のGroovy解説書(翻訳)
• “バイブル本“
• 対応Groovyバージョン
 –原書はGroovy 1.0ベース
 –サンプルコードをGroovy 1.5.4で動作する
  ように緻密に修正。
 –Groovy 1.0より後に実装された機能につい
  ては基本的には追記しない。
  ので本発表ではそこを説明します
Groovy年表
 2003        2004          2005
   8月        3月     12月 2月
              ▲       ▲     ▲
                                              本日の対象
            1.0b4   1.0b8 1.0b10
           JSR化         JSR EA

        2006          2007             2008
                                                         1.1b1
           7月       2月 4月       12月 2月         12月
            ▲        ▲    ▲      ▲     ▲       ▲
        1.0 JSR-6   1.0 1.1b2   1.5.0 1.5.4    1.5.7
                                               1.6-rc1
  GinA本対象           Grails 0.5.6 Grails 1.0 1.1b2
Groovy 1.1と1.5の関係
• 1.1b1, 1.1b2, ・・・, 1.1-RC1,
  ときて1.5
 –Java “5”の機能取り込みと、
  機能が⼤幅アップしたから
 –1.1正式版は存在しない。
 –本資料では、1.1および1.5の新機能を
  From 1.1・1.5 のマークで表⽰
 –ちなみに1.6機能は From 1.6 で。
Groovy 1.1=1.5の主な機能
• Java 5対応
  –   アノテーション利⽤
  –   enum(ただし、インナークラスになるenumは×)
  –   可変個数引数
  –   static import
  –   Generics
  –   共変の戻り値
• ⾔語仕様
  – エルビス演算⼦
  – for(;;)形式ループ
  – 名前付き引数で関数呼び出しの括弧省略
• ジョイントコンパイラ
• Expando Meta Class (EMC)
                             From 1.1・1.5
• 性能向上,bugfix,改良,etc,etc,
Groovy 1.6の主な機能
• ⾔語仕様
    –   マルチ代⼊(多重代⼊)
    –   分岐しててもreturn省略可
    –   AST変換
    –   Groovyでアノテーション定義
• 動的な振る舞いに関するもの
    – JavaインスタンスごとのMetaClass
    – EMC DSL
    – 実⾏時Mixin
•   ライブラリ: Swing Builderの改善
•   ツール: Grape
•   性能向上
•   bugfix,改良,etc,etc
                               From 1.6
ベンチマーク
ベンチマーク!
• The Computer Language
  Benchmarks Game
 –Aka “shootout”
 –マイクロベンチマーク
• 抜粋して実施
その前に
• 速度にこだわるべき?
 –マシンも速くなってるし
 –Groovyであることで遅いなら、
  ボトルネックをJavaで書き直せばよい
  それはものすごく簡単
• 処理系速度は体感速度に対して⽀配的
  とは限らない
 –ライブラリやIOの性能が⽀配的な場合も
• でも
 –Groovy同⼠なら⾯⽩かろう
Groovy 1.1beta3を1とした速度⽐
Groovy 1.5.6を1とした速度⽐
感想(感覚的なものです)
• Groovy 1.6でメソッドコールが爆
  速に(理由は後述)
• つってもJRubyと同等(かやや上)
• JVM上の⾔語の共通の特徴として
 –起動は遅いっすよ
 –メモリは⽐較的⾷うっすよ
From 1.1・1.5
エルビス演算⼦(Elvis Operator)
• 三項演算⼦
 A?B:C
 は次と等価
 if (A) { B } else { C }
• エルビス演算⼦                  ※GCCの独自拡張に由来

 A ?: B
 は次と等価
 if (A) { A } else { B }     From 1.1・1.5
エルビス演算⼦(Elvis Operator)
ジョイントコンパイラ
• GroovyとJavaコードが相互依存してい
  てもコンパイル可能に
   class A {
     B b;
   }

   class B extends A {}
• 内部では、Groovyクラスのスタブ(メ
  ソッド本体を削除したもの)を⽣成して
  からJavaコンパイラを起動する
• groovycの-jオプションで実⾏
                          From 1.1・1.5
ExpandoMetaClass (EMC)
• プロパティにクロージャを代⼊する
  とメソッドの様に扱える
 String.metaclass.hello = { println “hello”+delegate }
 “world”.hello() // helloworldが出⼒


• 簡便な動的メソッド定義。
• prototypeと同様だが、Groovyでは
  クラスベースOOPと⼆本⽴て。
  EMCは後付け。
                                        From 1.1・1.5
From 1.6
Call Siteキャッシュ,Call Site最適化
• 性能向上の主因
 –「メソッドコールが遅い」←Groovyの遅
  さは⼤半これで説明。
• 動的メソッド呼び出しに先⽴つメソッ
  ド探索をキャッシュ
 –動的⾔語で効果が⼤
 –JRubyが先達
 –アイデア⾃体は古くからある
• JVM上で極めて有効(後述)     From 1.6
動的メソッド呼び出し概念フロー

呼び出し側クラス                      GroovyクラスX

x = new X()                    Class X {
x.foo()
              メソッド探索
                               def foo() {
              Pogo呼び出し
                               }




                   Pogo …Plain Old Groovy Object
動的メソッド呼び出し概念フロー

呼び出し側クラス                   GroovyクラスX

x = new X()                Class X {
x.foo()
               メソッド探索


              メタクラスのメソッド   }
                の呼び出し
                           Xのメタクラス


                           ‘foo’ = { }
問題はメソッド探索のコスト
• 探索時に以下の判定を⾏う必要がある
 –Pojo/Pogoのメソッド?
 –メタクラス定義メソッド?
  •クラスごとのメタクラス?
  •インスタンスごとのメタクラス?
 –プロパティ参照か?          明ら
 –コンストラクタ呼び出しか?      かに
 –インタセプト可能か?         重い
 –Staticかどうか?
    :
Call Site Cache (1回⽬)

  呼び出し側クラス                           GroovyクラスX

  x = new X()                        Class X {
  x.foo()
                   メソッド探索

                PogoMetaClassSiteの   }
                インスタンスを保存

                                     Xのメタクラス
     CallSite

                                     ‘foo’ = { }
※CallSiteはSoftReferenceで保持されるので
メモリがなくなってきたら解放される
Call Site Cache (2回⽬)
  呼び出し側クラス                          GroovyクラスX

 x = new X()                        Class X {
 x.foo()



               保存された                }
               PogoMetaClassSiteの
               インスタンスをcall()
                                    Xのメタクラス
    CallSite

                                    ‘foo’ = { }

※実際には呼び出しが複数あるので配列CallSiteArrayで保持
※意味が動的に変わったらCallSiteのインスタンスを差し替える
 (自分で自分を置き換える。コード的にはこれがやや面白い)
Call Site最適化まとめ
• (1)メソッド探索コストを2回⽬以降削減
• (2)JITによるインライン展開の道を開く
 – マシン語レベルでほんとに展開されているか私
   は確認してません(Open JDKで確認可)がほんと
   なら⾮常に効果が⾼い(連鎖的展開を導く)
 – インライン展開に関してHotSpotは極めて強⼒
   • アグレッシブにやって状況変わったら
     Deoptimization(最適化戻し)
• (3)特定のメタメソッドについて、⾃分専⽤
  の速いCall Siteを⽣成
 – DefaultGroovyMethod#additionals参照
Grape:依存クラス⾃動ダウンロード
• Maven/RubyGemsみたいなリポジト
  リベースモジュール管理
 – Apache Ivyベース
 – Groovyレベルで標準基本機能として実現
 – 必要なクラス/Jarを実⾏時にも取ってこれる
 – 依存関係があれば連鎖的にJarを取ってくる
 – Grails Pluginのような、実⾏時モジュール
   機構は含まない
• 効⽤: Groovyスクリプト配布が容易に
                      From 1.6
Grape使い⽅
• アノテーション
  import org.junit.*
  @Grab(group = 'junit', module='junit', version='*')
  public class GrapeTestSub {
    String testMethod() {
      Assert.class.name
    }
  }
• メソッド呼び出し
 Grape.grab(group:'org.jidesoft', module:'jide-
  oss', version:'[2.2.0,)')

• ʼgrapeʼコマンド                                     From 1.6
JavaインスタンスごとのMetaClass
• 例:
 s = “xxx”;
 s.metaClass.a = { println quot;hogequot;}
 s.a()
 // hogeが出⼒
 – Groovyならもともと可能
 – 「JavaクラスごとのMetaClass」は元々あった

• 参考:クラスごとのMetaClass
 String.metaClass.x={println “hoge” }
 “abc”.x()
 // hogeが出⼒
                                     From 1.6
AST変換
• AST …抽象構⽂⽊
 – コンパイル中にコンパイラ内で作られる
   中間データ構造
• AST変換
 – 指定したアノテーションが与える規則に従って、
   コンパイル時にASTを変換することで、⾔語機能
   を加⼯・追加する
 – デザインパターン指向プログラミング
 – コンパイラソースを修正せずに⾔語機能追加。
 – 定義は結構難しそう(Visitorで)
 – 利⽤は簡単
                    From 1.6
AST変換の例
   アノテーション                      説明
@Bindable/@Vetoable   プロパティの更新伝播(java.beans.
                      PropertyChangeSupport使⽤)
@Singleton            クラスをシングルトンに変換
@Immutable            インスタンス⽣成後の変更を禁⽌
@Delegate             委譲(delegation)パターン
                      を透過的に実現
@Lazy                 プロパティの怠惰(Lazily)な初期化
@Category / @Mixin    カテゴリのメソッドをコンパ
                      イル時にmixinする
@Newify               newなしで「Integer(5)」と書けばイ
                      ンスタンスが⽣成。(未実装?)
                      packageスコープの指定。フィールド
@PackageScope
                      については動いているようだがクラス
                      については?
AST変換: @Singleton
@Singleton class Foo {
 def hello() { println quot;helloquot; }
}
Foo.instance.hello() // シングルトン参照
a = new Foo() // newでインスタンス⽣成不可
ERROR
  java.lang.RuntimeException: Can't
  instantiate singleton Foo. Use
  Foo.instance
AST変換: @Immutable
@Immutable final class Foo {
 String x, y
}
a = new Foo(quot;aquot;,quot;bquot;)
a.x = “hoge”               値の変更
ERROR
  groovy.lang.ReadOnlyPropertyExcep
  tion: Cannot set readonly property:
  x
AST変換: @Delegate
import java.util.concurrent.locks.*
class LockableMap {
  @Delegate private Map map = [:]
  @Delegate private Lock lock = new
   ReentrantLock ()
}
res = new LockableMap()
res.lock ()                Lockとして振舞う
try {
  res.a = 0                Mapとしても振舞う
} finally {
  res.unlock ()
                     ※MapとLockをimplementsもする
}
AST変換: @Lazy
class LazyTest {
  @Lazy List s1 ={println quot;s1 initializingquot;; [1,2,3] }();
  List s2 = {println quot;s2 initializingquot;; [4,5,6] }();
}
x = new LazyTest()
// s2 initializing               s1の初期化は遅延される
println x.s1                     s1への参照で初期化実⾏
// s1 initializing
// [1, 2, 3]が出⼒される
println x.s2
// [4, 5, 6]が出⼒される
AST変換: @Category/@Mixin
interface Mixed {
}

@Category(Mixed) class CatClass {
  def hello() { println quot;helloquot; }
}

@Mixin(CatClass)
class MyClass implements Mixed {
}

x = new MyClass()
x.hello()
      ※interface Mixedの意義が不明。なんらかの処理上のマーカー?
動的なMixinメソッド呼び出し

String.mixin Date
assert quot;aquot;.getTime() == 1231768545451




                                From 1.6
整理:さまざまな機能注⼊の⽅法
          名称             注⼊単位         注⼊タイミング          対象
メソッドを書く                メソッド          コンパイル時          クラス
継承                     メソッド群         コンパイル時          クラス
Category/use           staticメソッド群   実⾏時(use⽂実⾏時)    クラス
DefaultGroovyMethods   staticメソッド群   Groovy処理系のコンパイ クラス(Java)
.java(DGM)                           ル時
MOP(invokeMethod,me メソッド呼び出し         オーバーライドはコンパ     クラス
thodMissing)        に対応する処理          イル時に⾏われるが、処
                                     理内容は実⾏時に決定可
インターセプタ                メソッド呼び出し      実⾏時             インスタンス
                       の前後の処理
Mixinメソッド呼び出し          メソッド群         実⾏時             クラス
                                                                1.6
Mixinアノテーション           メソッド群         コンパイル時          クラス
Delegateアノテーション メソッド群?               コンパイル時          クラス
EMC DSL                クロージャ群        実⾏時             クラス/イン
                                                     スタンス
ExpandoMetaClass(EM    クロージャ         実⾏時             クラス/イン
                                                                1.1
C)                                                   スタンス
                                                                1.5
Expando                クロージャ         実⾏時             インスタンス
マルチ代⼊(多重代⼊)
def (a, b) = [1,2]

def (int i, String j) = [1, 'Groovy']

def a, b
(a, b) = func()

• 要素が余ったら捨て、⾜りなかったら
  nullで補填
                                From 1.6
分岐しててもreturn省略可
def even(x) {
  if (x % 2 == 0) { true } else { false }
}
assert even(2) == true
assert even(1) == false

• ちなみにwhile⽂の最終評価式は値にはなら
  ないようだ

                                 From 1.6
EMC DSL
• 逐次プロパティに代⼊するのではなく
  ⼀気に定義する。
String.metaClass.define {
  foo { s-> println s + delegate }
  bar { println “hello” }
}
 “world”.foo(“hai”) // haiworldが出⼒
 “abc”.bar() // helloが出⼒

※効用: 逐次代入だと、途中で未完成状態のクラスが生じるから?

                                     From 1.6
まとめ
まとめ: Groovyの⽬指すもの
• Java 7がしょぼくなった今、Groovyは
  ⾔語機能拡張のメルティングポット
 –Java 7のクロージャ(案)は、⼿ひどく複雑
  そうだったので、正直ほっとしている。
• “Java is COBOL”?そうじゃあない。
  “Java is C”なんだ。
 –ポイントは「住み分け」
• Groovyは、JVM上にクラスをローディ
  ングするための別記法。
• 「Java+Groovy」は2つで⼀つの技術
参考文献
• http://glaforge.free.fr/weblog/index.php?itemid=241
• http://www.nabble.com/DGM-and-GDoc-
  to14985262.html#a14985262
• http://blog.headius.com/2008/05/power-of-jvm.html
• http://glaforge.free.fr/weblog/index.php?itemid=99
• http://glaforge.free.fr/weblog/index.php?itemid=256
• http://www.infoq.com/jp/articles/groovy-1.5-new‘
• http://shootout.alioth.debian.org/
• http://d.hatena.ne.jp/masanobuimai/20081224/1230123639
• http://docs.codehaus.org/display/GROOVY/Grape
• http://docs.codehaus.org/pages/viewrecentblogposts.action?k
  ey=GROOVY
• http://shemnon.com/speling/2008/04/bindable-observable-
  properties.html

Más contenido relacionado

La actualidad más candente

Lesson 1com
Lesson 1comLesson 1com
Lesson 1comSen Kung
 
คอมพิวเตอร์เบื้องต้น
คอมพิวเตอร์เบื้องต้นคอมพิวเตอร์เบื้องต้น
คอมพิวเตอร์เบื้องต้นPomPam Comsci
 
Cybozu Inc 10th anniversary event - developing section.
Cybozu Inc 10th anniversary event - developing section.Cybozu Inc 10th anniversary event - developing section.
Cybozu Inc 10th anniversary event - developing section.cydn.cybozu.co.jp
 
すまべん関東#1「WindowsMobileでMortscriptを活用しよう!」
すまべん関東#1「WindowsMobileでMortscriptを活用しよう!」すまべん関東#1「WindowsMobileでMortscriptを活用しよう!」
すまべん関東#1「WindowsMobileでMortscriptを活用しよう!」icchu3
 
水晶報表的使用
水晶報表的使用水晶報表的使用
水晶報表的使用ShunYeh
 
【13-D-1】 ERP5に見るストレージ技術
【13-D-1】 ERP5に見るストレージ技術【13-D-1】 ERP5に見るストレージ技術
【13-D-1】 ERP5に見るストレージ技術devsumi2009
 
本当は怖いObjectSpace.each_object
本当は怖いObjectSpace.each_object本当は怖いObjectSpace.each_object
本当は怖いObjectSpace.each_objectNarihiro Nakamura
 
OSC2009KYOTO Asterisk User\'s Group Japan
OSC2009KYOTO Asterisk User\'s Group JapanOSC2009KYOTO Asterisk User\'s Group Japan
OSC2009KYOTO Asterisk User\'s Group JapanKenichi 深海
 
5.保护您的互联网应用—Azure权限管理服务
5.保护您的互联网应用—Azure权限管理服务5.保护您的互联网应用—Azure权限管理服务
5.保护您的互联网应用—Azure权限管理服务GaryYoung
 
ロックフリーGCLOCKページ置換アルゴリズム
ロックフリーGCLOCKページ置換アルゴリズムロックフリーGCLOCKページ置換アルゴリズム
ロックフリーGCLOCKページ置換アルゴリズムMakoto Yui
 
Ohp Seijoen H20 02 Hensu To Kata
Ohp Seijoen H20 02 Hensu To KataOhp Seijoen H20 02 Hensu To Kata
Ohp Seijoen H20 02 Hensu To Katasesejun
 
106 Ch
106 Ch106 Ch
106 Chanjaan
 
196 Ch
196 Ch196 Ch
196 Chanjaan
 
Lets Enjoy C#!
Lets Enjoy C#!Lets Enjoy C#!
Lets Enjoy C#!将 高野
 

La actualidad más candente (17)

Lesson 1com
Lesson 1comLesson 1com
Lesson 1com
 
คอมพิวเตอร์เบื้องต้น
คอมพิวเตอร์เบื้องต้นคอมพิวเตอร์เบื้องต้น
คอมพิวเตอร์เบื้องต้น
 
Cybozu Inc 10th anniversary event - developing section.
Cybozu Inc 10th anniversary event - developing section.Cybozu Inc 10th anniversary event - developing section.
Cybozu Inc 10th anniversary event - developing section.
 
すまべん関東#1「WindowsMobileでMortscriptを活用しよう!」
すまべん関東#1「WindowsMobileでMortscriptを活用しよう!」すまべん関東#1「WindowsMobileでMortscriptを活用しよう!」
すまべん関東#1「WindowsMobileでMortscriptを活用しよう!」
 
水晶報表的使用
水晶報表的使用水晶報表的使用
水晶報表的使用
 
【13-D-1】 ERP5に見るストレージ技術
【13-D-1】 ERP5に見るストレージ技術【13-D-1】 ERP5に見るストレージ技術
【13-D-1】 ERP5に見るストレージ技術
 
تمرينات المصادر الحرة
تمرينات المصادر الحرةتمرينات المصادر الحرة
تمرينات المصادر الحرة
 
本当は怖いObjectSpace.each_object
本当は怖いObjectSpace.each_object本当は怖いObjectSpace.each_object
本当は怖いObjectSpace.each_object
 
91 Ch
91 Ch91 Ch
91 Ch
 
OSC2009KYOTO Asterisk User\'s Group Japan
OSC2009KYOTO Asterisk User\'s Group JapanOSC2009KYOTO Asterisk User\'s Group Japan
OSC2009KYOTO Asterisk User\'s Group Japan
 
5.保护您的互联网应用—Azure权限管理服务
5.保护您的互联网应用—Azure权限管理服务5.保护您的互联网应用—Azure权限管理服务
5.保护您的互联网应用—Azure权限管理服务
 
ロックフリーGCLOCKページ置換アルゴリズム
ロックフリーGCLOCKページ置換アルゴリズムロックフリーGCLOCKページ置換アルゴリズム
ロックフリーGCLOCKページ置換アルゴリズム
 
Ohp Seijoen H20 02 Hensu To Kata
Ohp Seijoen H20 02 Hensu To KataOhp Seijoen H20 02 Hensu To Kata
Ohp Seijoen H20 02 Hensu To Kata
 
JavaScript再入門
JavaScript再入門JavaScript再入門
JavaScript再入門
 
106 Ch
106 Ch106 Ch
106 Ch
 
196 Ch
196 Ch196 Ch
196 Ch
 
Lets Enjoy C#!
Lets Enjoy C#!Lets Enjoy C#!
Lets Enjoy C#!
 

Más de Uehara Junji

Use JWT access-token on Grails REST API
Use JWT access-token on Grails REST APIUse JWT access-token on Grails REST API
Use JWT access-token on Grails REST APIUehara Junji
 
Groovy Bootcamp 2015 by JGGUG
Groovy Bootcamp 2015 by JGGUGGroovy Bootcamp 2015 by JGGUG
Groovy Bootcamp 2015 by JGGUGUehara Junji
 
Groovy Shell Scripting 2015
Groovy Shell Scripting 2015Groovy Shell Scripting 2015
Groovy Shell Scripting 2015Uehara Junji
 
Shibuya JVM Groovy 20150418
Shibuya JVM Groovy 20150418Shibuya JVM Groovy 20150418
Shibuya JVM Groovy 20150418Uehara Junji
 
Markup Template Engine introduced Groovy 2.3
Markup Template Engine introduced Groovy 2.3Markup Template Engine introduced Groovy 2.3
Markup Template Engine introduced Groovy 2.3Uehara Junji
 
Introduce Groovy 2.3 trait
Introduce Groovy 2.3 trait Introduce Groovy 2.3 trait
Introduce Groovy 2.3 trait Uehara Junji
 
Indy(Invokedynamic) and Bytecode DSL and Brainf*ck
Indy(Invokedynamic) and Bytecode DSL and Brainf*ckIndy(Invokedynamic) and Bytecode DSL and Brainf*ck
Indy(Invokedynamic) and Bytecode DSL and Brainf*ckUehara Junji
 
enterprise grails challenge, 2013 Summer
enterprise grails challenge, 2013 Summerenterprise grails challenge, 2013 Summer
enterprise grails challenge, 2013 SummerUehara 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
 
Groovy kisobenkyoukai20130309
Groovy kisobenkyoukai20130309Groovy kisobenkyoukai20130309
Groovy kisobenkyoukai20130309Uehara Junji
 
Read Groovy Compile process(Groovy Benkyoukai 2013)
Read Groovy Compile process(Groovy Benkyoukai 2013)Read Groovy Compile process(Groovy Benkyoukai 2013)
Read Groovy Compile process(Groovy Benkyoukai 2013)Uehara Junji
 
groovy 2.1.0 20130118
groovy 2.1.0 20130118groovy 2.1.0 20130118
groovy 2.1.0 20130118Uehara Junji
 
New feature of Groovy2.0 G*Workshop
New feature of Groovy2.0 G*WorkshopNew feature of Groovy2.0 G*Workshop
New feature of Groovy2.0 G*WorkshopUehara Junji
 
G* Workshop in fukuoka 20120901
G* Workshop in fukuoka 20120901G* Workshop in fukuoka 20120901
G* Workshop in fukuoka 20120901Uehara 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 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
 
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
 

Más de Uehara Junji (20)

Use JWT access-token on Grails REST API
Use JWT access-token on Grails REST APIUse JWT access-token on Grails REST API
Use JWT access-token on Grails REST API
 
Groovy Bootcamp 2015 by JGGUG
Groovy Bootcamp 2015 by JGGUGGroovy Bootcamp 2015 by JGGUG
Groovy Bootcamp 2015 by JGGUG
 
Groovy Shell Scripting 2015
Groovy Shell Scripting 2015Groovy Shell Scripting 2015
Groovy Shell Scripting 2015
 
Shibuya JVM Groovy 20150418
Shibuya JVM Groovy 20150418Shibuya JVM Groovy 20150418
Shibuya JVM Groovy 20150418
 
Markup Template Engine introduced Groovy 2.3
Markup Template Engine introduced Groovy 2.3Markup Template Engine introduced Groovy 2.3
Markup Template Engine introduced Groovy 2.3
 
Introduce Groovy 2.3 trait
Introduce Groovy 2.3 trait Introduce Groovy 2.3 trait
Introduce Groovy 2.3 trait
 
Indy(Invokedynamic) and Bytecode DSL and Brainf*ck
Indy(Invokedynamic) and Bytecode DSL and Brainf*ckIndy(Invokedynamic) and Bytecode DSL and Brainf*ck
Indy(Invokedynamic) and Bytecode DSL and Brainf*ck
 
enterprise grails challenge, 2013 Summer
enterprise grails challenge, 2013 Summerenterprise grails challenge, 2013 Summer
enterprise grails challenge, 2013 Summer
 
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
 
Groovy kisobenkyoukai20130309
Groovy kisobenkyoukai20130309Groovy kisobenkyoukai20130309
Groovy kisobenkyoukai20130309
 
Read Groovy Compile process(Groovy Benkyoukai 2013)
Read Groovy Compile process(Groovy Benkyoukai 2013)Read Groovy Compile process(Groovy Benkyoukai 2013)
Read Groovy Compile process(Groovy Benkyoukai 2013)
 
groovy 2.1.0 20130118
groovy 2.1.0 20130118groovy 2.1.0 20130118
groovy 2.1.0 20130118
 
New feature of Groovy2.0 G*Workshop
New feature of Groovy2.0 G*WorkshopNew feature of Groovy2.0 G*Workshop
New feature of Groovy2.0 G*Workshop
 
G* Workshop in fukuoka 20120901
G* Workshop in fukuoka 20120901G* Workshop in fukuoka 20120901
G* Workshop in fukuoka 20120901
 
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 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)
 
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
 

Groovy Now And Future

  • 1. Groovyなう&ふゅーちゃー それからのGroovy GCR 16th NTTソフトウェア上原潤二 2009/1/15
  • 2. Groovyイン・アクション(GinA) • 国内初のGroovy解説書(翻訳) • “バイブル本“ • 対応Groovyバージョン –原書はGroovy 1.0ベース –サンプルコードをGroovy 1.5.4で動作する ように緻密に修正。 –Groovy 1.0より後に実装された機能につい ては基本的には追記しない。 ので本発表ではそこを説明します
  • 3. Groovy年表 2003 2004 2005 8月 3月 12月 2月 ▲ ▲ ▲ 本日の対象 1.0b4 1.0b8 1.0b10 JSR化 JSR EA 2006 2007 2008 1.1b1 7月 2月 4月 12月 2月 12月 ▲ ▲ ▲ ▲ ▲ ▲ 1.0 JSR-6 1.0 1.1b2 1.5.0 1.5.4 1.5.7 1.6-rc1 GinA本対象 Grails 0.5.6 Grails 1.0 1.1b2
  • 4. Groovy 1.1と1.5の関係 • 1.1b1, 1.1b2, ・・・, 1.1-RC1, ときて1.5 –Java “5”の機能取り込みと、 機能が⼤幅アップしたから –1.1正式版は存在しない。 –本資料では、1.1および1.5の新機能を From 1.1・1.5 のマークで表⽰ –ちなみに1.6機能は From 1.6 で。
  • 5. Groovy 1.1=1.5の主な機能 • Java 5対応 – アノテーション利⽤ – enum(ただし、インナークラスになるenumは×) – 可変個数引数 – static import – Generics – 共変の戻り値 • ⾔語仕様 – エルビス演算⼦ – for(;;)形式ループ – 名前付き引数で関数呼び出しの括弧省略 • ジョイントコンパイラ • Expando Meta Class (EMC) From 1.1・1.5 • 性能向上,bugfix,改良,etc,etc,
  • 6. Groovy 1.6の主な機能 • ⾔語仕様 – マルチ代⼊(多重代⼊) – 分岐しててもreturn省略可 – AST変換 – Groovyでアノテーション定義 • 動的な振る舞いに関するもの – JavaインスタンスごとのMetaClass – EMC DSL – 実⾏時Mixin • ライブラリ: Swing Builderの改善 • ツール: Grape • 性能向上 • bugfix,改良,etc,etc From 1.6
  • 8. ベンチマーク! • The Computer Language Benchmarks Game –Aka “shootout” –マイクロベンチマーク • 抜粋して実施
  • 9. その前に • 速度にこだわるべき? –マシンも速くなってるし –Groovyであることで遅いなら、 ボトルネックをJavaで書き直せばよい それはものすごく簡単 • 処理系速度は体感速度に対して⽀配的 とは限らない –ライブラリやIOの性能が⽀配的な場合も • でも –Groovy同⼠なら⾯⽩かろう
  • 12. 感想(感覚的なものです) • Groovy 1.6でメソッドコールが爆 速に(理由は後述) • つってもJRubyと同等(かやや上) • JVM上の⾔語の共通の特徴として –起動は遅いっすよ –メモリは⽐較的⾷うっすよ
  • 14. エルビス演算⼦(Elvis Operator) • 三項演算⼦ A?B:C は次と等価 if (A) { B } else { C } • エルビス演算⼦ ※GCCの独自拡張に由来 A ?: B は次と等価 if (A) { A } else { B } From 1.1・1.5
  • 16. ジョイントコンパイラ • GroovyとJavaコードが相互依存してい てもコンパイル可能に class A { B b; } class B extends A {} • 内部では、Groovyクラスのスタブ(メ ソッド本体を削除したもの)を⽣成して からJavaコンパイラを起動する • groovycの-jオプションで実⾏ From 1.1・1.5
  • 17. ExpandoMetaClass (EMC) • プロパティにクロージャを代⼊する とメソッドの様に扱える String.metaclass.hello = { println “hello”+delegate } “world”.hello() // helloworldが出⼒ • 簡便な動的メソッド定義。 • prototypeと同様だが、Groovyでは クラスベースOOPと⼆本⽴て。 EMCは後付け。 From 1.1・1.5
  • 19. Call Siteキャッシュ,Call Site最適化 • 性能向上の主因 –「メソッドコールが遅い」←Groovyの遅 さは⼤半これで説明。 • 動的メソッド呼び出しに先⽴つメソッ ド探索をキャッシュ –動的⾔語で効果が⼤ –JRubyが先達 –アイデア⾃体は古くからある • JVM上で極めて有効(後述) From 1.6
  • 20. 動的メソッド呼び出し概念フロー 呼び出し側クラス GroovyクラスX x = new X() Class X { x.foo() メソッド探索 def foo() { Pogo呼び出し } Pogo …Plain Old Groovy Object
  • 21. 動的メソッド呼び出し概念フロー 呼び出し側クラス GroovyクラスX x = new X() Class X { x.foo() メソッド探索 メタクラスのメソッド } の呼び出し Xのメタクラス ‘foo’ = { }
  • 22. 問題はメソッド探索のコスト • 探索時に以下の判定を⾏う必要がある –Pojo/Pogoのメソッド? –メタクラス定義メソッド? •クラスごとのメタクラス? •インスタンスごとのメタクラス? –プロパティ参照か? 明ら –コンストラクタ呼び出しか? かに –インタセプト可能か? 重い –Staticかどうか? :
  • 23. Call Site Cache (1回⽬) 呼び出し側クラス GroovyクラスX x = new X() Class X { x.foo() メソッド探索 PogoMetaClassSiteの } インスタンスを保存 Xのメタクラス CallSite ‘foo’ = { } ※CallSiteはSoftReferenceで保持されるので メモリがなくなってきたら解放される
  • 24. Call Site Cache (2回⽬) 呼び出し側クラス GroovyクラスX x = new X() Class X { x.foo() 保存された } PogoMetaClassSiteの インスタンスをcall() Xのメタクラス CallSite ‘foo’ = { } ※実際には呼び出しが複数あるので配列CallSiteArrayで保持 ※意味が動的に変わったらCallSiteのインスタンスを差し替える (自分で自分を置き換える。コード的にはこれがやや面白い)
  • 25. Call Site最適化まとめ • (1)メソッド探索コストを2回⽬以降削減 • (2)JITによるインライン展開の道を開く – マシン語レベルでほんとに展開されているか私 は確認してません(Open JDKで確認可)がほんと なら⾮常に効果が⾼い(連鎖的展開を導く) – インライン展開に関してHotSpotは極めて強⼒ • アグレッシブにやって状況変わったら Deoptimization(最適化戻し) • (3)特定のメタメソッドについて、⾃分専⽤ の速いCall Siteを⽣成 – DefaultGroovyMethod#additionals参照
  • 26. Grape:依存クラス⾃動ダウンロード • Maven/RubyGemsみたいなリポジト リベースモジュール管理 – Apache Ivyベース – Groovyレベルで標準基本機能として実現 – 必要なクラス/Jarを実⾏時にも取ってこれる – 依存関係があれば連鎖的にJarを取ってくる – Grails Pluginのような、実⾏時モジュール 機構は含まない • 効⽤: Groovyスクリプト配布が容易に From 1.6
  • 27. Grape使い⽅ • アノテーション import org.junit.* @Grab(group = 'junit', module='junit', version='*') public class GrapeTestSub { String testMethod() { Assert.class.name } } • メソッド呼び出し Grape.grab(group:'org.jidesoft', module:'jide- oss', version:'[2.2.0,)') • ʼgrapeʼコマンド From 1.6
  • 28. JavaインスタンスごとのMetaClass • 例: s = “xxx”; s.metaClass.a = { println quot;hogequot;} s.a() // hogeが出⼒ – Groovyならもともと可能 – 「JavaクラスごとのMetaClass」は元々あった • 参考:クラスごとのMetaClass String.metaClass.x={println “hoge” } “abc”.x() // hogeが出⼒ From 1.6
  • 29. AST変換 • AST …抽象構⽂⽊ – コンパイル中にコンパイラ内で作られる 中間データ構造 • AST変換 – 指定したアノテーションが与える規則に従って、 コンパイル時にASTを変換することで、⾔語機能 を加⼯・追加する – デザインパターン指向プログラミング – コンパイラソースを修正せずに⾔語機能追加。 – 定義は結構難しそう(Visitorで) – 利⽤は簡単 From 1.6
  • 30. AST変換の例 アノテーション 説明 @Bindable/@Vetoable プロパティの更新伝播(java.beans. PropertyChangeSupport使⽤) @Singleton クラスをシングルトンに変換 @Immutable インスタンス⽣成後の変更を禁⽌ @Delegate 委譲(delegation)パターン を透過的に実現 @Lazy プロパティの怠惰(Lazily)な初期化 @Category / @Mixin カテゴリのメソッドをコンパ イル時にmixinする @Newify newなしで「Integer(5)」と書けばイ ンスタンスが⽣成。(未実装?) packageスコープの指定。フィールド @PackageScope については動いているようだがクラス については?
  • 31. AST変換: @Singleton @Singleton class Foo { def hello() { println quot;helloquot; } } Foo.instance.hello() // シングルトン参照 a = new Foo() // newでインスタンス⽣成不可 ERROR java.lang.RuntimeException: Can't instantiate singleton Foo. Use Foo.instance
  • 32. AST変換: @Immutable @Immutable final class Foo { String x, y } a = new Foo(quot;aquot;,quot;bquot;) a.x = “hoge” 値の変更 ERROR groovy.lang.ReadOnlyPropertyExcep tion: Cannot set readonly property: x
  • 33. AST変換: @Delegate import java.util.concurrent.locks.* class LockableMap { @Delegate private Map map = [:] @Delegate private Lock lock = new ReentrantLock () } res = new LockableMap() res.lock () Lockとして振舞う try { res.a = 0 Mapとしても振舞う } finally { res.unlock () ※MapとLockをimplementsもする }
  • 34. AST変換: @Lazy class LazyTest { @Lazy List s1 ={println quot;s1 initializingquot;; [1,2,3] }(); List s2 = {println quot;s2 initializingquot;; [4,5,6] }(); } x = new LazyTest() // s2 initializing s1の初期化は遅延される println x.s1 s1への参照で初期化実⾏ // s1 initializing // [1, 2, 3]が出⼒される println x.s2 // [4, 5, 6]が出⼒される
  • 35. AST変換: @Category/@Mixin interface Mixed { } @Category(Mixed) class CatClass { def hello() { println quot;helloquot; } } @Mixin(CatClass) class MyClass implements Mixed { } x = new MyClass() x.hello() ※interface Mixedの意義が不明。なんらかの処理上のマーカー?
  • 37. 整理:さまざまな機能注⼊の⽅法 名称 注⼊単位 注⼊タイミング 対象 メソッドを書く メソッド コンパイル時 クラス 継承 メソッド群 コンパイル時 クラス Category/use staticメソッド群 実⾏時(use⽂実⾏時) クラス DefaultGroovyMethods staticメソッド群 Groovy処理系のコンパイ クラス(Java) .java(DGM) ル時 MOP(invokeMethod,me メソッド呼び出し オーバーライドはコンパ クラス thodMissing) に対応する処理 イル時に⾏われるが、処 理内容は実⾏時に決定可 インターセプタ メソッド呼び出し 実⾏時 インスタンス の前後の処理 Mixinメソッド呼び出し メソッド群 実⾏時 クラス 1.6 Mixinアノテーション メソッド群 コンパイル時 クラス Delegateアノテーション メソッド群? コンパイル時 クラス EMC DSL クロージャ群 実⾏時 クラス/イン スタンス ExpandoMetaClass(EM クロージャ 実⾏時 クラス/イン 1.1 C) スタンス 1.5 Expando クロージャ 実⾏時 インスタンス
  • 38. マルチ代⼊(多重代⼊) def (a, b) = [1,2] def (int i, String j) = [1, 'Groovy'] def a, b (a, b) = func() • 要素が余ったら捨て、⾜りなかったら nullで補填 From 1.6
  • 39. 分岐しててもreturn省略可 def even(x) { if (x % 2 == 0) { true } else { false } } assert even(2) == true assert even(1) == false • ちなみにwhile⽂の最終評価式は値にはなら ないようだ From 1.6
  • 40. EMC DSL • 逐次プロパティに代⼊するのではなく ⼀気に定義する。 String.metaClass.define { foo { s-> println s + delegate } bar { println “hello” } } “world”.foo(“hai”) // haiworldが出⼒ “abc”.bar() // helloが出⼒ ※効用: 逐次代入だと、途中で未完成状態のクラスが生じるから? From 1.6
  • 42. まとめ: Groovyの⽬指すもの • Java 7がしょぼくなった今、Groovyは ⾔語機能拡張のメルティングポット –Java 7のクロージャ(案)は、⼿ひどく複雑 そうだったので、正直ほっとしている。 • “Java is COBOL”?そうじゃあない。 “Java is C”なんだ。 –ポイントは「住み分け」 • Groovyは、JVM上にクラスをローディ ングするための別記法。 • 「Java+Groovy」は2つで⼀つの技術
  • 43. 参考文献 • http://glaforge.free.fr/weblog/index.php?itemid=241 • http://www.nabble.com/DGM-and-GDoc- to14985262.html#a14985262 • http://blog.headius.com/2008/05/power-of-jvm.html • http://glaforge.free.fr/weblog/index.php?itemid=99 • http://glaforge.free.fr/weblog/index.php?itemid=256 • http://www.infoq.com/jp/articles/groovy-1.5-new‘ • http://shootout.alioth.debian.org/ • http://d.hatena.ne.jp/masanobuimai/20081224/1230123639 • http://docs.codehaus.org/display/GROOVY/Grape • http://docs.codehaus.org/pages/viewrecentblogposts.action?k ey=GROOVY • http://shemnon.com/speling/2008/04/bindable-observable- properties.html