SlideShare ist ein Scribd-Unternehmen logo
1 von 38
Downloaden Sie, um offline zu lesen
鹿駆動勉強会@能楽堂

     5分でわかる!? InvokeDynamic




12年4月30日月曜日
#shikadriven@能楽堂




                                                                         絶賛
                                                                       幽霊部員
                                              @tan_go238/JVM/ぬる舗/迷子     なう!

                                             関西Javaエンジニアの会/京都JAWS-UG




              COPYRIGHT 2012 PLUGRAM, inc.




12年4月30日月曜日
#shikadriven@能楽堂




     「InvokeDynamic」で知るべき 3- つのこと



                         ① Javaがどうやって動いているか

                         ② InvokeDynamicの基本

                         ③ JVM上で動作する動的言語




              COPYRIGHT 2012 PLUGRAM, inc.




12年4月30日月曜日
#shikadriven@能楽堂




                                         Javaの動作原理




              COPYRIGHT 2012 PLUGRAM, inc.




12年4月30日月曜日
#shikadriven@能楽堂




      ソースコードが実行されるまで


                           ①                   ②      ③
                                                      Class
                         Java                 Class
                                                      JVM

                                             中間ファイル
                 ソースコード                               実行
                                             (バイナリ)




              COPYRIGHT 2012 PLUGRAM, inc.




12年4月30日月曜日
#shikadriven@能楽堂




      ソースコード




              COPYRIGHT 2012 PLUGRAM, inc.




12年4月30日月曜日
#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日月曜日
#shikadriven@能楽堂




               aload_0 とか invokevirtual ってなんなの??




              COPYRIGHT 2012 PLUGRAM, inc.




12年4月30日月曜日
#shikadriven@能楽堂




      Java仮想マシンの命令セット


         invokespecial                       #19;   //Method MyObj.exe:()I



              ニーモニック                         オペランド


       【invokespecial】
        インスタンスメソッドを呼び出す




              COPYRIGHT 2012 PLUGRAM, inc.




12年4月30日月曜日
#shikadriven@能楽堂




      Java仮想マシンの命令セット

                                             ワイルドだぜぇ



     Java7では、Java仮想マシンの命令セットに

     invokedynamic という命令セットが追加された




              COPYRIGHT 2012 PLUGRAM, inc.




12年4月30日月曜日
#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日月曜日
#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日月曜日
#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日月曜日
#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日月曜日
#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日月曜日
#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日月曜日
#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日月曜日
#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日月曜日
#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日月曜日
#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日月曜日
#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日月曜日
#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日月曜日
#shikadriven@能楽堂




              詳しくは

              Java仮想マシン仕様



              または「やきに駆動」の資料

              http://slidesha.re/se1Hun

              COPYRIGHT 2012 PLUGRAM, inc.




12年4月30日月曜日
#shikadriven@能楽堂




                      InvokeDynamicの基本




              COPYRIGHT 2012 PLUGRAM, inc.




12年4月30日月曜日
#shikadriven@能楽堂




      InvokeDynamicとは



                      簡単に言えば

                       型情報をもつ関数のポインタ



                     JVM上で動作する動的言語のために追加


              COPYRIGHT 2012 PLUGRAM, inc.




12年4月30日月曜日
#shikadriven@能楽堂




      InvokeDynamicの基本

                                             invokedynamic

       bootstrapメソッド
              (初回時)
                                                CallSite


                                                             実行
                                             MethodHandle         対象のメソッド

              COPYRIGHT 2012 PLUGRAM, inc.




12年4月30日月曜日
#shikadriven@能楽堂




      InvokeDynamicの基本

                                             invokedynamic

       bootstrapメソッド
              (初回時)
                                                CallSite


                                                             実行
                                             MethodHandle         対象のメソッド

              COPYRIGHT 2012 PLUGRAM, inc.




12年4月30日月曜日
#shikadriven@能楽堂




      CallSite

              MethodHandleの参照を保持する


                  ConstantCallSite           MHは書き換えられない


                    MutableCallSite          MHが書き換えられる

                                             MHが書き換えられる
                     VolatileCallSite
                                               Volatileである



              COPYRIGHT 2012 PLUGRAM, inc.




12年4月30日月曜日
#shikadriven@能楽堂




      InvokeDynamicの基本

                                             invokedynamic

       bootstrapメソッド
              (初回時)
                                                CallSite


                                                             実行
                                             MethodHandle         対象のメソッド

              COPYRIGHT 2012 PLUGRAM, inc.




12年4月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日月曜日
#shikadriven@能楽堂




                                     JVM上で動作する
                                             動的言語



              COPYRIGHT 2012 PLUGRAM, inc.




