Weitere ähnliche Inhalte
Ähnlich wie InvokeDynamic at #shikadriven 2012
Ähnlich wie InvokeDynamic at #shikadriven 2012 (10)
InvokeDynamic at #shikadriven 2012
- 2. #shikadriven@能楽堂
絶賛
幽霊部員
@tan_go238/JVM/ぬる舗/迷子 なう!
関西Javaエンジニアの会/京都JAWS-UG
COPYRIGHT 2012 PLUGRAM, inc.
12年4月30日月曜日
- 3. #shikadriven@能楽堂
「InvokeDynamic」で知るべき 3- つのこと
① Javaがどうやって動いているか
② InvokeDynamicの基本
③ JVM上で動作する動的言語
COPYRIGHT 2012 PLUGRAM, inc.
12年4月30日月曜日
- 5. #shikadriven@能楽堂
ソースコードが実行されるまで
① ② ③
Class
Java Class
JVM
中間ファイル
ソースコード 実行
(バイナリ)
COPYRIGHT 2012 PLUGRAM, inc.
12年4月30日月曜日
- 7. #shikadriven@能楽堂
MyObj example() {
MyObj o = new MyObj();
Javaソースコード int i = o.exe();
return silly(o, i);
}
javap -c -verbose ...
MyObj example();
0: new #16; //class MyObj
3: dup
4: invokespecial #18; //Method MyObj."<init>":()V
7: astore_1
8: aload_1
Classファイルを 9: invokevirtual #19; //Method MyObj.exe:()I
解析した結果 12: istore_2
13: aload_0
14: aload_1
15: iload_2
16: invokevirtual #23; //Method silly:(LMyObj;I)LMyObj;
19: areturn
COPYRIGHT 2012 PLUGRAM, inc.
12年4月30日月曜日
- 8. #shikadriven@能楽堂
aload_0 とか invokevirtual ってなんなの??
COPYRIGHT 2012 PLUGRAM, inc.
12年4月30日月曜日
- 9. #shikadriven@能楽堂
Java仮想マシンの命令セット
invokespecial #19; //Method MyObj.exe:()I
ニーモニック オペランド
【invokespecial】
インスタンスメソッドを呼び出す
COPYRIGHT 2012 PLUGRAM, inc.
12年4月30日月曜日
- 10. #shikadriven@能楽堂
Java仮想マシンの命令セット
ワイルドだぜぇ
Java7では、Java仮想マシンの命令セットに
invokedynamic という命令セットが追加された
COPYRIGHT 2012 PLUGRAM, inc.
12年4月30日月曜日
- 11. #shikadriven@能楽堂
メソッド実行時のJVM内部の動作
MyObj example(); オペランドスタック ローカル変数
0: new #16; //class MyObj
3: dup
4: invokespecial #18; //Method MyObj."<init>":()V
7: astore_1
8: aload_1
9: invokevirtual #19; //Method MyObj.exe:()I
12: istore_2
13: aload_0
14: aload_1
15: iload_2
16: invokevirtual #23; //Method silly:(LMyObj;I)LMyObj; *MyObj this
19: areturn
※オペランドスタック…Java仮想マシンの作業用領域
※ローカル変数…各フレーム毎に保持される変数の配列
※他に実行時コンスタントプールがある
COPYRIGHT 2012 PLUGRAM, inc.
12年4月30日月曜日
- 12. #shikadriven@能楽堂
メソッド実行時のJVM内部の動作
MyObj example(); オペランドスタック ローカル変数
0: new #16; //class MyObj
3: dup
4: invokespecial #18; //Method MyObj."<init>":()V
7: astore_1
8: aload_1
9: invokevirtual #19; //Method MyObj.exe:()I
12: istore_2
13: aload_0
14: aload_1 *MyObj
15: iload_2
16: invokevirtual #23; //Method silly:(LMyObj;I)LMyObj; *MyObj this
19: areturn
※オペランドスタック…Java仮想マシンの作業用領域
※ローカル変数…各フレーム毎に保持される変数の配列
※他に実行時コンスタントプールがある
COPYRIGHT 2012 PLUGRAM, inc.
12年4月30日月曜日
- 13. #shikadriven@能楽堂
メソッド実行時のJVM内部の動作
MyObj example(); オペランドスタック ローカル変数
0: new #16; //class MyObj
3: dup
4: invokespecial #18; //Method MyObj."<init>":()V
7: astore_1
8: aload_1
9: invokevirtual #19; //Method MyObj.exe:()I
12: istore_2
13: aload_0
14: aload_1
15: iload_2
16: invokevirtual #23; //Method silly:(LMyObj;I)LMyObj; *MyObj this
19: areturn
※オペランドスタック…Java仮想マシンの作業用領域
※ローカル変数…各フレーム毎に保持される変数の配列
※他に実行時コンスタントプールがある
COPYRIGHT 2012 PLUGRAM, inc.
12年4月30日月曜日
- 14. #shikadriven@能楽堂
メソッド実行時のJVM内部の動作
MyObj example(); オペランドスタック ローカル変数
0: new #16; //class MyObj
3: dup
4: invokespecial #18; //Method MyObj."<init>":()V
7: astore_1
8: aload_1
9: invokevirtual #19; //Method MyObj.exe:()I
12: istore_2
13: aload_0
14: aload_1 *MyObj
15: iload_2
16: invokevirtual #23; //Method silly:(LMyObj;I)LMyObj; this
19: areturn
※オペランドスタック…Java仮想マシンの作業用領域
※ローカル変数…各フレーム毎に保持される変数の配列
※他に実行時コンスタントプールがある
COPYRIGHT 2012 PLUGRAM, inc.
12年4月30日月曜日
- 15. #shikadriven@能楽堂
メソッド実行時のJVM内部の動作
MyObj example(); オペランドスタック ローカル変数
0: new #16; //class MyObj
3: dup
4: invokespecial #18; //Method MyObj."<init>":()V
7: astore_1
8: aload_1
9: invokevirtual #19; //Method MyObj.exe:()I
12: istore_2
13: aload_0
14: aload_1 *MyObj
15: iload_2
16: invokevirtual #23; //Method silly:(LMyObj;I)LMyObj; *MyObj this
19: areturn
※オペランドスタック…Java仮想マシンの作業用領域
※ローカル変数…各フレーム毎に保持される変数の配列
※他に実行時コンスタントプールがある
COPYRIGHT 2012 PLUGRAM, inc.
12年4月30日月曜日
- 16. #shikadriven@能楽堂
メソッド実行時のJVM内部の動作
MyObj example(); オペランドスタック ローカル変数
0: new #16; //class MyObj
3: dup
4: invokespecial #18; //Method MyObj."<init>":()V
7: astore_1
8: aload_1
9: invokevirtual #19; //Method MyObj.exe:()I
12: istore_2
13: aload_0
14: aload_1 *MyObj
15: iload_2
16: invokevirtual #23; //Method silly:(LMyObj;I)LMyObj; int this
19: areturn
※オペランドスタック…Java仮想マシンの作業用領域
※ローカル変数…各フレーム毎に保持される変数の配列
※他に実行時コンスタントプールがある
COPYRIGHT 2012 PLUGRAM, inc.
12年4月30日月曜日
- 17. #shikadriven@能楽堂
メソッド実行時のJVM内部の動作
MyObj example(); オペランドスタック ローカル変数
0: new #16; //class MyObj
3: dup
4: invokespecial #18; //Method MyObj."<init>":()V
7: astore_1
8: aload_1
9: invokevirtual #19; //Method MyObj.exe:()I
12: istore_2 int
13: aload_0
14: aload_1 *MyObj
15: iload_2
16: invokevirtual #23; //Method silly:(LMyObj;I)LMyObj; this
19: areturn
※オペランドスタック…Java仮想マシンの作業用領域
※ローカル変数…各フレーム毎に保持される変数の配列
※他に実行時コンスタントプールがある
COPYRIGHT 2012 PLUGRAM, inc.
12年4月30日月曜日
- 18. #shikadriven@能楽堂
メソッド実行時のJVM内部の動作
MyObj example(); オペランドスタック ローカル変数
0: new #16; //class MyObj
3: dup
4: invokespecial #18; //Method MyObj."<init>":()V
7: astore_1
8: aload_1
9: invokevirtual #19; //Method MyObj.exe:()I
12: istore_2 int
13: aload_0
14: aload_1 *MyObj
15: iload_2
16: invokevirtual #23; //Method silly:(LMyObj;I)LMyObj; this this
19: areturn
※オペランドスタック…Java仮想マシンの作業用領域
※ローカル変数…各フレーム毎に保持される変数の配列
※他に実行時コンスタントプールがある
COPYRIGHT 2012 PLUGRAM, inc.
12年4月30日月曜日
- 19. #shikadriven@能楽堂
メソッド実行時のJVM内部の動作
MyObj example(); オペランドスタック ローカル変数
0: new #16; //class MyObj
3: dup
4: invokespecial #18; //Method MyObj."<init>":()V
7: astore_1
8: aload_1
9: invokevirtual #19; //Method MyObj.exe:()I
12: istore_2 int
13: aload_0
14: aload_1 *MyObj *MyObj
15: iload_2
16: invokevirtual #23; //Method silly:(LMyObj;I)LMyObj; this this
19: areturn
※オペランドスタック…Java仮想マシンの作業用領域
※ローカル変数…各フレーム毎に保持される変数の配列
※他に実行時コンスタントプールがある
COPYRIGHT 2012 PLUGRAM, inc.
12年4月30日月曜日
- 20. #shikadriven@能楽堂
メソッド実行時のJVM内部の動作
MyObj example(); オペランドスタック ローカル変数
0: new #16; //class MyObj
3: dup
4: invokespecial #18; //Method MyObj."<init>":()V
7: astore_1
8: aload_1
9: invokevirtual #19; //Method MyObj.exe:()I
12: istore_2 int int
13: aload_0
14: aload_1 *MyObj *MyObj
15: iload_2
16: invokevirtual #23; //Method silly:(LMyObj;I)LMyObj; this this
19: areturn
※オペランドスタック…Java仮想マシンの作業用領域
※ローカル変数…各フレーム毎に保持される変数の配列
※他に実行時コンスタントプールがある
COPYRIGHT 2012 PLUGRAM, inc.
12年4月30日月曜日
- 21. #shikadriven@能楽堂
メソッド実行時のJVM内部の動作
MyObj example(); オペランドスタック ローカル変数
0: new #16; //class MyObj
3: dup
4: invokespecial #18; //Method MyObj."<init>":()V
7: astore_1
8: aload_1
9: invokevirtual #19; //Method MyObj.exe:()I
12: istore_2 int
13: aload_0
14: aload_1 *MyObj
15: iload_2
16: invokevirtual #23; //Method silly:(LMyObj;I)LMyObj; *MyObj this
19: areturn
※オペランドスタック…Java仮想マシンの作業用領域
※ローカル変数…各フレーム毎に保持される変数の配列
※他に実行時コンスタントプールがある
COPYRIGHT 2012 PLUGRAM, inc.
12年4月30日月曜日
- 22. #shikadriven@能楽堂
メソッド実行時のJVM内部の動作
MyObj example(); オペランドスタック ローカル変数
0: new #16; //class MyObj
3: dup
4: invokespecial #18; //Method MyObj."<init>":()V
7: astore_1
8: aload_1
9: invokevirtual #19; //Method MyObj.exe:()I
12: istore_2 起動側フレームのスタック int
へとプッシュされる
13: aload_0
14: aload_1 *MyObj
15: iload_2
16: invokevirtual #23; //Method silly:(LMyObj;I)LMyObj; *MyObj this
19: areturn
※オペランドスタック…Java仮想マシンの作業用領域
※ローカル変数…各フレーム毎に保持される変数の配列
※他に実行時コンスタントプールがある
COPYRIGHT 2012 PLUGRAM, inc.
12年4月30日月曜日
- 23. #shikadriven@能楽堂
詳しくは
Java仮想マシン仕様
または「やきに駆動」の資料
http://slidesha.re/se1Hun
COPYRIGHT 2012 PLUGRAM, inc.
12年4月30日月曜日
- 25. #shikadriven@能楽堂
InvokeDynamicとは
簡単に言えば
型情報をもつ関数のポインタ
JVM上で動作する動的言語のために追加
COPYRIGHT 2012 PLUGRAM, inc.
12年4月30日月曜日
- 26. #shikadriven@能楽堂
InvokeDynamicの基本
invokedynamic
bootstrapメソッド
(初回時)
CallSite
実行
MethodHandle 対象のメソッド
COPYRIGHT 2012 PLUGRAM, inc.
12年4月30日月曜日
- 27. #shikadriven@能楽堂
InvokeDynamicの基本
invokedynamic
bootstrapメソッド
(初回時)
CallSite
実行
MethodHandle 対象のメソッド
COPYRIGHT 2012 PLUGRAM, inc.
12年4月30日月曜日
- 28. #shikadriven@能楽堂
CallSite
MethodHandleの参照を保持する
ConstantCallSite MHは書き換えられない
MutableCallSite MHが書き換えられる
MHが書き換えられる
VolatileCallSite
Volatileである
COPYRIGHT 2012 PLUGRAM, inc.
12年4月30日月曜日
- 29. #shikadriven@能楽堂
InvokeDynamicの基本
invokedynamic
bootstrapメソッド
(初回時)
CallSite
実行
MethodHandle 対象のメソッド
COPYRIGHT 2012 PLUGRAM, inc.
12年4月30日月曜日
- 30. #shikadriven@能楽堂
MethodHandle
MHを合成したり、引数を部分適用したりして、
対象のメソッドを呼び出す
MethodHandle#bindTo 第1引数のレシーバを固定
MethodHandles#insertArguments 引数を部分適用したMHを生成
test, then, elseの3MHを合成して
MethodHandles#guardWithTest
実行時に分岐するMH
MethodHandles#filterReturnValue 処理の戻り値に後処理を加えるMH
COPYRIGHT 2012 PLUGRAM, inc.
12年4月30日月曜日
- 33. #shikadriven@能楽堂
JVM上で動作する動的言語とは
ここで グルービー のロゴ入れとけば
後でgdgd言われない!
COPYRIGHT 2012 PLUGRAM, inc.
12年4月30日月曜日
- 34. #shikadriven@能楽堂
JVM上の動的言語の問題点
コンパイラの恩恵を受けにくい
JITコンパイルは実行時に必要に応じて以下のような最適化を行う
・インライン展開
・ループ展開
・ロック解除
・デッドコード削除
・エスケープ解析
COPYRIGHT 2012 PLUGRAM, inc.
12年4月30日月曜日
- 35. #shikadriven@能楽堂
DynamicInvokeがないとき
これらの最適化の処理を処理系がやっていた
・いろいろ大変
・その割に速度がでない
etc..
COPYRIGHT 2012 PLUGRAM, inc.
12年4月30日月曜日
- 36. #shikadriven@能楽堂
DynamicInvokeがあるとき
JVMにおまかせ!
ただし、JVMに最適化されるように
・Javaのコードは極力入れない
・MHの再検索を極力減らす
などといったことに注意する
COPYRIGHT 2012 PLUGRAM, inc.
12年4月30日月曜日
- 37. まとめ
InvokeDynamicを使うと...
・呼び出すメソッドを動的に切り替えられる
・呼び出すメソッドを独自のルールで検索し実行できる
・JITコンパイルに最適化される
12年4月30日月曜日