SlideShare a Scribd company logo
1 of 19
ラムダの
コンパイル結果を
5分で説明するよ
@YujiSoftware
https://yuji.software/
本日説明するソースコード
• 文字列の長さでソートする処理
• ラムダで、文字列の長さを比較
• ラムダの部分がコンパイルされた結果は?
• Java 17 で調べてみた
※ Collections.sort(list, Comparator.comparingInt(String::length)) の方がシンプル
おさらい:匿名クラスの場合
• ラムダを匿名クラスに置き換えた
匿名クラスをコンパイル
• クラス名$連番.class というファイルができる
• これを開いてみる
読めない
なぜ読めない?
• クラスファイルはテキストではない
• バイナリエディタで開くけば読める
• それでも読みにくい…
• もっと簡単に読みたい!
• JDK 付属の javap コマンドを使おう!
(クラスファイル逆アセンブラ)
• -v / -verbose (詳細表示)
• -p / -private(privateクラスも表示)
javap –verbose -private Main$1.class
匿名クラスを javap した内容
• 分かったこと
• Main$1 というクラス名
• Comparator<String> を実装している
• メソッドが3つある など…
3つのメソッドとは?
• コンストラクタ
• compare メソッド(具象型 (String型) の実装)
• compare メソッド(インタフェースの実装)
• 引数を String 型にキャストして、具象型の compare メ
ソッドを呼ぶ処理
• 匿名クラスに限らず、ジェネリクスの具象メソッドを実装す
ると、このようにコンパイルされるみたい
意外と難しい…!
ラムダの場合
• コンパイル時には、匿名クラスのような
Main$1.class というファイルはできない
• メソッドの初回実行時に、メモリ上にクラスが
作られる
• invokedynamic という命令を使っている
ラムダ部分の javap 結果
• LambdaMetafactory.metafactory メソッドで
Comparator の実装クラスを作っている
• これは何…?
metafactory メソッドの中身
• InnerClassLambdaMetafactory を生成
• その buildCallSite メソッドを呼んでいる
• これは何…?
buildCallSite メソッドの中身
• キャプチャの有無(ラムダの外にある変数へのアクセス)によっ
て処理が分岐
• これは何…?
5分で説明するのは
無理!
スキップして結果だけ見る
• システムプロパティ
jdk.internal.lambda.dumpProxyClasses にフォルダ
を指定する
• 動的に作ったラムダのクラスを出力してくれる
→ Main$$Lambda$1.class ファイルができる!
実行例:
java -Djdk.internal.lambda.dumpProxyClasses=output Main
javap してみる
• compareメソッド(インタフェース実装)が、
Main.lambda$sortByLength$0メソッドを呼んで
いるだけ
Mainクラスをjavapしてみる
• こっちにラムダの本体がある!
• コンパイル時に作られていた
• インタフェースを継承実装したクラスだけが、実行
時に作られる
まとめ
• ラムダの実装は、コンパイル時に作られる部分
と実行時に作られる部分がある
• キャプチャの有無(外側の変数へのアクセス)によって、
結果が変わりそう
• 詳細は分かっていない…
• 分かったこと
• 5分ですべてを説明するのは無理
ラムダの
コンパイル結果を
5分で説明するよ
@YujiSoftware
ソースコード
→ https://git.io/JDEcy

More Related Content

Similar to ラムダのコンパイル結果を5分で説明するよ​

演習:プログラミング言語処理をやってみよう
演習:プログラミング言語処理をやってみよう演習:プログラミング言語処理をやってみよう
演習:プログラミング言語処理をやってみようTakashi Ishio
 
Dark vol4 for_slideshare
Dark vol4 for_slideshareDark vol4 for_slideshare
Dark vol4 for_slideshareara_ta3
 
Scalaのimplicit、カリー化
Scalaのimplicit、カリー化Scalaのimplicit、カリー化
Scalaのimplicit、カリー化yuya-nakamura
 
20110820 metaprogramming
20110820 metaprogramming20110820 metaprogramming
20110820 metaprogrammingMasanori Kado
 
Scala再入門 @2014/02/08 Scala関西ビギナーズ第3回
Scala再入門 @2014/02/08 Scala関西ビギナーズ第3回Scala再入門 @2014/02/08 Scala関西ビギナーズ第3回
Scala再入門 @2014/02/08 Scala関西ビギナーズ第3回Asami Abe
 
PythonでWebDAVサーバーを作ろう②
PythonでWebDAVサーバーを作ろう②PythonでWebDAVサーバーを作ろう②
PythonでWebDAVサーバーを作ろう②iPride Co., Ltd.
 
