ラムダと invokedynamic の蜜月

ラムダと invokedynamic の蜜月
宮川 拓 / @miyakawa_taku
2013-07-22 JJUG ナイトセミナー
自己紹介
• 宮川 拓 (@miyakawa_taku) と申します
• SI 屋です
• JJUG 幹事です
• Kink という JVM 言語を開発しています
– https://bitbucket.org/kink/kink
1
要旨
• ラムダ式の実行は invokedynamic で実現さ
れます。その理由と、実行の流れを見ます
– 論点整理
– ラムダ式の実行 (1)
– invokedynamic の復習
– ラムダ式の実行 (2)
– なぜ invokedynamic?
– ラムダの直列化
2
※注記
この資料は、 JDK, JRE の「仕様」と「実装」を厳密に区別していません。
論点整理
3
静的構造
4
関数型インタフェース
ラムダのクラス
ラムダのインスタンス
instance-of
implements
Comparable
Comparable<String> c = (x, y) -> x.length() - y.length();
c
c のクラス
実行の流れ
5
Comparable<String> c = (x, y) -> x.length() - y.length();
Collections.sort(strings, c);
main Collections
ラムダ
sort compare / 処理の中身の実行
new / ラムダ式の実行
今回の主な論点
ラムダ式の実行 (1)
6
ラムダのクラスの実行時生成
• 匿名クラスがコンパイル時に生成されるのに
対し、ラムダのクラスは実行時に生成されます。
まずはそれを確かめます
7
関数型インタフェース
ラムダのクラス
ラムダのインスタンス
instance-of
implements
実行時に生成
匿名クラスをコンパイル
• 匿名クラスは、「外側のクラス名$連番」という
名前で、コンパイラによって生成されます
8
$ cat >AnonClass.java
import java.util.*;
class AnonClass {
Comparator<String> comparator() {
return new Comparator<String> {
@Override public int compare(String x, String y) {
return x.length() – y.length();
}
};
}
}
$ javac AnonClass.java && ls *.class
AnonClass$1.class
AnonClass.class
ラムダをコンパイル
• 同等のラムダをコンパイルしても、対応するク
ラスファイルは生成されません
9
$ cat >Lambda.java
import java.util.*;
class Lambda {
Comparator<String> comparator() {
return (x, y) -> x.length() - y.length();
}
}
$ javac Lambda.java && ls *.class
Lambda.class
ラムダのクラスの生成タイミング
• ラムダのクラスが、コンパイル時には生成され
ないことが分かりました
• したがって、実行時のどこかのタイミングで生
成されているはずです
10
ラムダを含む
ソース
クラス
ファイル
ラムダの
クラスの生成
ラムダの
インスタンス化
コンパイル (JDK) 実行 (JVM)
この時点では
ラムダのクラスは
生成されない
どこかの
タイミング
ラムダのクラスの名前
• まずはラムダのクラスの名前を確認します
11
$ cat >Lambda.java
import java.util.*;
public class Lambda {
public static void main(String[] args) {
Comparator<String> c = (x, y) -> x.length() - y.length();
System.out.println(c.getClass());
}
}
$ javac Lambda.java && java Lambda
class Lambda$$Lambda$1
生成のタイミング
• loadClass(name) すると、ラムダ式を実行する
タイミングでラムダのクラスが出現しているこ
とが分かります
12
$ cat >Lambda.java
...
System.out.println(loadClassOrNull("Lambda$$Lambda$1"));
Comparator<String> c = (x, y) -> x.length() - y.length();
System.out.println(loadClassOrNull("Lambda$$Lambda$1"));
...
$ javac Lambda.java && java Lambda
null
class Lambda$$Lambda$1
ラムダ式実行の過程
• ラムダ式を実行するタイミングで、ラムダのク
ラスが生成されていることが分かりました
• ではラムダ式は、バイトコードのレベルでは、ど
のような過程で実行されているのでしょうか?
13
ラムダ式のバイトコード
• ラムダ式を含むプログラムのクラスファイルを、
javap コマンドで逆アセンブルします
14
$ cat >Lambda.java
import java.util.function.*;
class Lambda {
IntUnaryOperator adder(int delta) {
return n -> n + delta;
}
}
$ javap -c -p Lambda.class
... (次ページ) ...
javap による逆アセンブルの結果
15
class Lambda {
...
java.util.function.IntUnaryOperator adder(int);
Code:
0: iload_1
1: invokedynamic #2, 0
6: areturn
private static int lambda$0(int, int);
Code:
0: iload_1
1: iload_0
2: iadd
3: ireturn
}
再度 Java プログラム風に解釈
• ラムダの処理の中身は lambda$0 というメ
ソッドに記述されます
• ラムダ式の実行は invokedynamic 命令の呼
び出しになっています
16
class Lambda {
IntUnaryOperator adder(int delta) {
return <invokedynamic>(delta);
}
private static int lambda$0(int delta, int n) {
return n + delta;
}
}
ここまでの整理
• 分かったこと
– ラムダのクラスはラムダ式実行の際に生成されま
す
– ラムダ式の実行は invokedynamic 命令です
• 推定できること
– invokedynamic 命令をきっかけとして、ラムダの
クラスが生成され、またラムダのインスタンスが生
成されるはずです
17
invokedynamic の復習
18
invokedynamic の復習
• ラムダ式実行の流れを追いかけるにあたり、
まずは invokedynamic をおさらいします
19
invokedynamic とは
• 本来は、 JRuby など、 Java 以外の言語処理
系のために、 Java SE 7 で追加されたメソッド
呼び出し命令です
• invokevirtual, invokeinterface など、 Java SE
6 までのメソッド呼び出し命令と異なり、呼び
出す処理が実行時に選択できます
20
Java のメソッド呼び出し手順
• どの呼び出し命令でも、手順は大体同じです
21
int result = receiver.doSomething(arg0, arg1);
receiver
arg0
receiver
arg1
arg0
receiver 戻り値
invokexxx
レシーバと引数をスタックに積む 呼び出し
結果も
スタックに
void
以外の場合
Java SE 6 までの呼び出し命令
• Java SE 6 までの呼び出し命令は、いずれも
Java 言語と密に結びついてます
– メソッドは再定義されない
– 名前、引数の型、レシーバのクラスが決まれば、呼
び出すべき処理が定まる
22
invokestatic static メソッドを呼び出す
invokespecial コンストラクタ、 private メソッド等を呼び出す
invokevirtual クラスに属するメソッドを呼び出す
invokeinterface インタフェースに属するメソッドを呼び出す
Java 以外の言語処理系の実装
―Java SE 6 以前
• Java 言語にない機構(メソッド再定義など)を
実現するため、処理系が呼び出しに介入
→JVM による実行時最適化が効きづらい
23
array.join
invoke
virtual
処理系
size Func@42
join Func@123
検索
def join
...
invoke
virtual
関数テーブル
Java 以外の言語処理系の実装
―Java SE 7 以降
• invokedynamic を使って、処理系を介さずに、
直接メソッドが呼び出せるようになりました
→JVM による実行時最適化が効きやすい!
24
array.join
invokedynamic def join
...
invokedynamic の道具立て
• 呼び出し元 (CallSite) ごとに、ブートストラップ
メソッドで、呼び出し先の関数ポインタ
(MethodHandle) を登録
25
Method
Handle
オブジェクト
CallSite
オブジェクト
ブートストラップ
メソッド <<create>>
初回呼び出しの前に
実行
対象の
処理
呼び出し元
<<create>>
呼び出し
ブートストラップメソッド
• static である必要がある
• ブートストラップメソッドの引数
– Lookup: MethodHandle のファクトリ
– String: 「メソッド名」だが、使わなくても可
– MethodType: invokedynamic の引数型と戻り値型
– 任意個数の定数
• ブートストラップメソッドの戻り値
– MethodHandle の初期値が紐付けられた CallSite
26
ブートストラップメソッドの例
• メソッドを呼び出した後、強制的に戻り値を
42 にする MethodHandle を生成
27
static CallSite bsm(Lookup lu, String name, MethodType mt)
throws Exception {
MethodHandle vmh = lu.findVirtual(mt.parameterType(0), name, vmt);
return new ConstantCallSite(filterReturnValue(vmh,
dropArguments(constant(int.class, 42), 0, int.class)));
}
• 以上のように、個々の invokedynamic の動作は、
ブートストラップメソッドを見れば見当が付きます
ラムダ式の実行 (2)
28
ラムダ式の invokedynamic
• 先ほど見たところでは、ラムダ式の実行は、
invokedynamic 命令の実行として実装され
ていました
→紐付けられているブートストラップメソッドを見
れば、実際の動作がわかるはずです
29
ラムダ式の実行の流れ
• ラムダ式の実行の invokedynamic には、
java.lang.invoke.LambdaMetaFactory の
metaFactory メソッドがブートストラップメソッ
ドとして紐付いています
30
invoke
dynamic
<<ブートストラップ>>
LambdaMetaFactory
#metaFactory
ラムダの
インスタンス化
2 回目以降の
実行
1. ラムダのクラスを生成
2. ラムダをインスタンス化する
MethodHandle を生成
LambdaMetaFactory
#metaFactory
31
CallSite metafactory(Lookup lookup, // MethodHandle のファクトリ
String name, // 関数型インタフェースの唯一の抽象メソッド (SAM) の名前 (例: compare)
MethodType invokedType, // 命令の引数・戻り値型
MethodType samMethod, // SAM の引数・戻り値型
MethodHandle implMethod, // 処理本体のメソッド (例: lambda$0)
MethodType instantiatedSamType) // 型パラメータ適用後の SAM の引数・戻り値型
シグネチャ
1. これらの情報を元にラムダのクラスを生成
• 引数をフィールドに格納するコンストラクタ
• 処理本体のメソッドを呼び出す SAM の実装
2. ラムダをインスタンス化する MethodHandle を生成、
CallSite に紐付け
最終的に実行される処理
32
class Lambda {
static class Lambda$1 implements IntUnaryOperator {
private final int delta;
Lambda$1(int delta) { this.delta = delta; }
@Override public int applyAsInt(int n) {
return lambda$0(this.delta, n);
}
}
IntUnaryOperator adder(int delta) {
return <invokedynamic: new Lambda$1(delta)>;
}
private static int lambda$0(int delta, int n) {
return n + delta;
}
}
metaFactory
が生成
→ 結局、やってることは匿名クラスと(ほぼ)同じ!
なぜ invokedynamic?
33
なぜ invokedynamic?
• invokedynamic によるラムダ式の実行は、動
作としては匿名クラスと似たようなものでした
• なぜ、わざわざ invokedynamic を使うので
しょうか?
→(1) クラスファイルが少なくなるおかげで、起動が
速くなる、かもしれません
→(2) JVM が LambdaMetaFactory を独自に実装
することで、最適なインスタンス生成の方法を選
択できるようになります
34
(1) 起動時間
• Java SE 8 では、 Streams API の採用によって、
プログラム中で全面的にラムダ式が利用され
ることが想定されています(実態はどうあれ!)
• その際、ラムダ式を匿名クラス方式で実装す
ると、クラスファイルの数が飛躍的に増えるた
め、クラスローディングが遅くなってしまいます
• invokedynamic で、クラスを実行時に生成す
れば、起動時間が抑えられる、かもしれません
35
匿名クラスとラムダ式の起動時間比較
• 5,000 個の匿名クラス/ラムダをインスタンス
化するプログラムを実行(各10回)
36
平均
2,041ms
2,375ms
CPU: Core i3-2120T (2.6 GHz)
OS: Arch Linux, カーネル: 3.9.9-1-ARCH
JVM: JDK-8 build b99 (64-bit)
匿名クラス<ラムダ式 の考察
• 匿名クラスの実行時間増加要因
A) I/O
B) jar の解凍
• ラムダ式の実行時間増加要因
C) ブートストラップメソッド呼び出し(それにともな
う MethodHandle 作成など)
D) バイトコード生成
37
A+B < C+D となった?
(2) インスタンス生成戦略の選択
• LambdaMetaFactory は JVM が提供する
API です。したがって、実行時に JVM に都合
のよい方法でインスタンスが生成できます
• 可能な選択肢:
– 1 つのラムダ式ごとに 1 つのクラスを生成(既述)
– 外部の値を参照しないラムダ式であれば、シング
ルトンインスタンスを戻す(後述)
38
シングルトンインスタンス
• 次のラムダ式は、外側の変数に依存していな
いため、何度実行しても、同じ働きのインスタ
ンスを戻します
→この場合、シングルトンインスタンスを毎回使
い回せばいいはずです
39
Comparator<String> comparator() {
return (x, y) -> x.length() - y.length();
}
シングルトンインスタンス: 実行の流れ
• ラムダの処理の本体が、外側の変数に依存し
ていない場合、ラムダ式はシングルトンインス
タンスを戻します
40
invoke
dynamic
<<ブートストラップ>>
LambdaMetaFactory
#metaFactory
シングルトン
インスタンス
2 回目以降の
実行
1. ラムダのクラスを生成
2. ラムダのシングルトンインスタンスを生成
3. シングルトンインスタンスを戻す
MethodHandle を生成
シングルトンインスタンス: 確認
41
$ cat >Lambda.java
import java.util.*;
public class Lambda {
static Comparator<String> comparator() {
return (x, y) -> x.length() - y.length();
}
public static void main(String[] args) {
System.out.println(comparator());
System.out.println(comparator());
System.out.println(comparator());
}
}
$ javac Lambda.java && java Lambda
Lambda$$Lambda$1@84aee7
Lambda$$Lambda$1@84aee7
Lambda$$Lambda$1@84aee7
その他の可能なインスタンス生成戦略
• 1 つの関数型インタフェースごとに 1 つのクラ
スを生成。リフレクション経由で処理本体を呼
び出し
• MethodHandle を関数型インタフェースに直
接ラップする機構を用意して、それを使う
42
ラムダの直列化
43
ラムダの直列化
• 関数型インタフェースが Serializable を拡張
している場合、ラムダのインスタンスは直列化
できる必要があります
– 直列化(ラムダ→バイト列)、非直列化(バイト列→
ラムダ)した時、元のラムダと同じように機能する
必要がある
• ラムダのクラスが実行時に生成される時、どう
したら直列化・非直列化できるのでしょうか?
→ writeReplace / readResolve を使う
44
直列化の流れ
45
ラムダ
インスタンス
SerializedLambda バイト列
writeReplace
インタフェース名、処理本体
のメソッド名など、ラムダを構
成する静的情報を保持
defaultWriteObject
非直列化の流れ
46
defaultReadObject
ラムダ
インスタンス
SerializedLambdaバイト列
★
★: 静的情報を元にラムダを復元
SerializedLambda ラムダ式を含むクラス
ラムダ
readResolve
$deserializeLambda$
<<create>>
invokedynamic
コンパイル時に生成
総括
47
総括
• ラムダ式は匿名クラスの単純な構文糖ではあ
りません。 invokedynamic 命令を使って、クラ
スを実行時に生成しています
• これにより、 JVM がラムダのインスタンスの生
成方法を選べるので、実行時最適化の余地
が大きくなります
48
参考文献
49
参考文献
• Java SE 8 API Specification
– http://download.java.net/jdk8/docs/api/overview-summary.html
• JSR-335
– http://jcp.org/en/jsr/detail?id=335
• Brian Goetz “From Lambdas to Bytecode”
– http://wiki.jvmlangsummit.com/images/1/1e/2011_Goetz_Lambd
a.pdf
• 宮川 拓「Lambda 式に invokedynamic を使うのかもしれな
い話」
– http://d.hatena.ne.jp/miyakawa_taku/20120728/1343478485
50
1 of 51

