Groovy indy 20120222

1,725 views
1,626 views

Published on

2012/2/22開催 JJUG Night Seminar資料

Published in: Technology
0 Comments
6 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,725
On SlideShare
0
From Embeds
0
Number of Embeds
8
Actions
Shares
0
Downloads
7
Comments
0
Likes
6
Embeds 0
No embeds

No notes for slide

Groovy indy 20120222

  1. 1. Groovyとindy 2012/2/22 @JJUG Night SeminarJJUG幹事/ JGGUGサポートスタッフ 須江 信洋 http://twitter.com/nobusue http://d.hatena.ne.jp/nobusue ※資料の内容は個人としての意見・見解を述べたものであり、 所属する企業・組織が内容を保証するものではありません。
  2. 2. 自己紹介 須江 信洋(すえ のぶひろ)  Twitter: @nobusue  http://www.facebook.com/profile.php?id=732337788 かれこれ10年ほどJavaEE関連の仕事をしてます G*(Groovy関連技術)との関わり  Groovyコミュニティ(JGGUG)サポートスタッフ  「プログラミングGROOVY」執筆チーム  「Groovy イン・アクション」翻訳チーム 言語実装経験ありません・・・ 2
  3. 3. 本日のお題 Groovyのメソッド呼出しの仕組み(概要) GroovyのInvokeDynamic対応(indy branch) Groovyの静的型対応3
  4. 4. Groovyとは Javaと親和性の高いJVM言語  Javaと(ほぼ)上位互換の文法  +リスト/マップリテラル、クロージャ、etc  Javaで冗長になりがちな処理を簡潔に書ける  Javaのクラス⇔Groovyのクラス スクリプト言語  コンパイル不要、ソースのまま実行可能  内部的にクラスファイルを自動生成(インタープリターではない)  groovycコマンドで明示的なクラスファイル生成も可能 動的言語  MOP(Meta Object Protocol)、ExpandoMetaClass  BuilderやDynamic Finderなどの実装が容易 4
  5. 5. 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
  6. 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. 7. メソッド呼出し効率の改善 Call Siteキャッシュ  動的メソッド呼出しに伴うメソッド探索結果を キャッシュして再利用  Groovy 1.6から導入  かなりの高速化を達成7
  8. 8. MOP2: 新世代MOP GroovyのMOPを再設計する取り組み  MOPの実装が複雑になりすぎたことへの反省  Java7のInvokeDynamicに対応  できれば最適化はJVMに任せたい Groovy2.0(現在beta)に一部取り込まれる予 定 InvokeDynamic対応はindyブランチで開発中  https://github.com/groovy/groovy-core/tree/indy8
  9. 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. 10. まだ道半ばですね・・・10
  11. 11. 参考: Blackdrags View indy対応のメインコントリビューターの覚書  http://blackdragsview.blogspot.com/2012/01 /invokedynamic-api.html APIリファレンスだけでは分かりづらい箇所や 使い方のコツなど、Groovyへの実装によって 得られた知見がまとめられている11
  12. 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. 13. GEP8: Static type checking@TypeCheckedvoid 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. 14. GEP10: Static compilation@groovy.transform.CompileStaticint 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
  15. 15. まとめ Groovy 2.0 Groovy as Dynamic Java indyGroovy 1.6 1.8 1.5 grumpy Call Siteキャッシュ experimental- (Dynamic&Static) static- Groovy compiler as Better Java15
  16. 16. ご静聴ありがとうございました16

×