社内Java8勉強会 ラムダ式とストリームAPI
社内Java8勉強会 ラムダ式とストリームAPI社内Java8勉強会 ラムダ式とストリームAPI
社内Java8勉強会 ラムダ式とストリームAPIAkihiro Ikezoe
 
食べログで動いている自作ライブラリのお話
食べログで動いている自作ライブラリのお話食べログで動いている自作ライブラリのお話
食べログで動いている自作ライブラリのお話Tsukasa Oishi
 
第一回社内 Scala 勉強会(一部抜粋)
第一回社内 Scala 勉強会(一部抜粋)第一回社内 Scala 勉強会(一部抜粋)
第一回社内 Scala 勉強会(一部抜粋)lyrical_logical
 
ラムダと invokedynamic の蜜月
ラムダと invokedynamic の蜜月ラムダと invokedynamic の蜜月
ラムダと invokedynamic の蜜月Taku Miyakawa
 
Vim scriptとJavaとHaskell
Vim scriptとJavaとHaskellVim scriptとJavaとHaskell
Vim scriptとJavaとHaskellaiya000
 
Beginners Scala in FAN 20121009
Beginners Scala in FAN 20121009Beginners Scala in FAN 20121009
Beginners Scala in FAN 20121009Taisuke Shiratori
 
プログラミングNet framework3のお題
プログラミングNet framework3のお題プログラミングNet framework3のお題
プログラミングNet framework3のお題Kazushi Kamegawa
 
Ruby on Rails 入門
Ruby on Rails 入門Ruby on Rails 入門
Ruby on Rails 入門Yasuko Ohba
 
Scala Daysに行ってみて
Scala Daysに行ってみてScala Daysに行ってみて
Scala Daysに行ってみてKota Mizushima
 
Java8から17へ
Java8から17へJava8から17へ
Java8から17へonozaty
 
Cookpad Summer Intern 2015 - Programming Paradigm
Cookpad Summer Intern 2015 - Programming ParadigmCookpad Summer Intern 2015 - Programming Paradigm
Cookpad Summer Intern 2015 - Programming ParadigmMinero Aoki
 

Similar to ラムダのコンパイル結果を5分で説明するよ​ (19)

演習:プログラミング言語処理をやってみよう
演習:プログラミング言語処理をやってみよう演習:プログラミング言語処理をやってみよう
演習:プログラミング言語処理をやってみよう
 
Dark vol4 for_slideshare
Dark vol4 for_slideshareDark vol4 for_slideshare
Dark vol4 for_slideshare
 
Scalaのimplicit、カリー化
Scalaのimplicit、カリー化Scalaのimplicit、カリー化
Scalaのimplicit、カリー化
 
20110820 metaprogramming
20110820 metaprogramming20110820 metaprogramming
20110820 metaprogramming
 
Scala再入門 @2014/02/08 Scala関西ビギナーズ第3回
Scala再入門 @2014/02/08 Scala関西ビギナーズ第3回Scala再入門 @2014/02/08 Scala関西ビギナーズ第3回
Scala再入門 @2014/02/08 Scala関西ビギナーズ第3回
 
PythonでWebDAVサーバーを作ろう②
PythonでWebDAVサーバーを作ろう②PythonでWebDAVサーバーを作ろう②
PythonでWebDAVサーバーを作ろう②
 
社内Java8勉強会 ラムダ式とストリームAPI
社内Java8勉強会 ラムダ式とストリームAPI社内Java8勉強会 ラムダ式とストリームAPI
社内Java8勉強会 ラムダ式とストリームAPI
 
MoteMote Compiler Plugin
MoteMote Compiler PluginMoteMote Compiler Plugin
MoteMote Compiler Plugin
 
食べログで動いている自作ライブラリのお話
食べログで動いている自作ライブラリのお話食べログで動いている自作ライブラリのお話
食べログで動いている自作ライブラリのお話
 
第一回社内 Scala 勉強会(一部抜粋)
第一回社内 Scala 勉強会(一部抜粋)第一回社内 Scala 勉強会(一部抜粋)
第一回社内 Scala 勉強会(一部抜粋)
 
ラムダと invokedynamic の蜜月
ラムダと invokedynamic の蜜月ラムダと invokedynamic の蜜月
ラムダと invokedynamic の蜜月
 
Vim scriptとJavaとHaskell
Vim scriptとJavaとHaskellVim scriptとJavaとHaskell
Vim scriptとJavaとHaskell
 