12年4月30日月曜日
#shikadriven@能楽堂




      JVM上で動作する動的言語とは




              COPYRIGHT 2012 PLUGRAM, inc.




12年4月30日月曜日
#shikadriven@能楽堂




      JVM上で動作する動的言語とは



          ここで グルービー のロゴ入れとけば

                                      後でgdgd言われない!




              COPYRIGHT 2012 PLUGRAM, inc.




12年4月30日月曜日
#shikadriven@能楽堂




      JVM上の動的言語の問題点

      コンパイラの恩恵を受けにくい

         JITコンパイルは実行時に必要に応じて以下のような最適化を行う


                     ・インライン展開
                     ・ループ展開
                     ・ロック解除
                     ・デッドコード削除
                     ・エスケープ解析




              COPYRIGHT 2012 PLUGRAM, inc.




12年4月30日月曜日
#shikadriven@能楽堂




      DynamicInvokeがないとき

        これらの最適化の処理を処理系がやっていた


                          ・いろいろ大変
                          ・その割に速度がでない
                          etc..




              COPYRIGHT 2012 PLUGRAM, inc.




12年4月30日月曜日
#shikadriven@能楽堂




      DynamicInvokeがあるとき

        JVMにおまかせ!

                   ただし、JVMに最適化されるように


                    ・Javaのコードは極力入れない
                    ・MHの再検索を極力減らす


                   などといったことに注意する


              COPYRIGHT 2012 PLUGRAM, inc.




12年4月30日月曜日
まとめ

       InvokeDynamicを使うと...

              ・呼び出すメソッドを動的に切り替えられる

              ・呼び出すメソッドを独自のルールで検索し実行できる

              ・JITコンパイルに最適化される




12年4月30日月曜日
ありがとうございました!




12年4月30日月曜日

Weitere ähnliche Inhalte

Was ist angesagt?

第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」yoshiaki iwanaga
 
Xtend30分クッキング やきに駆動
Xtend30分クッキング   やきに駆動Xtend30分クッキング   やきに駆動
Xtend30分クッキング やきに駆動Shinichi Kozake
 
Kanazawa.js.Next
Kanazawa.js.NextKanazawa.js.Next
Kanazawa.js.Nextdynamis
 
ジェネリック関数の呼び出され方 #cocoa_kansai
ジェネリック関数の呼び出され方 #cocoa_kansaiジェネリック関数の呼び出され方 #cocoa_kansai
ジェネリック関数の呼び出され方 #cocoa_kansaiTomohiro Kumagai
 
Xtend30分クッキング
Xtend30分クッキングXtend30分クッキング
Xtend30分クッキングShinichi Kozake
 
Swift 2.0 で変わったところ「前編」 #cswift
Swift 2.0 で変わったところ「前編」 #cswiftSwift 2.0 で変わったところ「前編」 #cswift
Swift 2.0 で変わったところ「前編」 #cswiftTomohiro Kumagai
 
Ruby初級者向けレッスン 45回 ─── 例外
Ruby初級者向けレッスン 45回 ─── 例外Ruby初級者向けレッスン 45回 ─── 例外
Ruby初級者向けレッスン 45回 ─── 例外higaki
 
Swift 2.0 の Error Handling #yhios
Swift 2.0 の Error Handling #yhiosSwift 2.0 の Error Handling #yhios
Swift 2.0 の Error Handling #yhiosTomohiro Kumagai
 
プロトコル指向に想う世界観 #__swift__
プロトコル指向に想う世界観 #__swift__プロトコル指向に想う世界観 #__swift__
プロトコル指向に想う世界観 #__swift__Tomohiro Kumagai
 
可変値変数 var を極力避けることを模索するための事前知識 #cswift
可変値変数 var を極力避けることを模索するための事前知識 #cswift可変値変数 var を極力避けることを模索するための事前知識 #cswift
可変値変数 var を極力避けることを模索するための事前知識 #cswiftTomohiro Kumagai
 
【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう
【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう
【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしようYasuhiro Yoshimura
 
はじめてのJPA
はじめてのJPAはじめてのJPA
はじめてのJPAkawaba
 
Ecmascript2015とその周辺について
Ecmascript2015とその周辺についてEcmascript2015とその周辺について
Ecmascript2015とその周辺について豊明 尾古
 
探検!SwiftyJSON
探検!SwiftyJSON探検!SwiftyJSON
探検!SwiftyJSONYuka Ezura
 
Lombokのススメ
LombokのススメLombokのススメ
Lombokのススメなべ
 
