にroovy う&ふゅーち ー
それから にroovy
GCR 16th
NTT ソフ ア上原潤二
2009/1/15
にroovyイン・ア ョン(にinA)
デ 国内初 にィんんvオ解説書が翻訳き
デ “ 本“
デ 対応にィんんvオ ー ョン
–原書 にィんんvオ さ.ごベー
– ン ー にィんんvオ さ.す.じ 動作 う 緻密 修正
–にィんんvオ さ.ご 後 実装 機能 い 基本的 追記 い
本発表 そ 説明
にroovy年表
2003 2004 2005
2006 2007 2008
12月
▲ 1.5.0
2月
▲ 1.5.4 2月
▲ 1.0
4月
▲ 1.1b2 12月
▲ 1.0b8
8月 3月
▲ 1.0b4
JSR化
2月
▲ 1.0b10
JSR EA
7月
▲
1.0 JSR-6
12月
▲ 1.5.7 1.6-rc1
本日 対象
Grails 0.5.6 Grails 1.0 1.1b2
1.1b1
GinA本対象
にroovy さ.さ さ.5 関係
デ さ.さbさ, さ.さb2, ・・・, さ.さ-Rでさ,
–のava “すナ 機能取 込
さ.5
機能 ⼤幅
–さ.さ正式版 存在 い
–本資料 さ.さ さ.す 新機能
ー 表⽰
– さ.ず機能
From 1 .1 1 .5
From 1 .6
にroovy さ.さ=さ.5 主 機能
デ のava す対応
– ー ョン利⽤
– らをumが ン ー らをum ×
– 可変個数引数 – イtatろょ ろmpんィt – にらをらィろょイ
– 共変 戻 値
デ ⾔語仕様
– エ ビ 演算⼦ – りんィがたたき形式 ー
– 名前付 引数 関数呼 出 括弧省略
デ ョ ン ン
デ どxpaをよん Mらta で」aイイ がどMでき
デ 性能向上,buるりろx,改良,らtょ,らtょ, From 1 .1 1 .5
にroovy さ.6 主 機能
デ ⾔語仕様
– チ代⼊ 多重代⼊
– 分岐 ィらtuィを省略可 – ASへ変換
– にィんんvオ ー ョン定義
デ 動的 振 舞い 関
– のava ン タン Mらtaで」aイイ – どMで とSば
– 実⾏時Mろxろを
デ : Swろをる てuろ」よらィ 改善
デ ー : にィapら デ 性能向上
デ buるりろx,改良,らtょ,らtょ From 1 .6
ベン ー
ベン ー !
デ へれら でんmputらィ ばaをるuaるら
てらをょれmaィ「イ にamら
–A「a “イれんんtんutナ
– ベンチ ー
デ 抜粋 実施
そ 前
デ 速度 わ ?
– ン 速く
–にィんんvオ あ 遅い
のava 書 直 い
そ く簡単
デ 処理系速度 体感速度 対 ⽀配的
限 い
– Iび 性能 ⽀配的 場合
デ –にィんんvオ同⼠ ⾯⽩ う
にroovy さ.さbetaしをさ た速度⽐
にroovy さ.5.6をさ た速度⽐
感想 感覚的 す
デ にィんんvオ さ.ず ソ ー 爆
速 が理由 後述き
デ のRubオ 同等が 上き
デ のVM上 ⾔語 共通 特徴
–起動 遅い
– ⽐較的⾷う
From 1 .1 1 .5
From 1 .1 1 .5
エルビ 演算⼦(Elvis Operator)
デ 三項演算⼦
A ? て : で
ろり がAき { て } ら」イら { で } 次 等価
デ エ ビ 演算⼦
A ?: て
次 等価
ろり がAき { A } ら」イら { て }
※GCC 独自拡張 由来
エルビ 演算⼦(Elvis Operator)
ョイン コンパイラ
デ にィんんvオ のava ー 相互依存 い
ン 可能
ょ」aイイ A { } て bた
ょ」aイイ て らxtらをよイ A {}
デ 内部 にィんんvオ タ が
ソ 本体 削除 き ⽣成
のava ン 起動
デ るィんんvオょ -j ョン 実⾏
From 1 .1 1 .5
ExpandoMetaでlass (EMで)
デ ー 代⼊
ソ 様 扱え
Stィろをる.mらtaょ」aイイ.れら」」ん ち { pィろをt」を “れら」」んナ+よら」らるatら }
“wんィ」よナ.れら」」んがき ここ れら」」んwんィ」よ 出⼒
デ 簡便 動的 ソ 定義
デ pィんtんtオpら 同様 にィんんvオ
ベー びびP ⼆本⽴
どMで 後付け
From 1 .1 1 .5From 1 .6
でall Siteキャッ ュ,でall Site最適化
デ 性能向上 主因
– ソ ー 遅い ←にィんんvオ 遅
⼤半 説明
デ 動的 ソ 呼 出 先⽴ ソ
探索 キ ュ
–動的⾔語 効果 ⼤ –のRubオ 先達
– ⾃体 古く あ
デ のVM上 極 有効が後述き From 1 .6
動的メソッ 呼び出 概念フロー
x = new X() x.foo()
呼び出 側ク ス
ソッ 探索
Class X {
def foo() { }
Groovyク スX
Pogo呼び出
Pogo …Plain Old Groovy Object
動的メソッ 呼び出 概念フロー
x = new X() x.foo()
呼び出 側ク ス
ソッ 探索
Class X {
}
Groovyク スX
タク ス ソッ 呼び出
‘foo’ = { }
X タク ス
問題 メソッ 探索 コ
デ 探索時 以下 判定 ⾏う必要 あ
–PんjんこPんるん ソ ? – タ 定義 ソ っ
デ タ っ
デ ン タン タ っ
– 参照 っ
– ン タ呼 出 っ
– ンタセ 可能 っ –Statろょ う っ
:
明ら
重い
でall Site でache (さ回⽬)
x = new X() x.foo()
呼び出 側ク ス
ソッ 探索
Class X {
}
Groovyク スX
CallSite
‘foo’ = { }
X タク ス
PogoMetaClassSite インスタンス 保存
※CallSite SoftReference 保持さ く っ ら解放さ
でall Site でache (ざ回⽬)
x = new X() x.foo()
呼び出 側ク ス
Class X {
}
Groovyク スX
CallSite
‘foo’ = { }
X タク ス
保存さ
PogoMetaClassSite インスタンス call()
※実際 呼び出 複数あ 配列CallSiteArray 保持
※意味 動的 変わっ らCallSite インスタンス 差 替え
自分 自分 置 換え コ 的 こ やや面白い
でall Site最適化ま
デ がさき ソ 探索 2回⽬以降削減
デ が2きのIへ ン ン展開 道 開く
– ン語 ベ 展開 い 私
確認 がびpらを のとは 確認可き
⾮常 効果 ⾼いが連鎖的展開 導くき
– ン ン展開 関 HんtSpんt 極 強⼒
デ 状況変わ
とらんptろmろカatろんをが最適化戻 き
デ がしき特定 タ ソ い ⾃分専⽤
速いでa」」 Sろtら ⽣成
– とらりau」tにィんんvオMらtれんよ#aよよろtろんをa」イ参照
にrape:依存 ラ ⾃動 ウンロー
デ MavらをこRubオにらmイ い
ベー ュー 管理
–Apaょれら Ivオベー
–にィんんvオ ベ 標準基本機能 実現
–必要 このaィ 実⾏時 取
–依存関係 あ 連鎖的 のaィ 取 く –にィaろ」イ P」uるろを う 実⾏時 ュー
機構 含 い
デ 効⽤: にィんんvオ 配布 容易
From 1 .6
From 1 .6
にrape使い⽅
デ ー ョン
デ ソ 呼 出
にィapら.るィabがるィんup:かんィる.jろよらイんりtか, mんよu」ら:かjろよら- んイイか, vらィイろんを:かみ2.2.ご,きかき
デ グるィapらグ ン
import org.junit.*
@Grab(group = 'junit', module='junit', version='*') public class GrapeTestSub {
String testMethod() { Assert.class.name }
}
のavaイン ン Metaでlass
デ 例:イ ち “xxxナた
イ.mらtaで」aイイ.a ち { pィろをt」を "れんるら"} イ.aがき
ここ れんるら 出⼒
– にィんんvオ 可能
– のava Mらtaで」aイイ 元々あ
デ 参考: Mらtaで」aイイ
Stィろをる.mらtaで」aイイ.xち{pィろをt」を “れんるらナ }
“abょナ.xがき
ここ れんるら 出⼒ From 1 .6
AST変換
デ ASへ …抽象構⽂⽊
– ン 中 ン 内 作
中間 ータ構造
デ ASへ変換
– 指定 ー ョン 与え 規則 従
ン 時 ASへ 変換 ⾔語機能
加⼯・追加
– ン ターン指向 ン
– ン ソー 修正 ⾔語機能追加
– 定義 結構難 そうがVろイろtんィ き – 利⽤ 簡単
From 1 .6
AST変換 例
更新伝播がjava.bらaをイ. PィんpらィtオでれaをるらSuppんィt使⽤き
つてろをよab」らこつVらtんab」ら
をらw Iをtらるらィがすき 書け ン タン ⽣成 が未実装っき
つひらwろりオ
paょ「aるら ー 指定 ー い 動い い う
い ? つPaょ「aるらSょんpら
ソ ン
時 mろxろを
@でategory / @Mixin
怠惰がばaカろ」オき 初期化
@Lazy
委譲がよら」らるatろんをき ターン 透過的 実現
@とelegate
ン タン ⽣成後 変更 禁⽌
@Immutable
ン ン 変換
@Singleton
説明 アノテー ョン
AST変換: @Singleton
つSろをる」らtんを ょ」aイイ なんん {
よらり れら」」んがき { pィろをt」を "れら」」ん" }
}なんん.ろをイtaをょら.れら」」んがき ここ ン ン参照
a ち をらw なんんがき ここ をらw ン タン ⽣成不可 どRRびR
java.」aをる.Ruをtろmらどxょらptろんを: でaをかt ろをイtaをtろatら イろをる」らtんを なんん. べイら
なんん.ろをイtaをょら
AST変換: @Immutable
つImmutab」ら final ょ」aイイ なんん { Stィろをる x, オ
}a ち をらw なんんが"a","b"き
a.x ち “れんるらナ 値 変更
どRRびR
るィんんvオ.」aをる.Rらaよびを」オPィんpらィtオどxょらp tろんを: でaををんt イらt ィらaよんを」オ pィんpらィtオ: x
AST変換: @とelegate
ろmpんィt java.utろ」.ょんをょuィィらをt.」んょ「イ.* ょ」aイイ ばんょ「ab」らMap {
つとら」らるatら pィろvatら Map map ち み:め つとら」らるatら pィろvatら ばんょ「 」んょ「 ち をらw
Rららをtィaをtばんょ「 がき
}ィらイ ち をらw ばんょ「ab」らMapがき
ィらイ.」んょ「 がき ばんょ「 振舞う
tィオ {
ィらイ.a ち ご Map 振舞う } りろをa」」オ {
ィらイ.uを」んょ「 がき
} ※Map Lock implementsも
AST変換: @Lazy
ょ」aイイ ばaカオへらイt {
つばaカオ ばろイt イさ ち{pィろをt」を "イさ ろをろtろa」ろカろをる"た みさ,2,しめ }がきた ばろイt イ2 ち {pィろをt」を "イ2 ろをろtろa」ろカろをる"た みじ,す,ずめ }がきた
}x ち をらw ばaカオへらイtがき
ここ イ2 ろをろtろa」ろカろをる イさ 初期化 遅延
pィろをt」を x.イさ イさ 参照 初期化実⾏ ここ イさ ろをろtろa」ろカろをる
ここ みさ, 2, しめ 出⼒ pィろをt」を x.イ2
ここ みじ, す, ずめ 出⼒
AST変換: @でategory/@Mixin
ろをtらィりaょら Mろxらよ { }
つでatらるんィオがMろxらよき ょ」aイイ でatで」aイイ { よらり れら」」んがき { pィろをt」を "れら」」ん" }
}
つMろxろをがでatで」aイイき
ょ」aイイ Mオで」aイイ ろmp」らmらをtイ Mろxらよ { }
x ち をらw Mオで」aイイがき x.れら」」んがき
※interface Mixed 意義 不明 ら 処理上 マ カ ?
動的 Mixinメソッ 呼び出
Stィろをる.mろxろを とatら
aイイらィt "a".るらtへろmらがき ちち さ2しさせず。すじすじすさ
From 1 .6
整理: ま ま 機能注⼊ ⽅法
タン/ ン 実⾏時
ー 群
どMで とSば
ー ー ン
時 ⾏わ 処
理内容 実⾏時 決定可 ソ 呼 出
対応 処理 MびPがろをvん「らMらtれんよ,mら
tれんよMろイイろをるき
ン タン 実⾏時
ソ 呼 出 前後 処理 ンターセ タ
ン タン 実⾏時
ー どxpaをよん
実⾏時
ン 時
ン 時
実⾏時
にィんんvオ処理系 ン 時
実⾏時がuイら⽂実⾏時き
ン 時
ン 時
注⼊ イ ン
ソ 群
継承
ソ 群っ とら」らるatら ー ョン
ソ
ソ 書く
ソ 群
Mろxろを ー ョン
イtatろょ ソ 群 でatらるんィオこuイら
ソ 群
Mろxろを ソ 呼 出
がのavaき イtatろょ ソ 群
とらりau」tにィんんvオMらtれんよイ .javaがとにMき
タン/ ン ー
どxpaをよんMらtaで」aイイがどM でき
対象 注⼊単位
名称
1.1 1.5 1.6
ル 代⼊ 多重代⼊
よらり がa, bき ち みさ,2め
よらり がろをt ろ, Stィろをる jき ち みさ, かにィんんvオかめ よらり a, b
がa, bき ち りuをょがき
デ 要素 余 捨 ⾜
をu」」 補填
From 1 .6
分岐 return省略可
よらり らvらをがxき {
ろり がx % 2 ちち ごき { tィuら } ら」イら { りa」イら } }aイイらィt らvらをが2き ちち tィuら
aイイらィt らvらをがさき ちち りa」イら
デ wれろ」ら⽂ 最終評価式 値
い う
From 1 .6
EMで とSL
デ 逐次 代⼊ く
⼀気 定義
Stィろをる.mらtaで」aイイ.よらりろをら {
りんん { イ-> pィろをt」を イ + よら」らるatら } baィ { pィろをt」を “れら」」んナ }
}“wんィ」よナ.りんんが“れaろナき ここ れaろwんィ」よ 出⼒
“abょナ.baィがき ここ れら」」ん 出⼒
From 1 .6
※効用: 逐次代入 途中 未完成状態 ク ス 生 ら?
ま
ま : にroovy ⽬指す
デ のava せ く 今 にィんんvオ
⾔語機能拡張 ン
–のava せ ー が案き ⼿ く複雑
そう 正直 い
デ “のava ろイ でびてびばナっそう あ い
“のava ろイ Cナ
– ン 住 分け
デ にィんんvオ のVM上 ー
ン 別記法
デ のava+にィんんvオ 2 ⼀ 技術
参考文献
• http://glaforge.free.fr/weblog/index.php?itemid=241
• http://www.nabble.com/DGM-and-GDoc- to14985262.html#a14985262
• http://blog.headius.com/2008/05/power-of-jvm.html
• http://glaforge.free.fr/weblog/index.php?itemid=99
• http://glaforge.free.fr/weblog/index.php?itemid=256
• http://www.infoq.com/jp/articles/groovy-1.5-new‘
• http://shootout.alioth.debian.org/
• http://d.hatena.ne.jp/masanobuimai/20081224/1230123639
• http://docs.codehaus.org/display/GROOVY/Grape
• http://docs.codehaus.org/pages/viewrecentblogposts.action?k ey=GROOVY
• http://shemnon.com/speling/2008/04/bindable-observable- properties.html