Groovyとindy

      2012/2/22 @JJUG Night Seminar
JJUG幹事/ JGGUGサポートスタッフ 須江 信洋

                http://twitter.com/nobusue
             http://d.hatena.ne.jp/nobusue

         ※資料の内容は個人としての意見・見解を述べたものであり、
         所属する企業・組織が内容を保証するものではありません。
自己紹介
       須江 信洋(すえ のぶひろ)
           Twitter: @nobusue
           http://www.facebook.com/profile.php?id=732337788
       かれこれ10年ほどJavaEE関連の仕事をしてます
       G*(Groovy関連技術)との関わり
           Groovyコミュニティ(JGGUG)サポートスタッフ
           「プログラミングGROOVY」執筆チーム
           「Groovy イン・アクション」翻訳チーム


       言語実装経験ありません・・・
    2
本日のお題
 Groovyのメソッド呼出しの仕組み(概要)
 GroovyのInvokeDynamic対応(indy branch)
 Groovyの静的型対応




3
Groovyとは
       Javaと親和性の高いJVM言語
           Javaと(ほぼ)上位互換の文法
           +リスト/マップリテラル、クロージャ、etc
               Javaで冗長になりがちな処理を簡潔に書ける
           Javaのクラス⇔Groovyのクラス
       スクリプト言語
           コンパイル不要、ソースのまま実行可能
               内部的にクラスファイルを自動生成(インタープリターではない)
               groovycコマンドで明示的なクラスファイル生成も可能
       動的言語
           MOP(Meta Object Protocol)、ExpandoMetaClass
           BuilderやDynamic Finderなどの実装が容易

    4
MetaClassによる動的メソッド
[For Groovy class]
class Hoge { }
Hoge.metaClass.hello = {
   name -> return "Hello ${name}!" }

 assert new Hoge().hello('indy') == 'Hello indy!'
[For Java class]
java.lang.String.metaClass.hello = {
   name -> return "Hello ${name}!" }

assert "abc".hello('indy') == 'Hello indy!'
5
Groovyのメソッド呼出し概略(1.8.x)
                Java        オブジェクト         Groovy
                             のタイプ

Yes   動的メソッ        No                         Yes   メソッドが    No
       ド?                                            存在?


                                     Yes   インターセプ    No        invoke
クロージャ       Groovy拡張                                          Method()
                                            ト可能?
 実行           メソッド?

                       No        invoke       Yes             No
                                                    動的メソッ
      Yes                       Method()             ド?

      GDKメソッド      Javaメソッド                 クロージャ
        実行            実行                                    メソッド実行
                                             実行

  6
メソッド呼出し効率の改善
 Call   Siteキャッシュ
     動的メソッド呼出しに伴うメソッド探索結果を
      キャッシュして再利用
     Groovy 1.6から導入
     かなりの高速化を達成




7
MOP2: 新世代MOP
 GroovyのMOPを再設計する取り組み
   MOPの実装が複雑になりすぎたことへの反省
   Java7のInvokeDynamicに対応
     できれば最適化はJVMに任せたい

 Groovy2.0(現在beta)に一部取り込まれる予
  定
 InvokeDynamic対応はindyブランチで開発中
       https://github.com/groovy/groovy-core/tree/indy



8
indyブランチの現状(2012/2/22)
   InvokeDynamicに対応したバイトコードを生成
    するための処理の実装中
       org.codehaus.groovy.vmplugin.v7.IndyInterface
       org.codehaus.groovy.classgen.asm.indy.InvokeDynamicWriter
       org.codehaus.groovy.classgen.asm.WriterController

 これらを有効化するには、
  CompilerConfigurationでオプション"indy"
  を指定する必要あり
 チューニングなどの最適化や、メインブランチ
  へのマージはこれからの課題
9
まだ道半ばですね・・・




10
参考: Blackdrag's View
   indy対応のメインコントリビューターの覚書
       http://blackdragsview.blogspot.com/2012/01
        /invokedynamic-api.html
   APIリファレンスだけでは分かりづらい箇所や
    使い方のコツなど、Groovyへの実装によって
    得られた知見がまとめられている




11
Groovyの静的型対応
   GEP8:Static Type Checking
       http://docs.codehaus.org/display/GroovyJSR
        /GEP+8+-+Static+type+checking
       Groovyに型安全をもたらすための取り組み

   GEP10: Static compilation
       http://docs.codehaus.org/display/GroovyJSR
        /GEP+10+-+Static+compilation
       Groovyのパフォーマンス向上のための取り組み

12
GEP8: Static type checking
@TypeChecked
void method(String message) {
  if (rareCondition) {
     println "Did you spot the error in this ${message.toUppercase()}?"
   }
}

   クラスやメソッドを @TypeChecked で修飾
   目的は問題の早期発見(IDE向け?)
   grumpyブランチで開発中
       https://github.com/groovy/groovy-core/tree/grumpy
   詳細は @uehaj さんのblogで
       http://d.hatena.ne.jp/uehaj/20111114/1321236715

 13
GEP10: Static compilation
@groovy.transform.CompileStatic
int fib(int i) {
    i < 2 ? 1 : fib(i - 2) + fib(i - 1)
}

    現時点では提案&実験的実装
        メソッドを @CompileStatic で修飾
        新しい文法 obj->method() でstatic dispatch
    目的はパフォーマンス向上(Javaと同等を目指す)
    experimental-static-compilerブランチで開発中
        https://github.com/groovy/groovy-
         core/tree/experimental-static-compiler
    詳細は @uehaj さんのblogで・・・
        http://d.hatena.ne.jp/uehaj/20111124/1322117039

    14
まとめ                                        Groovy 2.0

                            Groovy
                        as Dynamic Java
                                             indy