オープンソースで作るスマホ文字認識アプリ
オープンソースで作るスマホ文字認識アプリオープンソースで作るスマホ文字認識アプリ
オープンソースで作るスマホ文字認識アプリ陽平 山口
 
OpenCVを用いた画像処理入門
OpenCVを用いた画像処理入門OpenCVを用いた画像処理入門
OpenCVを用いた画像処理入門uranishi
 
DoActionからJava VMバイトコードに変換する話
DoActionからJava VMバイトコードに変換する話DoActionからJava VMバイトコードに変換する話
DoActionからJava VMバイトコードに変換する話emorins
 
ActionScriptを使わないFlash勉強会 #1(前日版)
ActionScriptを使わないFlash勉強会 #1(前日版)ActionScriptを使わないFlash勉強会 #1(前日版)
ActionScriptを使わないFlash勉強会 #1(前日版)libpanda
 

Was ist angesagt? (20)

第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
 
Xtend30分クッキング やきに駆動
Xtend30分クッキング   やきに駆動Xtend30分クッキング   やきに駆動
Xtend30分クッキング やきに駆動
 
Kanazawa.js.Next
Kanazawa.js.NextKanazawa.js.Next
Kanazawa.js.Next
 
ジェネリック関数の呼び出され方 #cocoa_kansai
ジェネリック関数の呼び出され方 #cocoa_kansaiジェネリック関数の呼び出され方 #cocoa_kansai
ジェネリック関数の呼び出され方 #cocoa_kansai
 
Unityで覚えるC#
Unityで覚えるC#Unityで覚えるC#
Unityで覚えるC#
 
Xtend30分クッキング
Xtend30分クッキングXtend30分クッキング
Xtend30分クッキング
 
Swift 2.0 で変わったところ「前編」 #cswift
Swift 2.0 で変わったところ「前編」 #cswiftSwift 2.0 で変わったところ「前編」 #cswift
Swift 2.0 で変わったところ「前編」 #cswift
 
Ruby初級者向けレッスン 45回 ─── 例外
Ruby初級者向けレッスン 45回 ─── 例外Ruby初級者向けレッスン 45回 ─── 例外
Ruby初級者向けレッスン 45回 ─── 例外
 
Swift 2.0 の Error Handling #yhios
Swift 2.0 の Error Handling #yhiosSwift 2.0 の Error Handling #yhios
Swift 2.0 の Error Handling #yhios
 
プロトコル指向に想う世界観 #__swift__
プロトコル指向に想う世界観 #__swift__プロトコル指向に想う世界観 #__swift__
プロトコル指向に想う世界観 #__swift__
 
可変値変数 var を極力避けることを模索するための事前知識 #cswift
可変値変数 var を極力避けることを模索するための事前知識 #cswift可変値変数 var を極力避けることを模索するための事前知識 #cswift
可変値変数 var を極力避けることを模索するための事前知識 #cswift
 
【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう
【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう
【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう
 
はじめてのJPA
はじめてのJPAはじめてのJPA
はじめてのJPA
 
Ecmascript2015とその周辺について
Ecmascript2015とその周辺についてEcmascript2015とその周辺について
Ecmascript2015とその周辺について
 
探検!SwiftyJSON
探検!SwiftyJSON探検!SwiftyJSON
探検!SwiftyJSON
 
Lombokのススメ
LombokのススメLombokのススメ
Lombokのススメ
 
オープンソースで作るスマホ文字認識アプリ
オープンソースで作るスマホ文字認識アプリオープンソースで作るスマホ文字認識アプリ
オープンソースで作るスマホ文字認識アプリ
 
OpenCVを用いた画像処理入門
OpenCVを用いた画像処理入門OpenCVを用いた画像処理入門
OpenCVを用いた画像処理入門
 
DoActionからJava VMバイトコードに変換する話
DoActionからJava VMバイトコードに変換する話DoActionからJava VMバイトコードに変換する話
DoActionからJava VMバイトコードに変換する話
 
ActionScriptを使わないFlash勉強会 #1(前日版)
ActionScriptを使わないFlash勉強会 #1(前日版)ActionScriptを使わないFlash勉強会 #1(前日版)
ActionScriptを使わないFlash勉強会 #1(前日版)
 

Andere mochten auch

Welcome to the AWS Cloud - AWS Symposium 2014 - Washington D.C.
Welcome to the AWS Cloud - AWS Symposium 2014 - Washington D.C. Welcome to the AWS Cloud - AWS Symposium 2014 - Washington D.C.
Welcome to the AWS Cloud - AWS Symposium 2014 - Washington D.C. Amazon Web Services
 
