Upload
nobuhiro-sue
View
1.397
Download
2
Embed Size (px)
DESCRIPTION
2012/2/22開催 JJUG Night Seminar資料
Citation preview
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による動的メソッド
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]
Groovyのメソッド呼出し概略(1.8.x)
6
オブジェクトのタイプ
メソッドが 存在?
invoke Method()
インターセプト可能?
動的メソッド?
メソッド実行 クロージャ 実行
invoke Method()
Groovy
No Yes
Yes No
Yes No
動的メソッド?
Groovy拡張メソッド?
クロージャ 実行
Yes No
Java
GDKメソッド実行
Javaメソッド実行
No Yes
メソッド呼出し効率の改善
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 で修飾
目的は問題の早期発見(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()}?" } }
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) }
まとめ
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
ご静聴ありがとうございました
16