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