Large scale-olap-with-kobayashi
Large scale-olap-with-kobayashiLarge scale-olap-with-kobayashi
Large scale-olap-with-kobayashiBoundary
 
Charles nutter star techconf 2011 - jvm languages
Charles nutter   star techconf 2011 - jvm languagesCharles nutter   star techconf 2011 - jvm languages
Charles nutter star techconf 2011 - jvm languagesStarTech Conference
 
Evolving Operations for BBC iPlayer
Evolving Operations for BBC iPlayerEvolving Operations for BBC iPlayer
Evolving Operations for BBC iPlayerAmazon Web Services
 
Java Closures
Java ClosuresJava Closures
Java ClosuresBen Evans
 

Andere mochten auch (8)

Jug java7
Jug java7Jug java7
Jug java7
 
Welcome to the AWS Cloud - AWS Symposium 2014 - Washington D.C.
Welcome to the AWS Cloud - AWS Symposium 2014 - Washington D.C. Welcome to the AWS Cloud - AWS Symposium 2014 - Washington D.C.
Welcome to the AWS Cloud - AWS Symposium 2014 - Washington D.C.
 
Large scale-olap-with-kobayashi
Large scale-olap-with-kobayashiLarge scale-olap-with-kobayashi
Large scale-olap-with-kobayashi
 
Charles nutter star techconf 2011 - jvm languages
Charles nutter   star techconf 2011 - jvm languagesCharles nutter   star techconf 2011 - jvm languages
Charles nutter star techconf 2011 - jvm languages
 
Evolving Operations for BBC iPlayer
Evolving Operations for BBC iPlayerEvolving Operations for BBC iPlayer
Evolving Operations for BBC iPlayer
 
Going Cloud First at the FT
Going Cloud First at the FTGoing Cloud First at the FT
Going Cloud First at the FT
 
Java Closures
Java ClosuresJava Closures
Java Closures
 
Rjb
RjbRjb
Rjb
 

Ähnlich wie InvokeDynamic at #shikadriven 2012

Jvm internal
Jvm internalJvm internal
Jvm internalGo Tanaka
 
Java仮想マシンの実装技術
Java仮想マシンの実装技術Java仮想マシンの実装技術
Java仮想マシンの実装技術Kiyokuni Kawachiya
 
JVMの中身を可視化してみた
JVMの中身を可視化してみたJVMの中身を可視化してみた
JVMの中身を可視化してみたKengo Toda
 
Head toward Java 13 and Java 14 #jjug
Head toward Java 13 and Java 14 #jjugHead toward Java 13 and Java 14 #jjug
Head toward Java 13 and Java 14 #jjugYuji Kubota
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようAkira Shimosako
 
R5 3 type annotation
R5 3 type annotationR5 3 type annotation
R5 3 type annotationEIICHI KIMURA
 
Javaで簡単にgpgpu aparapi
Javaで簡単にgpgpu aparapiJavaで簡単にgpgpu aparapi
Javaで簡単にgpgpu aparapiKen'ichi Sakiyama
 
Head toward Java 16 (Night Seminar Edition)
Head toward Java 16 (Night Seminar Edition)Head toward Java 16 (Night Seminar Edition)
Head toward Java 16 (Night Seminar Edition)Yuji Kubota
 

Ähnlich wie InvokeDynamic at #shikadriven 2012 (10)

Jvm internal
Jvm internalJvm internal
Jvm internal
 
Cve 2013-0422
Cve 2013-0422Cve 2013-0422
Cve 2013-0422
 
Java仮想マシンの実装技術
Java仮想マシンの実装技術Java仮想マシンの実装技術
Java仮想マシンの実装技術
 
JVMの中身を可視化してみた
JVMの中身を可視化してみたJVMの中身を可視化してみた
JVMの中身を可視化してみた
 
Head toward Java 13 and Java 14 #jjug
Head toward Java 13 and Java 14 #jjugHead toward Java 13 and Java 14 #jjug
Head toward Java 13 and Java 14 #jjug
 
Driverについて
DriverについてDriverについて
Driverについて
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみよう
 
R5 3 type annotation
R5 3 type annotationR5 3 type annotation
R5 3 type annotation
 
Javaで簡単にgpgpu aparapi
Javaで簡単にgpgpu aparapiJavaで簡単にgpgpu aparapi
Javaで簡単にgpgpu aparapi
 
Head toward Java 16 (Night Seminar Edition)
Head toward Java 16 (Night Seminar Edition)Head toward Java 16 (Night Seminar Edition)
Head toward Java 16 (Night Seminar Edition)
 

Mehr von Go Tanaka

DevLOVE Kansai KnockoutJS
DevLOVE Kansai KnockoutJSDevLOVE Kansai KnockoutJS
DevLOVE Kansai KnockoutJSGo Tanaka
 