Groovy
                  1.6          1.8
 1.5
                                            grumpy
     Call Siteキャッシュ                        experimental-
     (Dynamic&Static)                         static-
                              Groovy         compiler
                          as Better Java

15
ご静聴ありがとうございました




16

Groovy indy 20120222

  • 1.
    Groovyとindy 2012/2/22 @JJUG Night Seminar JJUG幹事/ JGGUGサポートスタッフ 須江 信洋 http://twitter.com/nobusue http://d.hatena.ne.jp/nobusue ※資料の内容は個人としての意見・見解を述べたものであり、 所属する企業・組織が内容を保証するものではありません。
  • 2.
    自己紹介  須江 信洋(すえ のぶひろ)  Twitter: @nobusue  http://www.facebook.com/profile.php?id=732337788  かれこれ10年ほどJavaEE関連の仕事をしてます  G*(Groovy関連技術)との関わり  Groovyコミュニティ(JGGUG)サポートスタッフ  「プログラミングGROOVY」執筆チーム  「Groovy イン・アクション」翻訳チーム  言語実装経験ありません・・・ 2
  • 3.
  • 4.
    Groovyとは  Javaと親和性の高いJVM言語  Javaと(ほぼ)上位互換の文法  +リスト/マップリテラル、クロージャ、etc  Javaで冗長になりがちな処理を簡潔に書ける  Javaのクラス⇔Groovyのクラス  スクリプト言語  コンパイル不要、ソースのまま実行可能  内部的にクラスファイルを自動生成(インタープリターではない)  groovycコマンドで明示的なクラスファイル生成も可能  動的言語  MOP(Meta Object Protocol)、ExpandoMetaClass  BuilderやDynamic Finderなどの実装が容易 4
  • 5.
    MetaClassによる動的メソッド [For Groovy class] classHoge { } Hoge.metaClass.hello = { name -> return "Hello ${name}!" } assert new Hoge().hello('indy') == 'Hello indy!' [For Java class] java.lang.String.metaClass.hello = { name -> return "Hello ${name}!" } assert "abc".hello('indy') == 'Hello indy!' 5
  • 6.
    Groovyのメソッド呼出し概略(1.8.x) Java オブジェクト Groovy のタイプ Yes 動的メソッ No Yes メソッドが No ド? 存在? Yes インターセプ No invoke クロージャ Groovy拡張 Method() ト可能? 実行 メソッド? No invoke Yes No 動的メソッ Yes Method() ド? GDKメソッド Javaメソッド クロージャ 実行 実行 メソッド実行 実行 6
  • 7.
    メソッド呼出し効率の改善  Call Siteキャッシュ  動的メソッド呼出しに伴うメソッド探索結果を キャッシュして再利用  Groovy 1.6から導入  かなりの高速化を達成 7
  • 8.
    MOP2: 新世代MOP  GroovyのMOPを再設計する取り組み  MOPの実装が複雑になりすぎたことへの反省  Java7のInvokeDynamicに対応  できれば最適化はJVMに任せたい  Groovy2.0(現在beta)に一部取り込まれる予 定  InvokeDynamic対応はindyブランチで開発中  https://github.com/groovy/groovy-core/tree/indy 8
  • 9.
    indyブランチの現状(2012/2/22)  InvokeDynamicに対応したバイトコードを生成 するための処理の実装中  org.codehaus.groovy.vmplugin.v7.IndyInterface  org.codehaus.groovy.classgen.asm.indy.InvokeDynamicWriter  org.codehaus.groovy.classgen.asm.WriterController  これらを有効化するには、 CompilerConfigurationでオプション"indy" を指定する必要あり  チューニングなどの最適化や、メインブランチ へのマージはこれからの課題 9
  • 10.
  • 11.
    参考: Blackdrag's View  indy対応のメインコントリビューターの覚書  http://blackdragsview.blogspot.com/2012/01 /invokedynamic-api.html  APIリファレンスだけでは分かりづらい箇所や 使い方のコツなど、Groovyへの実装によって 得られた知見がまとめられている 11
  • 12.
    Groovyの静的型対応  GEP8:Static Type Checking  http://docs.codehaus.org/display/GroovyJSR /GEP+8+-+Static+type+checking  Groovyに型安全をもたらすための取り組み  GEP10: Static compilation  http://docs.codehaus.org/display/GroovyJSR /GEP+10+-+Static+compilation  Groovyのパフォーマンス向上のための取り組み 12
  • 13.
    GEP8: Static typechecking @TypeChecked void method(String message) { if (rareCondition) { println "Did you spot the error in this ${message.toUppercase()}?" } }  クラスやメソッドを @TypeChecked で修飾  目的は問題の早期発見(IDE向け?)  grumpyブランチで開発中  https://github.com/groovy/groovy-core/tree/grumpy  詳細は @uehaj さんのblogで  http://d.hatena.ne.jp/uehaj/20111114/1321236715 13
  • 14.
    GEP10: Static compilation @groovy.transform.CompileStatic intfib(int i) { i < 2 ? 1 : fib(i - 2) + fib(i - 1) }  現時点では提案&実験的実装  メソッドを @CompileStatic で修飾  新しい文法 obj->method() でstatic dispatch  目的はパフォーマンス向上(Javaと同等を目指す)  experimental-static-compilerブランチで開発中  https://github.com/groovy/groovy- core/tree/experimental-static-compiler  詳細は @uehaj さんのblogで・・・  http://d.hatena.ne.jp/uehaj/20111124/1322117039 14
  • 15.
    まとめ Groovy 2.0 Groovy as Dynamic Java indy Groovy 1.6 1.8 1.5 grumpy Call Siteキャッシュ experimental- (Dynamic&Static) static- Groovy compiler as Better Java 15
  • 16.