Home
Explore
Submit Search
Upload
Login
Signup
Advertisement
Java 7 invokedynamic の概要
Report
Taku Miyakawa
Follow
Feb. 17, 2012
•
0 likes
27 likes
×
Be the first to like this
Show More
•
8,557 views
views
×
Total views
0
On Slideshare
0
From embeds
0
Number of embeds
0
Check these out next
Perl 非同期プログラミング
lestrrat
JVMの中身を可視化してみた
Kengo Toda
Elixir入門「第6回:Elixirはtry…catchを書かない~障害対応のパラダイムシフト~」
fukuoka.ex
rpscala35-scala2.9.0
Kenji Yoshida
第三回ありえる社内勉強会 「いわががのLombok」
yoshiaki iwanaga
続・ゲンバのSwift
Yuichi Adachi
Jvm reading-synchronization
Minoru Nakamura
Frege, What a Non-strict Language
y_taka_23
1
of
39
Top clipped slide
Java 7 invokedynamic の概要
Feb. 17, 2012
•
0 likes
27 likes
×
Be the first to like this
Show More
•
8,557 views
views
×
Total views
0
On Slideshare
0
From embeds
0
Number of embeds
0
Download Now
Download to read offline
Report
Technology
Taku Miyakawa
Follow
Advertisement
Advertisement
Advertisement
Recommended
ラムダと invokedynamic の蜜月
Taku Miyakawa
11.2K views
•
51 slides
OpenJDK HotSpot C1Compiler Overview
nothingcosmos
3K views
•
37 slides
Scala2.8への移行
guest5f4320
573 views
•
42 slides
MoteMote Compiler Plugin
yoshiaki iwanaga
1.2K views
•
43 slides
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Chihiro Ito
66.9K views
•
36 slides
Introduction to JShell: the Java REPL Tool #jjug_ccc #ccc_ab4
bitter_fox
23.4K views
•
63 slides
More Related Content
Slideshows for you
(20)
Perl 非同期プログラミング
lestrrat
•
7.2K views
JVMの中身を可視化してみた
Kengo Toda
•
6.1K views
Elixir入門「第6回:Elixirはtry…catchを書かない~障害対応のパラダイムシフト~」
fukuoka.ex
•
2.1K views
rpscala35-scala2.9.0
Kenji Yoshida
•
1.3K views
第三回ありえる社内勉強会 「いわががのLombok」
yoshiaki iwanaga
•
13.9K views
続・ゲンバのSwift
Yuichi Adachi
•
6.4K views
Jvm reading-synchronization
Minoru Nakamura
•
2.2K views
Frege, What a Non-strict Language
y_taka_23
•
2.6K views
コンピューティングとJava~なにわTECH道
なおき きしだ
•
2.1K views
JVM-Reading-ParalleGC
Minoru Nakamura
•
1.8K views
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
shigeki_ohtsu
•
27.6K views
ScalaMatsuri 2016
Yoshitaka Fujii
•
7.1K views
InvokeDynamic at #shikadriven 2012
Go Tanaka
•
965 views
Rubyの黒魔術
Masahiro Tomita
•
9.2K views
Phantom Type in Scala
Yasuyuki Maeda
•
4.6K views
DoActionからJava VMバイトコードに変換する話
emorins
•
2.5K views
なぜリアクティブは重要か #ScalaMatsuri
Yuta Okamoto
•
7.9K views
Swift2.x を Scala からみる
Yuichi Adachi
•
3.7K views
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
y_taka_23
•
21.1K views
SmalltalkBoltでUFFI入門
Masashi Umezawa
•
296 views
Similar to Java 7 invokedynamic の概要
(6)
Kink: invokedynamic on a prototype-based language
Taku Miyakawa
•
1.8K views
20120327 phpstudy58-phake
Katsuhiro Ogawa
•
2.1K views
Adaptive optimization of JIT compiler
nothingcosmos
•
4.3K views
Webサーバ勉強会03
oranie Narut
•
1.7K views
Java SE 7 InvokeDynamic in JRuby
Hiroshi Nakamura
•
3.5K views
Spring3.1概要x di
Yuichi Hasegawa
•
7.6K views
Advertisement
More from Taku Miyakawa
(17)
Java SE 9の紹介: モジュール・システムを中心に
Taku Miyakawa
•
145.1K views
Graph Algorithms Part 1
Taku Miyakawa
•
881 views
Matrix Multiplication in Strassen Algorithm
Taku Miyakawa
•
1.5K views
Javaのログ出力: 道具と考え方
Taku Miyakawa
•
72.7K views
擬似乱数生成器の評価
Taku Miyakawa
•
5.3K views
コルーチンの実装について
Taku Miyakawa
•
3.3K views
言語設計者が意味論を書くときに考えていたこと
Taku Miyakawa
•
4K views
金勘定のためのBigDecimalそしてMoney and Currency API
Taku Miyakawa
•
17.1K views
Quasar: Actor Model and Light Weight Threads on Java
Taku Miyakawa
•
4.1K views
Kink の宣伝
Taku Miyakawa
•
2.7K views
Java Quine Golf
Taku Miyakawa
•
1.5K views
Summary of "Hacking", 0x351-0x354
Taku Miyakawa
•
1.9K views
Processing LTSV by Apache Pig
Taku Miyakawa
•
1.3K views
Kink: プロトタイプベースの俺々 JVM 言語
Taku Miyakawa
•
2.4K views
Java オブジェクトの内部構造
Taku Miyakawa
•
2.2K views
Hadoop jobbuilder
Taku Miyakawa
•
1K views
Kink: developing a programming language on the JVM
Taku Miyakawa
•
619 views
Recently uploaded
(20)
本科/硕士《加拿大温莎大学毕业证成绩单》
1523dsa
•
2 views
ネットワークパケットブローカー市場.pdf
HinaMiyazu
•
3 views
シン3次元表示装置 ーその1ー
Takashi Yamanoue
•
121 views
①【汤普森河大学毕业证文凭学位证书|工艺完美复刻】
love445ds
•
2 views
Üslup ve tercüme.pdf
1Hmmtks
•
2 views
MT,STautomation
ssuserf8ea02
•
105 views
留信网认证可查【皇家霍洛威学院文凭证书毕业证购买】
32lkhng
•
2 views
Oracle Cloud Infrastructure:2023年5月度サービス・アップデート
オラクルエンジニア通信
•
25 views
Omnis
DaisukeFujita10
•
10 views
SoftwareControl.pdf
ssusercd9928
•
15 views
①【阳光海岸大学毕业证文凭学位证书|工艺完美复刻】
vgh215w
•
2 views
【2023年5月】平成生まれのためのUNIX&IT歴史講座
法林浩之
•
16 views
☀️【卡尔顿大学毕业证成绩单留学生首选】
15sad
•
2 views
ペンタエリスリトール市場.pdf
HinaMiyazu
•
3 views
留信网认证可查【拜欧拉大学文凭证书毕业证购买】
1lkjhg
•
3 views
①【威斯康星大学麦迪逊分校毕业证文凭学位证书|工艺完美复刻】
C25lokh12
•
3 views
UAV写真・レーザー測量test.pptx
ssuserb48d2b1
•
13 views
本科/硕士《德国雷根斯堡大学毕业证成绩单》
nxj1dsa
•
3 views
オレオレになりがちなテスト計画を見直した話
terahide
•
24 views
統計学の攻略_統計的仮説検定の9パターン.pdf
akipii Oga
•
0 views
Advertisement
Java 7 invokedynamic の概要
Java 7 invokedynamic
の概要 @miyakawa_taku 2012-02-22 JJUG Night Seminar
1 発表者 • 名前: 宮川
拓 • 職業: SI 屋で Hadooper • オレオレ JVM 言語 Kink を開発中 – Its’ fun!
2 invokedynamic とは? • Java
6 までの JVM = Java のための仮想マシン • Java 7 の JVM = Java + Java 以外の言語のための仮想マシン • invokedynamic は Java 以外の言語のために 追加された新しいメソッド呼び出し命令
3 論点 • Java 6
までの呼び出し命令 – JVM 命令は Java のために作られていた • Java 以外の言語 – 既存の命令セットでは Java 以外の言語処理系が 効率的に実装できない • invokedynamic – 新しい命令で Java 以外の言語も効率的になる
4 論点 • Java 6
までの呼び出し命令 • Java 以外の言語 • invokedynamic
5 Java 6 までの呼び出し命令 •
4 種類 • Java のメソッド呼び出しはこれで全部 OK invokestatic static メソッドを呼び出す invokespecial コンストラクタ、 private メソッド等を呼び出す invokevirtual クラスに属するメソッドを呼び出す (非 private) invokeinterface インタフェースに属するメソッドを呼び出す
6 invokestatic • static メソッドの呼び出し
→ invokestatic StringUtils.rjust("VOXXX", 10, '.'); javac ldc "VOXXX" // "VOXXX” をスタックに積む bipush 10 // 10 をスタックに積む bipush 46 // '.' = 46 をスタックに積む invokestatic StringUtils#rjust(String,int,char):String
7 invokestatic • invokestatic 命令は与えられたメソッドをその
まま呼び出す class StringUtils bang! static String rjust(String,int,char) invokestatic iload_1 aload_0 ...
8 invokespecial • private なインスタンスメソッド、コンストラクタ、
super メソッドの呼び出し → invokespecial this.checkIndex(index); javac aload_0 // this (レシーバ) をスタックに積む iload_1 // index をスタックに積む invokespecial MyList#checkIndex(int):void
9 invokespecial • invokespecial 命令は与えられたメソッドをその
まま呼び出す (invokestatic とほぼ同じ) class MyList bang! private void checkIndex(int) invokespecial iconst_0 iload_1 ...
10 invokevirtual • とある GUI
ツールキットのクラス階層 Widget Rect getRect() Button void push() CheckBox OKButton void push() void push() boolean isPushed()
11 invokevirtual • レシーバの型がクラスであるインスタンスメ
ソッド呼び出し (除 private) → invokevirtual Button button; button.push(); javac aload_0 invokevirtual Button#push():void
12 invokevirtual • invokevirtual 命令はレシーバのクラスが持つ
メソッドのルックアップテーブル (vtable) を見 て呼び出すメソッドを決める Button CheckBox OKButton getRect getRect getRect invokevirtual push push push Button クラスの isPushed 2 番目のメソッド を呼ぶ! メソッドへのポインタが 格納されている
13 invokeinterface • 再び GUI
ツールキットのクラス階層 intf Movable intf Resizable void move(Point) void resize(Size) class Icon class Frame void move(Point) void resize(Size) void move(Point)
14 invokeinterface • レシーバの型がインタフェースであるインスタ
ンスメソッド呼び出し → invokeinterface Movable window; Point point; window.move(new Point(0, 0)); javac aload_0 aload_1 invokeinterface Movable#move(Point):void
15 invokeinterface • invokeinterface 命令はレシーバのクラスがイ
ンタフェース毎に持つルックアップテーブル (itable) を見て呼び出すメソッドを決める class Icon class Frame Movable Movable Resizable invokeinterface move move resize Movable インタフェースの 1 番目のメソッドを呼ぶ! メソッドへのポインタが 格納されている
16 Java 6 までの呼び出し命令
(rep) • 4 つの呼び出し命令で Java のメソッド呼び出 しをカバー • Java に特化した仕組み – メソッドが再定義されることはない – 単一継承 – 名前と型の組み合わせによるメソッドの特定 – レシーバのクラスによる単一ディスパッチ
17 論点 • Java 6
までの呼び出し命令 • Java 以外の言語 • invokedynamic
18 古い革袋と新しい酒
Scheme JS Python Groovy Ruby Scala Java Java JVM JVM むかし 最近
19 古い革袋と新しい酒 • JVM は
Java のために作られたので、それ以外 の言語を動かすのには工夫が必要 • 例: Ruby ではメソッドが再定義できるので、既 存の呼び出し命令で直接呼び出せない • 他にも – method-missing – 多重継承 – mix-in
20 Java 6 までは呼び出すために 処理系が間に挟まる必要があった
array.join バイトコード 生成 invoke invoke CAFE 0000 virtual virtual def join 3939 5151 処理系 ... ...... ... 検索 size Func@42 join Func@123
21 本当はこうしたい!
array.join バイトコード 生成 CAFE 0000 bang! def join 3939 5151 ... ...... ... 余計な処理がなく、JIT コンパイラに よる最適化が掛けやすくなる
22 新しい呼び出し命令が欲しい • Java 以外の言語のメソッドを
JVM の命令で直 接呼び出したい • しかも – 実行される処理を独自のルールで検索したい – メソッドを実行時に繋ぎ変えたい – JIT でカリカリに最適化してほしい
23 論点 • Java 6
までの呼び出し命令 • Java 以外の言語 • invokedynamic
24 invokedynamic • invokedynamic による呼び出しが実現すること
– 呼び出す処理の選択をプログラムによって制御で きる – 呼び出す処理を実行時に繋ぎ変えられる – カリカリに最適化して実行する
25 invokedynamic の基本コンセプト • やりたいこと
– 命令ごとに関数ポインタを登録、これが指し示す 先の処理を呼び出す – 別の関数ポインタを登録しなおすことも可能 invokedynamic 関数 bang! 対象の ポインタ 処理 あとから 貼り替えられる
26 invokedynamic の道具立て • 仔細に道具立てを見ると下図の通り
初回実行時に invokedynamic 呼び出し bootstrap <<create>> CallSite メソッド 任意の MH の Method bang! 対象の 処理 再登録 Handle 処理
27 MethodHandle • まずは MethodHandle
初回実行時に invokedynamic 呼び出し bootstrap <<create>> CallSite メソッド 任意の MH の Method bang! 対象の 処理 再登録 Handle 処理
28 MethodHandle • MethodHandle は型付き関数ポインタ •
決まった型・数の引数をスタックから取り、結 果をスタックに置く処理を指し示す プリミティブな MethodHandle の作成 Lookup#findVirtual • インスタンスメソッドを呼び出す MH Lookup#findConstructor • インスタンスを生成する MH Lookup#findGetter • フィールドの値を返す MH MethodHandles#constant • 定数値を返す MH
29 MethodHandle • MethodHandle は合成したり、引数の順序を
入れ替えたり、部分適用したりして新しい MethodHandle を生成できる 複合的な MethodHandle の作成 MethodHandles • (if test then target else fallback) を行う #guardWithTest MH MethodHandles • 本処理の戻り値に後処理を加える MH #filterReturnValue MethodHandle • 先頭の引数の値を固定した MH #bindTo
30 CallSite • ついで CallSite
初回実行時に invokedynamic 呼び出し bootstrap <<create>> CallSite メソッド 任意の MH の Method bang! 対象の 処理 再登録 Handle 処理
31 CallSite • 1 つの
invokedynamic 命令に紐付いて「呼び 出し元」を表す • MethodHandle の参照を保持する CallSite の具象クラス ConstantCallSite • MH が書き換えられない • private final MethodHandle mh MutableCallSite • MH が書き換えられる • private MethodHandle mh VolatileCallSite • MH が書き換えられる • private volatile MethodHandle mh
32 bootstrap メソッド • 最後に
bootstrap メソッド 初回実行時に invokedynamic 呼び出し bootstrap <<create>> CallSite メソッド 任意の MH の Method bang! 対象の 処理 再登録 Handle 処理
33 bootstrap メソッド • 各
invokedynamic 命令は bootstrap という static メソッドへの参照を持っている • invokedynamic 命令が最初に実行される時に bootstrap メソッドが呼ばれて – 命令に CallSite オブジェクトを紐付ける – MethodHandle の初期値を CallSite に紐付ける
34 bootstrap メソッド • 例:
戻り値の型が int の場合、強制的に値を 42 にする static CallSite bsm(Lookup lu, String name, MethodType mt) throws Exception { MethodType vmt = mt.dropParameterTypes(0, 1); MethodHandle vmh = lu.findVirtual(mt.parameterType(0), name, vmt); if (vmt.returnType() == int.class) return new ConstantCallSite(filterReturnValue(vmh, dropArguments(constant(int.class, 42), 0, int.class))); else return new ConstantCallSite(vmh); }
35 bootstrap メソッド • 例:
「メソッド名」を文字列として戻す – indy での「メソッド名」は bootstrap に渡す引数に 過ぎない static CallSite bsm(Lookup lu, String name, MethodType mt) { return new ConstantCallSite(dropArguments( constant(String.class, name), 0, mt.parameterType(0))); } MethodType が引数なし 戻り値 String でないとエラー
36 invokedynamic (rep) • bootstrap
メソッドにより、命令に紐付く処理を 言語処理系独自のやり方で選択できる • CallSite に新しい MethodHandle を登録するこ とにより、命令に紐付く処理を実行時に変更 できる • これらの仕組みを JVM のレベルでサポートす るため、賢く使うと効率的な言語処理系が実 装できる
37 蛇足 • MethodHandle は処理をオブジェクトとして
様々に操作できるから面白い! • たとえば MethodHandle ベースの AOP フレー ムワークが作れるかも
38 参考 • Da Vinci
Machine Project (mlvm) – http://openjdk.java.net/projects/mlvm/ • JSR 292 Cookbook – http://cr.openjdk.java.net/~jrose/pres/200906-Cookbook.htm • John Rose’ weblog at Oracle: dynamic invocation in the VM – https://blogs.oracle.com/jrose/entry/dynamic_invocation_in_the_vm • Optimizing invokedynamic – http://dl.acm.org/citation.cfm?id=1852763 • HotSpot Internals for OpenJDK: CallingSequences – https://wikis.oracle.com/display/HotSpotInternals/CallingSequences
Advertisement