Submit Search
Upload
ラムダのコンパイル結果を5分で説明するよ
•
Download as PPTX, PDF
•
0 likes
•
153 views
YujiSoftware
Follow
JJUGナイトセミナー「おうちで!ビール片手にLT大会」
Read less
Read more
Software
Slideshow view
Report
Share
Slideshow view
Report
Share
1 of 19
Download now
Recommended
「愛されたい!」と思ったときにJavaで書くRubyクラス
「愛されたい!」と思ったときにJavaで書くRubyクラス
Koichiro Ohba
LaravelとMVCの先へ
LaravelとMVCの先へ
Yuuki Takezawa
Play frameworkについて
Play frameworkについて
Shinobu Okano
play framework 勉強会 in 関西
play framework 勉強会 in 関西
Shinichi Kozake
Rails on rspec plactice
Rails on rspec plactice
k-motoyan
Rails on rspec plactice
Rails on rspec plactice
k-motoyan
Rawlerフレームワーク(全体)
Rawlerフレームワーク(全体)
Takaichi Ito
Javaクラスファイルの読み方
Javaクラスファイルの読み方
y torazuka
Recommended
「愛されたい!」と思ったときにJavaで書くRubyクラス
「愛されたい!」と思ったときにJavaで書くRubyクラス
Koichiro Ohba
LaravelとMVCの先へ
LaravelとMVCの先へ
Yuuki Takezawa
Play frameworkについて
Play frameworkについて
Shinobu Okano
play framework 勉強会 in 関西
play framework 勉強会 in 関西
Shinichi Kozake
Rails on rspec plactice
Rails on rspec plactice
k-motoyan
Rails on rspec plactice
Rails on rspec plactice
k-motoyan
Rawlerフレームワーク(全体)
Rawlerフレームワーク(全体)
Takaichi Ito
Javaクラスファイルの読み方
Javaクラスファイルの読み方
y torazuka
演習:プログラミング言語処理をやってみよう
演習:プログラミング言語処理をやってみよう
Takashi Ishio
Dark vol4 for_slideshare
Dark vol4 for_slideshare
ara_ta3
Scalaのimplicit、カリー化
Scalaのimplicit、カリー化
yuya-nakamura
20110820 metaprogramming
20110820 metaprogramming
Masanori Kado
Scala再入門 @2014/02/08 Scala関西ビギナーズ第3回
Scala再入門 @2014/02/08 Scala関西ビギナーズ第3回
Asami Abe
PythonでWebDAVサーバーを作ろう②
PythonでWebDAVサーバーを作ろう②
iPride Co., Ltd.
社内Java8勉強会 ラムダ式とストリームAPI
社内Java8勉強会 ラムダ式とストリームAPI
Akihiro Ikezoe
MoteMote Compiler Plugin
MoteMote Compiler Plugin
yoshiaki iwanaga
食べログで動いている自作ライブラリのお話
食べログで動いている自作ライブラリのお話
Tsukasa Oishi
第一回社内 Scala 勉強会(一部抜粋)
第一回社内 Scala 勉強会(一部抜粋)
lyrical_logical
ラムダと invokedynamic の蜜月
ラムダと invokedynamic の蜜月
Taku Miyakawa
Vim scriptとJavaとHaskell
Vim scriptとJavaとHaskell
aiya000
Beginners Scala in FAN 20121009
Beginners Scala in FAN 20121009
Taisuke Shiratori
プログラミングNet framework3のお題
プログラミングNet framework3のお題
Kazushi Kamegawa
Ruby on Rails 入門
Ruby on Rails 入門
Yasuko Ohba
Scala Daysに行ってみて
Scala Daysに行ってみて
Kota Mizushima
Java8勉強会
Java8勉強会
賢太郎 前多
Java8から17へ
Java8から17へ
onozaty
Cookpad Summer Intern 2015 - Programming Paradigm
Cookpad Summer Intern 2015 - Programming Paradigm
Minero Aoki
Javaはどれだけ速いのか
Javaはどれだけ速いのか
YujiSoftware
Java をクラッシュさせて遊んでみよう!
Java をクラッシュさせて遊んでみよう!
YujiSoftware
技術書を読むと眠くなる!これを解決するために取った10の対策
技術書を読むと眠くなる!これを解決するために取った10の対策
YujiSoftware
More Related Content
Similar to ラムダのコンパイル結果を5分で説明するよ
演習:プログラミング言語処理をやってみよう
演習:プログラミング言語処理をやってみよう
Takashi Ishio
Dark vol4 for_slideshare
Dark vol4 for_slideshare
ara_ta3
Scalaのimplicit、カリー化
Scalaのimplicit、カリー化
yuya-nakamura
20110820 metaprogramming
20110820 metaprogramming
Masanori Kado
Scala再入門 @2014/02/08 Scala関西ビギナーズ第3回
Scala再入門 @2014/02/08 Scala関西ビギナーズ第3回
Asami Abe
PythonでWebDAVサーバーを作ろう②
PythonでWebDAVサーバーを作ろう②
iPride Co., Ltd.
社内Java8勉強会 ラムダ式とストリームAPI
社内Java8勉強会 ラムダ式とストリームAPI
Akihiro Ikezoe
MoteMote Compiler Plugin
MoteMote Compiler Plugin
yoshiaki iwanaga
食べログで動いている自作ライブラリのお話
食べログで動いている自作ライブラリのお話
Tsukasa Oishi
第一回社内 Scala 勉強会(一部抜粋)
第一回社内 Scala 勉強会(一部抜粋)
lyrical_logical
ラムダと invokedynamic の蜜月
ラムダと invokedynamic の蜜月
Taku Miyakawa
Vim scriptとJavaとHaskell
Vim scriptとJavaとHaskell
aiya000
Beginners Scala in FAN 20121009
Beginners Scala in FAN 20121009
Taisuke Shiratori
プログラミングNet framework3のお題
プログラミングNet framework3のお題
Kazushi Kamegawa
Ruby on Rails 入門
Ruby on Rails 入門
Yasuko Ohba
Scala Daysに行ってみて
Scala Daysに行ってみて
Kota Mizushima
Java8勉強会
Java8勉強会
賢太郎 前多
Java8から17へ
Java8から17へ
onozaty
Cookpad Summer Intern 2015 - Programming Paradigm
Cookpad Summer Intern 2015 - Programming Paradigm
Minero Aoki
Similar to ラムダのコンパイル結果を5分で説明するよ
(19)
演習:プログラミング言語処理をやってみよう
演習:プログラミング言語処理をやってみよう
Dark vol4 for_slideshare
Dark vol4 for_slideshare
Scalaのimplicit、カリー化
Scalaのimplicit、カリー化
20110820 metaprogramming
20110820 metaprogramming
Scala再入門 @2014/02/08 Scala関西ビギナーズ第3回
Scala再入門 @2014/02/08 Scala関西ビギナーズ第3回
PythonでWebDAVサーバーを作ろう②
PythonでWebDAVサーバーを作ろう②
社内Java8勉強会 ラムダ式とストリームAPI
社内Java8勉強会 ラムダ式とストリームAPI
MoteMote Compiler Plugin
MoteMote Compiler Plugin
食べログで動いている自作ライブラリのお話
食べログで動いている自作ライブラリのお話
第一回社内 Scala 勉強会(一部抜粋)
第一回社内 Scala 勉強会(一部抜粋)
ラムダと invokedynamic の蜜月
ラムダと invokedynamic の蜜月
Vim scriptとJavaとHaskell
Vim scriptとJavaとHaskell
Beginners Scala in FAN 20121009
Beginners Scala in FAN 20121009
プログラミングNet framework3のお題
プログラミングNet framework3のお題
Ruby on Rails 入門
Ruby on Rails 入門
Scala Daysに行ってみて
Scala Daysに行ってみて
Java8勉強会
Java8勉強会
Java8から17へ
Java8から17へ
Cookpad Summer Intern 2015 - Programming Paradigm
Cookpad Summer Intern 2015 - Programming Paradigm
More from YujiSoftware
Javaはどれだけ速いのか
Javaはどれだけ速いのか
YujiSoftware
Java をクラッシュさせて遊んでみよう!
Java をクラッシュさせて遊んでみよう!
YujiSoftware
技術書を読むと眠くなる!これを解決するために取った10の対策
技術書を読むと眠くなる!これを解決するために取った10の対策
YujiSoftware
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
YujiSoftware
Java を今すぐダウンロードしてみたお話
Java を今すぐダウンロードしてみたお話
YujiSoftware
JVM言語を使ってみようの歌
JVM言語を使ってみようの歌
YujiSoftware
AtCoderで始めるテスト駆動開発
AtCoderで始めるテスト駆動開発
YujiSoftware
Javaでマサカリ投げてみた
Javaでマサカリ投げてみた
YujiSoftware
ジャバのはなし、JAVAのはなし、Javaのはなし
ジャバのはなし、JAVAのはなし、Javaのはなし
YujiSoftware
More from YujiSoftware
(9)
Javaはどれだけ速いのか
Javaはどれだけ速いのか
Java をクラッシュさせて遊んでみよう!
Java をクラッシュさせて遊んでみよう!
技術書を読むと眠くなる!これを解決するために取った10の対策
技術書を読むと眠くなる!これを解決するために取った10の対策
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
Java を今すぐダウンロードしてみたお話
Java を今すぐダウンロードしてみたお話
JVM言語を使ってみようの歌
JVM言語を使ってみようの歌
AtCoderで始めるテスト駆動開発
AtCoderで始めるテスト駆動開発
Javaでマサカリ投げてみた
Javaでマサカリ投げてみた
ジャバのはなし、JAVAのはなし、Javaのはなし
ジャバのはなし、JAVAのはなし、Javaのはなし
ラムダのコンパイル結果を5分で説明するよ
1.
ラムダの コンパイル結果を 5分で説明するよ @YujiSoftware https://yuji.software/
2.
本日説明するソースコード • 文字列の長さでソートする処理 • ラムダで、文字列の長さを比較 •
ラムダの部分がコンパイルされた結果は? • Java 17 で調べてみた ※ Collections.sort(list, Comparator.comparingInt(String::length)) の方がシンプル
3.
おさらい:匿名クラスの場合 • ラムダを匿名クラスに置き換えた
4.
匿名クラスをコンパイル • クラス名$連番.class というファイルができる •
これを開いてみる
5.
読めない
6.
なぜ読めない? • クラスファイルはテキストではない • バイナリエディタで開くけば読める •
それでも読みにくい… • もっと簡単に読みたい! • JDK 付属の javap コマンドを使おう! (クラスファイル逆アセンブラ) • -v / -verbose (詳細表示) • -p / -private(privateクラスも表示) javap –verbose -private Main$1.class
7.
匿名クラスを javap した内容 •
分かったこと • Main$1 というクラス名 • Comparator<String> を実装している • メソッドが3つある など…
8.
3つのメソッドとは? • コンストラクタ • compare
メソッド(具象型 (String型) の実装) • compare メソッド(インタフェースの実装) • 引数を String 型にキャストして、具象型の compare メ ソッドを呼ぶ処理 • 匿名クラスに限らず、ジェネリクスの具象メソッドを実装す ると、このようにコンパイルされるみたい
9.
意外と難しい…!
10.
ラムダの場合 • コンパイル時には、匿名クラスのような Main$1.class というファイルはできない •
メソッドの初回実行時に、メモリ上にクラスが 作られる • invokedynamic という命令を使っている
11.
ラムダ部分の javap 結果 •
LambdaMetafactory.metafactory メソッドで Comparator の実装クラスを作っている • これは何…?
12.
metafactory メソッドの中身 • InnerClassLambdaMetafactory
を生成 • その buildCallSite メソッドを呼んでいる • これは何…?
13.
buildCallSite メソッドの中身 • キャプチャの有無(ラムダの外にある変数へのアクセス)によっ て処理が分岐 •
これは何…?
14.
5分で説明するのは 無理!
15.
スキップして結果だけ見る • システムプロパティ jdk.internal.lambda.dumpProxyClasses にフォルダ を指定する •
動的に作ったラムダのクラスを出力してくれる → Main$$Lambda$1.class ファイルができる! 実行例: java -Djdk.internal.lambda.dumpProxyClasses=output Main
16.
javap してみる • compareメソッド(インタフェース実装)が、 Main.lambda$sortByLength$0メソッドを呼んで いるだけ
17.
Mainクラスをjavapしてみる • こっちにラムダの本体がある! • コンパイル時に作られていた •
インタフェースを継承実装したクラスだけが、実行 時に作られる
18.
まとめ • ラムダの実装は、コンパイル時に作られる部分 と実行時に作られる部分がある • キャプチャの有無(外側の変数へのアクセス)によって、 結果が変わりそう •
詳細は分かっていない… • 分かったこと • 5分ですべてを説明するのは無理
19.
ラムダの コンパイル結果を 5分で説明するよ @YujiSoftware ソースコード → https://git.io/JDEcy
Download now