Knockout handson
Knockout handsonKnockout handson
Knockout handsonGo Tanaka
 
Knockout bindings
Knockout bindingsKnockout bindings
Knockout bindingsGo Tanaka
 
Implement curry
Implement curryImplement curry
Implement curryGo Tanaka
 
Log4j 2 writing
Log4j 2 writingLog4j 2 writing
Log4j 2 writingGo Tanaka
 
Log4j 2 source code reading
Log4j 2 source code readingLog4j 2 source code reading
Log4j 2 source code readingGo Tanaka
 
Studying Network #1
Studying Network #1Studying Network #1
Studying Network #1Go Tanaka
 
Inside The Java Virtual Machine
Inside The Java Virtual MachineInside The Java Virtual Machine
Inside The Java Virtual MachineGo Tanaka
 
Nettyらへん
NettyらへんNettyらへん
NettyらへんGo Tanaka
 
T2 reading 20101126
T2 reading 20101126T2 reading 20101126
T2 reading 20101126Go Tanaka
 
Kanjava20110302
Kanjava20110302Kanjava20110302
Kanjava20110302Go Tanaka
 
Slim3 Gwt In Action
Slim3 Gwt In ActionSlim3 Gwt In Action
Slim3 Gwt In ActionGo Tanaka
 
はじめてのPHP
はじめてのPHPはじめてのPHP
はじめてのPHPGo Tanaka
 
T2 - 関ジャバ1月27日
T2 - 関ジャバ1月27日T2 - 関ジャバ1月27日
T2 - 関ジャバ1月27日Go Tanaka
 

Mehr von Go Tanaka (17)

DevLOVE Kansai KnockoutJS
DevLOVE Kansai KnockoutJSDevLOVE Kansai KnockoutJS
DevLOVE Kansai KnockoutJS
 
CPU
CPUCPU
CPU
 
Knockout handson
Knockout handsonKnockout handson
Knockout handson
 
Knockout bindings
Knockout bindingsKnockout bindings
Knockout bindings
 
Implement curry
Implement curryImplement curry
Implement curry
 
Log4j 2 writing
Log4j 2 writingLog4j 2 writing
Log4j 2 writing
 
Log4j 2 source code reading
Log4j 2 source code readingLog4j 2 source code reading
Log4j 2 source code reading
 
Studying Network #1
Studying Network #1Studying Network #1
Studying Network #1
 
Inside The Java Virtual Machine
Inside The Java Virtual MachineInside The Java Virtual Machine
Inside The Java Virtual Machine
 
FxUG HTML5
FxUG HTML5FxUG HTML5
FxUG HTML5
 
Nettyらへん
NettyらへんNettyらへん
Nettyらへん
 
T2 reading 20101126
T2 reading 20101126T2 reading 20101126
T2 reading 20101126
 
Kanjava20110302
Kanjava20110302Kanjava20110302
Kanjava20110302
 
GWT♥HTML5
GWT♥HTML5GWT♥HTML5
GWT♥HTML5
 
Slim3 Gwt In Action
Slim3 Gwt In ActionSlim3 Gwt In Action
Slim3 Gwt In Action
 
はじめてのPHP
はじめてのPHPはじめてのPHP
はじめてのPHP
 
T2 - 関ジャバ1月27日
T2 - 関ジャバ1月27日T2 - 関ジャバ1月27日
T2 - 関ジャバ1月27日
 

Kürzlich hochgeladen

デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 

Kürzlich hochgeladen (8)

デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 

InvokeDynamic at #shikadriven 2012

  • 1. 鹿駆動勉強会@能楽堂 5分でわかる!? InvokeDynamic 12年4月30日月曜日
  • 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日月曜日
  • 4. #shikadriven@能楽堂 Javaの動作原理 COPYRIGHT 2012 PLUGRAM, inc. 12年4月30日月曜日
  • 5. #shikadriven@能楽堂 ソースコードが実行されるまで ① ② ③ Class Java Class JVM 中間ファイル ソースコード 実行 (バイナリ) COPYRIGHT 2012 PLUGRAM, inc. 12年4月30日月曜日
  • 6. #shikadriven@能楽堂 ソースコード 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日月曜日
  • 24. #shikadriven@能楽堂 InvokeDynamicの基本 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日月曜日
  • 31. #shikadriven@能楽堂 JVM上で動作する 動的言語 COPYRIGHT 2012 PLUGRAM, inc. 12年4月30日月曜日
  • 32. #shikadriven@能楽堂 JVM上で動作する動的言語とは 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日月曜日