Beginners Scala in FAN 20121009
Beginners Scala in FAN 20121009Beginners Scala in FAN 20121009
Beginners Scala in FAN 20121009
 
プログラミングNet framework3のお題
プログラミングNet framework3のお題プログラミングNet framework3のお題
プログラミングNet framework3のお題
 
Ruby on Rails 入門
Ruby on Rails 入門Ruby on Rails 入門
Ruby on Rails 入門
 
Scala Daysに行ってみて
Scala Daysに行ってみてScala Daysに行ってみて
Scala Daysに行ってみて
 
Java8勉強会
Java8勉強会Java8勉強会
Java8勉強会
 
Java8から17へ
Java8から17へJava8から17へ
Java8から17へ
 
Cookpad Summer Intern 2015 - Programming Paradigm
Cookpad Summer Intern 2015 - Programming ParadigmCookpad Summer Intern 2015 - Programming Paradigm
Cookpad Summer Intern 2015 - Programming Paradigm
 

More from YujiSoftware

Javaはどれだけ速いのか
Javaはどれだけ速いのかJavaはどれだけ速いのか
Javaはどれだけ速いのかYujiSoftware
 
Java をクラッシュさせて遊んでみよう!
Java をクラッシュさせて遊んでみよう!Java をクラッシュさせて遊んでみよう!
Java をクラッシュさせて遊んでみよう!YujiSoftware
 
技術書を読むと眠くなる!これを解決するために取った10の対策
技術書を読むと眠くなる!これを解決するために取った10の対策技術書を読むと眠くなる!これを解決するために取った10の対策
技術書を読むと眠くなる!これを解決するために取った10の対策YujiSoftware
 
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_cccJEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_cccYujiSoftware
 
Java を今すぐダウンロードしてみたお話
Java を今すぐダウンロードしてみたお話Java を今すぐダウンロードしてみたお話
Java を今すぐダウンロードしてみたお話YujiSoftware
 
JVM言語を使ってみようの歌
JVM言語を使ってみようの歌JVM言語を使ってみようの歌
JVM言語を使ってみようの歌YujiSoftware
 
AtCoderで始めるテスト駆動開発
AtCoderで始めるテスト駆動開発AtCoderで始めるテスト駆動開発
AtCoderで始めるテスト駆動開発YujiSoftware
 
Javaでマサカリ投げてみた
Javaでマサカリ投げてみたJavaでマサカリ投げてみた
Javaでマサカリ投げてみたYujiSoftware
 
ジャバのはなし、JAVAのはなし、Javaのはなし
ジャバのはなし、JAVAのはなし、Javaのはなしジャバのはなし、JAVAのはなし、Javaのはなし
ジャバのはなし、JAVAのはなし、JavaのはなしYujiSoftware
 

More from YujiSoftware (9)

Javaはどれだけ速いのか
Javaはどれだけ速いのかJavaはどれだけ速いのか
Javaはどれだけ速いのか
 
Java をクラッシュさせて遊んでみよう!
Java をクラッシュさせて遊んでみよう!Java をクラッシュさせて遊んでみよう!
Java をクラッシュさせて遊んでみよう!
 
技術書を読むと眠くなる!これを解決するために取った10の対策
技術書を読むと眠くなる!これを解決するために取った10の対策技術書を読むと眠くなる!これを解決するために取った10の対策
技術書を読むと眠くなる!これを解決するために取った10の対策
 
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_cccJEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
 
Java を今すぐダウンロードしてみたお話
Java を今すぐダウンロードしてみたお話Java を今すぐダウンロードしてみたお話
Java を今すぐダウンロードしてみたお話
 
JVM言語を使ってみようの歌
JVM言語を使ってみようの歌JVM言語を使ってみようの歌
JVM言語を使ってみようの歌
 
AtCoderで始めるテスト駆動開発
AtCoderで始めるテスト駆動開発AtCoderで始めるテスト駆動開発
AtCoderで始めるテスト駆動開発
 
Javaでマサカリ投げてみた
Javaでマサカリ投げてみたJavaでマサカリ投げてみた
Javaでマサカリ投げてみた
 
ジャバのはなし、JAVAのはなし、Javaのはなし
ジャバのはなし、JAVAのはなし、Javaのはなしジャバのはなし、JAVAのはなし、Javaのはなし
ジャバのはなし、JAVAのはなし、Javaのはなし
 

ラムダのコンパイル結果を5分で説明するよ​