Groovy indy 20120222

16
Groovyindy 2012/2/22 @JJUG Night Seminar JJUG幹事/ JGGUGサポートスタッフ 須江 信洋 http://twitter.com/nobusue http://d.hatena.ne.jp/nobusue 資料の内容は個人としての意見・見解を述べたものであり、 所属する企業・組織が内容を保証するものではありません。

description

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

Transcript of Groovy indy 20120222

Page 1: Groovy indy 20120222

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

自己紹介

須江 信洋(すえ のぶひろ) Twitter: @nobusue

http://www.facebook.com/profile.php?id=732337788

かれこれ10年ほどJavaEE関連の仕事をしてます

G*(Groovy関連技術)との関わり Groovyコミュニティ(JGGUG)サポートスタッフ

「プログラミングGROOVY」執筆チーム

「Groovy イン・アクション」翻訳チーム

言語実装経験ありません・・・

2

Page 3: Groovy indy 20120222

本日のお題

Groovyのメソッド呼出しの仕組み(概要)

GroovyのInvokeDynamic対応(indy branch)

Groovyの静的型対応

3

Page 4: Groovy indy 20120222

Groovyとは

Javaと親和性の高いJVM言語 Javaと(ほぼ)上位互換の文法

+リスト/マップリテラル、クロージャ、etc Javaで冗長になりがちな処理を簡潔に書ける

Javaのクラス⇔Groovyのクラス

スクリプト言語 コンパイル不要、ソースのまま実行可能

内部的にクラスファイルを自動生成(インタープリターではない)

groovycコマンドで明示的なクラスファイル生成も可能

動的言語 MOP(Meta Object Protocol)、ExpandoMetaClass

BuilderやDynamic Finderなどの実装が容易

4

Page 5: Groovy indy 20120222

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

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

メソッド呼出し効率の改善

Call Siteキャッシュ 動的メソッド呼出しに伴うメソッド探索結果をキャッシュして再利用

Groovy 1.6から導入

かなりの高速化を達成

7

Page 8: Groovy indy 20120222

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

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

まだ道半ばですね・・・

10

Page 11: Groovy indy 20120222

参考: Blackdrag's View

indy対応のメインコントリビューターの覚書 http://blackdragsview.blogspot.com/2012/01/invokedynamic-api.html

APIリファレンスだけでは分かりづらい箇所や使い方のコツなど、Groovyへの実装によって得られた知見がまとめられている

11

Page 13: Groovy indy 20120222

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

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

まとめ

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

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

16