Recommended

オブジェクト指向できていますか? by
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?Moriharu Ohzu
237.5K views129 slides
いろいろ考えると日本語の全文検索もMySQLがいいね! by
いろいろ考えると日本語の全文検索もMySQLがいいね!いろいろ考えると日本語の全文検索もMySQLがいいね!
いろいろ考えると日本語の全文検索もMySQLがいいね!Kouhei Sutou
7.6K views88 slides
例外設計における大罪 by
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
68.6K views37 slides
MySQLの文字コード事情 by
MySQLの文字コード事情MySQLの文字コード事情
MySQLの文字コード事情Masahiro Tomita
21.5K views45 slides
組み込みLinuxでのGolangのススメ by
組み込みLinuxでのGolangのススメ組み込みLinuxでのGolangのススメ
組み込みLinuxでのGolangのススメTetsuyuki Kobayashi
2.6K views35 slides
MySQLの運用でありがちなこと by
MySQLの運用でありがちなことMySQLの運用でありがちなこと
MySQLの運用でありがちなことHiroaki Sano
19.8K views30 slides

More Related Content

What's hot

ある工場の Redmine 2022 〜ある工場の Redmine 5.0 バージョンアップ〜 ( Redmine of one plant 2022 ... by
ある工場の Redmine 2022 〜ある工場の Redmine 5.0 バージョンアップ〜 (  Redmine of one plant 2022 ...ある工場の Redmine 2022 〜ある工場の Redmine 5.0 バージョンアップ〜 (  Redmine of one plant 2022 ...
ある工場の Redmine 2022 〜ある工場の Redmine 5.0 バージョンアップ〜 ( Redmine of one plant 2022 ...Kohei Nakamura
2.1K views32 slides
BoostAsioで可読性を求めるのは間違っているだろうか by
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかYuki Miyatake
14.3K views31 slides
テスト文字列に「うんこ」と入れるな by
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなKentaro Matsui
178.4K views16 slides
データベース設計徹底指南 by
データベース設計徹底指南データベース設計徹底指南
データベース設計徹底指南Mikiya Okuno
114.4K views132 slides
入門 シェル実装 by
入門 シェル実装入門 シェル実装
入門 シェル実装Yusuke Sangenya
19.8K views37 slides
Redmine にいろいろ埋め込んでみた by
Redmine にいろいろ埋め込んでみたRedmine にいろいろ埋め込んでみた
Redmine にいろいろ埋め込んでみたKohei Nakamura
27K views20 slides

What's hot(20)

ある工場の Redmine 2022 〜ある工場の Redmine 5.0 バージョンアップ〜 ( Redmine of one plant 2022 ... by Kohei Nakamura
ある工場の Redmine 2022 〜ある工場の Redmine 5.0 バージョンアップ〜 (  Redmine of one plant 2022 ...ある工場の Redmine 2022 〜ある工場の Redmine 5.0 バージョンアップ〜 (  Redmine of one plant 2022 ...
ある工場の Redmine 2022 〜ある工場の Redmine 5.0 バージョンアップ〜 ( Redmine of one plant 2022 ...
Kohei Nakamura2.1K views
BoostAsioで可読性を求めるのは間違っているだろうか by Yuki Miyatake
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
Yuki Miyatake14.3K views
テスト文字列に「うんこ」と入れるな by Kentaro Matsui
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
Kentaro Matsui178.4K views
データベース設計徹底指南 by Mikiya Okuno
データベース設計徹底指南データベース設計徹底指南
データベース設計徹底指南
Mikiya Okuno114.4K views
Redmine にいろいろ埋め込んでみた by Kohei Nakamura
Redmine にいろいろ埋め込んでみたRedmine にいろいろ埋め込んでみた
Redmine にいろいろ埋め込んでみた
Kohei Nakamura27K views
Linux女子部 systemd徹底入門 by Etsuji Nakai
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門
Etsuji Nakai137.9K views
できる!並列・並行プログラミング by Preferred Networks
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミング
Preferred Networks26.6K views
リーンなコードを書こう:実践的なオブジェクト指向設計 by 増田 亨
リーンなコードを書こう:実践的なオブジェクト指向設計リーンなコードを書こう:実践的なオブジェクト指向設計
リーンなコードを書こう:実践的なオブジェクト指向設計
増田 亨15.7K views
コンテナの作り方「Dockerは裏方で何をしているのか?」 by Masahito Zembutsu
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」
Masahito Zembutsu30.8K views
MySQL 5.7にやられないためにおぼえておいてほしいこと by yoku0825
MySQL 5.7にやられないためにおぼえておいてほしいことMySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいこと
yoku0825175.1K views
Pythonによる黒魔術入門 by 大樹 小倉
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
大樹 小倉44.4K views
Dockerからcontainerdへの移行 by Kohei Tokunaga
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
Kohei Tokunaga16.7K views
Webアプリを並行開発する際のマイグレーション戦略 by Takayuki Shimizukawa
Webアプリを並行開発する際のマイグレーション戦略Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略
MySQL 8.0で憶えておいてほしいこと by yoku0825
MySQL 8.0で憶えておいてほしいことMySQL 8.0で憶えておいてほしいこと
MySQL 8.0で憶えておいてほしいこと
yoku082518.8K views
なかったらINSERTしたいし、あるならロック取りたいやん? by ichirin2501
なかったらINSERTしたいし、あるならロック取りたいやん?なかったらINSERTしたいし、あるならロック取りたいやん?
なかったらINSERTしたいし、あるならロック取りたいやん?
ichirin250141.7K views
オブジェクト指向エクササイズのススメ by Yoji Kanno
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
Yoji Kanno57.2K views
SANS Holiday Hack 2017 (非公式ガイド) by Isaac Mathis
SANS Holiday Hack 2017 (非公式ガイド)SANS Holiday Hack 2017 (非公式ガイド)
SANS Holiday Hack 2017 (非公式ガイド)
Isaac Mathis2.9K views
君はyarn.lockをコミットしているか? by Teppei Sato
君はyarn.lockをコミットしているか?君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?
Teppei Sato30.5K views

Viewers also liked

JSR 352 “Batch Applications for the Java Platform” by
JSR 352 “Batch Applications for the Java Platform”JSR 352 “Batch Applications for the Java Platform”
JSR 352 “Batch Applications for the Java Platform”Norito Agetsuma
13.7K views97 slides
Java 7 invokedynamic の概要 by
Java 7 invokedynamic の概要Java 7 invokedynamic の概要
Java 7 invokedynamic の概要Taku Miyakawa
8.6K views39 slides
Project Lambdaの基礎 by
Project Lambdaの基礎Project Lambdaの基礎
Project Lambdaの基礎Yuichi Sakuraba
7.3K views23 slides
Lambda: A Peek Under The Hood - Brian Goetz by
Lambda: A Peek Under The Hood - Brian GoetzLambda: A Peek Under The Hood - Brian Goetz
Lambda: A Peek Under The Hood - Brian GoetzJAX London
8K views39 slides
Java Batch 仕様 (Public Review時点) by
Java Batch 仕様 (Public Review時点) Java Batch 仕様 (Public Review時点)
Java Batch 仕様 (Public Review時点) Norito Agetsuma
34.2K views73 slides
JSFとJAX-RSで作る Thin Server Architecture #glassfishjp by
JSFとJAX-RSで作る Thin Server Architecture #glassfishjpJSFとJAX-RSで作る Thin Server Architecture #glassfishjp
JSFとJAX-RSで作る Thin Server Architecture #glassfishjpToshiaki Maki
11.4K views36 slides

Viewers also liked(6)

JSR 352 “Batch Applications for the Java Platform” by Norito Agetsuma
JSR 352 “Batch Applications for the Java Platform”JSR 352 “Batch Applications for the Java Platform”
JSR 352 “Batch Applications for the Java Platform”
Norito Agetsuma13.7K views
Java 7 invokedynamic の概要 by Taku Miyakawa
Java 7 invokedynamic の概要Java 7 invokedynamic の概要
Java 7 invokedynamic の概要
Taku Miyakawa8.6K views
Lambda: A Peek Under The Hood - Brian Goetz by JAX London
Lambda: A Peek Under The Hood - Brian GoetzLambda: A Peek Under The Hood - Brian Goetz
Lambda: A Peek Under The Hood - Brian Goetz
JAX London8K views
Java Batch 仕様 (Public Review時点) by Norito Agetsuma
Java Batch 仕様 (Public Review時点) Java Batch 仕様 (Public Review時点)
Java Batch 仕様 (Public Review時点)
Norito Agetsuma34.2K views
JSFとJAX-RSで作る Thin Server Architecture #glassfishjp by Toshiaki Maki
JSFとJAX-RSで作る Thin Server Architecture #glassfishjpJSFとJAX-RSで作る Thin Server Architecture #glassfishjp
JSFとJAX-RSで作る Thin Server Architecture #glassfishjp
Toshiaki Maki11.4K views

Similar to ラムダと invokedynamic の蜜月

Spring3.1概要x di by
Spring3.1概要x diSpring3.1概要x di
Spring3.1概要x diYuichi Hasegawa
7.7K views64 slides
MoteMote Compiler Plugin by
MoteMote Compiler PluginMoteMote Compiler Plugin
MoteMote Compiler Pluginyoshiaki iwanaga
1.2K views43 slides
Cve 2013-0422 by
Cve 2013-0422Cve 2013-0422
Cve 2013-0422abend_cve_9999_0001
1.2K views22 slides
jvmlang.daitokai 1.0.0 MinCamlJを作ってみた by
jvmlang.daitokai 1.0.0 MinCamlJを作ってみたjvmlang.daitokai 1.0.0 MinCamlJを作ってみた
jvmlang.daitokai 1.0.0 MinCamlJを作ってみたKazuyoshi Kamitsukasa
1K views30 slides
TypeScriptで書くLambdaをCDKでいい感じに管理する.pptx by
TypeScriptで書くLambdaをCDKでいい感じに管理する.pptxTypeScriptで書くLambdaをCDKでいい感じに管理する.pptx
TypeScriptで書くLambdaをCDKでいい感じに管理する.pptxssuser8b389c
213 views14 slides
Em synchrony について by
Em synchrony についてEm synchrony について
Em synchrony についてTomoya Kawanishi
4.1K views21 slides

Similar to ラムダと invokedynamic の蜜月(20)

TypeScriptで書くLambdaをCDKでいい感じに管理する.pptx by ssuser8b389c
TypeScriptで書くLambdaをCDKでいい感じに管理する.pptxTypeScriptで書くLambdaをCDKでいい感じに管理する.pptx
TypeScriptで書くLambdaをCDKでいい感じに管理する.pptx
ssuser8b389c213 views
Java8 lambdas chapter1_2 by yo0824
Java8 lambdas chapter1_2Java8 lambdas chapter1_2
Java8 lambdas chapter1_2
yo0824288 views
第一回社内 Scala 勉強会(一部抜粋)その 2 by lyrical_logical
第一回社内 Scala 勉強会(一部抜粋)その 2第一回社内 Scala 勉強会(一部抜粋)その 2
第一回社内 Scala 勉強会(一部抜粋)その 2
lyrical_logical945 views
Adaptive optimization of JIT compiler by nothingcosmos
Adaptive optimization of JIT compilerAdaptive optimization of JIT compiler
Adaptive optimization of JIT compiler
nothingcosmos4.3K views
Javaはどのように動くのか~スライドでわかるJVMの仕組み by Chihiro Ito
Javaはどのように動くのか~スライドでわかるJVMの仕組みJavaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Chihiro Ito67.2K views
Kink: invokedynamic on a prototype-based language by Taku Miyakawa
Kink: invokedynamic on a prototype-based languageKink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based language
Taku Miyakawa1.8K views
Scalaで萌える関数型プログラミング[完全版] by Ra Zon
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]
Ra Zon6.9K views
DynamoDB Streamを使ったリアルタイム分析 by ShinsukeYokota
DynamoDB Streamを使ったリアルタイム分析DynamoDB Streamを使ったリアルタイム分析
DynamoDB Streamを使ったリアルタイム分析
ShinsukeYokota4.3K views
tcpdump & xtrabackup @ MySQL Casual Talks #1 by Ryosuke IWANAGA
tcpdump & xtrabackup @ MySQL Casual Talks #1tcpdump & xtrabackup @ MySQL Casual Talks #1
tcpdump & xtrabackup @ MySQL Casual Talks #1
Ryosuke IWANAGA5.5K views
【Ltech#10】LIFULL HOME'S ネイティブアプリ用APIのデプロイを自動化する by LIFULL Co., Ltd.
【Ltech#10】LIFULL HOME'S ネイティブアプリ用APIのデプロイを自動化する【Ltech#10】LIFULL HOME'S ネイティブアプリ用APIのデプロイを自動化する
【Ltech#10】LIFULL HOME'S ネイティブアプリ用APIのデプロイを自動化する
LIFULL Co., Ltd.624 views
18166746-NeverBlock-RubyKaigi2009 by Muhammad Ali
18166746-NeverBlock-RubyKaigi200918166746-NeverBlock-RubyKaigi2009
18166746-NeverBlock-RubyKaigi2009
Muhammad Ali162 views
Scalaのimplicit、カリー化 by yuya-nakamura
Scalaのimplicit、カリー化Scalaのimplicit、カリー化
Scalaのimplicit、カリー化
yuya-nakamura232 views

More from Taku Miyakawa

Java SE 9の紹介: モジュール・システムを中心に by
Java SE 9の紹介: モジュール・システムを中心にJava SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心にTaku Miyakawa
145.2K views104 slides
Graph Algorithms Part 1 by
Graph Algorithms Part 1Graph Algorithms Part 1
Graph Algorithms Part 1Taku Miyakawa
882 views57 slides
Matrix Multiplication in Strassen Algorithm by
Matrix Multiplication in Strassen AlgorithmMatrix Multiplication in Strassen Algorithm
Matrix Multiplication in Strassen AlgorithmTaku Miyakawa
1.6K views9 slides
Javaのログ出力: 道具と考え方 by
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Taku Miyakawa
74.3K views67 slides
擬似乱数生成器の評価 by
擬似乱数生成器の評価擬似乱数生成器の評価
擬似乱数生成器の評価Taku Miyakawa
5.4K views12 slides
コルーチンの実装について by
コルーチンの実装についてコルーチンの実装について
コルーチンの実装についてTaku Miyakawa
3.3K views13 slides

More from Taku Miyakawa(17)

Java SE 9の紹介: モジュール・システムを中心に by Taku Miyakawa
Java SE 9の紹介: モジュール・システムを中心にJava SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心に
Taku Miyakawa145.2K views
Matrix Multiplication in Strassen Algorithm by Taku Miyakawa
Matrix Multiplication in Strassen AlgorithmMatrix Multiplication in Strassen Algorithm
Matrix Multiplication in Strassen Algorithm
Taku Miyakawa1.6K views
Javaのログ出力: 道具と考え方 by Taku Miyakawa
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
Taku Miyakawa74.3K views
擬似乱数生成器の評価 by Taku Miyakawa
擬似乱数生成器の評価擬似乱数生成器の評価
擬似乱数生成器の評価
Taku Miyakawa5.4K views
コルーチンの実装について by Taku Miyakawa
コルーチンの実装についてコルーチンの実装について
コルーチンの実装について
Taku Miyakawa3.3K views
言語設計者が意味論を書くときに考えていたこと by Taku Miyakawa
言語設計者が意味論を書くときに考えていたこと言語設計者が意味論を書くときに考えていたこと
言語設計者が意味論を書くときに考えていたこと
Taku Miyakawa4K views
金勘定のためのBigDecimalそしてMoney and Currency API by Taku Miyakawa
金勘定のためのBigDecimalそしてMoney and Currency API金勘定のためのBigDecimalそしてMoney and Currency API
金勘定のためのBigDecimalそしてMoney and Currency API
Taku Miyakawa17.5K views
Quasar: Actor Model and Light Weight Threads on Java by Taku Miyakawa
Quasar: Actor Model and Light Weight Threads on JavaQuasar: Actor Model and Light Weight Threads on Java
Quasar: Actor Model and Light Weight Threads on Java
Taku Miyakawa4.1K views
Summary of "Hacking", 0x351-0x354 by Taku Miyakawa
Summary of "Hacking", 0x351-0x354Summary of "Hacking", 0x351-0x354
Summary of "Hacking", 0x351-0x354
Taku Miyakawa1.9K views
Processing LTSV by Apache Pig by Taku Miyakawa
Processing LTSV by Apache PigProcessing LTSV by Apache Pig
Processing LTSV by Apache Pig
Taku Miyakawa1.3K views
Kink: プロトタイプベースの俺々 JVM 言語 by Taku Miyakawa
Kink: プロトタイプベースの俺々 JVM 言語Kink: プロトタイプベースの俺々 JVM 言語
Kink: プロトタイプベースの俺々 JVM 言語
Taku Miyakawa2.4K views
Java オブジェクトの内部構造 by Taku Miyakawa
Java オブジェクトの内部構造Java オブジェクトの内部構造
Java オブジェクトの内部構造
Taku Miyakawa2.3K views
Kink: developing a programming language on the JVM by Taku Miyakawa
Kink: developing a programming language on the JVMKink: developing a programming language on the JVM
Kink: developing a programming language on the JVM
Taku Miyakawa625 views

ラムダと invokedynamic の蜜月