SlideShare ist ein Scribd-Unternehmen logo
1 von 61
わかる !Java バイトコード ―  30 分でわからない ?Java バイトコード入門 筑波大学大学院 システム情報工学研究科 博士後期課程 水島宏太
自己紹介とか ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Agenda ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Javaバイトコードとは ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Hello, World!を逆アセンブルする public class Hello { public static void main(String[] args){ System.out.println("Hello, World!"); } } ↓ public static void main(java.lang.String[]); Code: 0:  getstatic  #2; //Field java/lang/System.out:Ljava/io/PrintStream; 3:  ldc  #3; //String Hello, World! 5:  invokevirtual  #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 8:  return
Hello, World!を読む ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
スタックマシン ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
スタックマシンの動作イメージ var pc: int var ops: byte[] ... while(pc < ops.length) { switch(ops[pc]) { case ADD: r = pop; l = pop; push(l + r); case SUB: r = pop; l = pop; push(l - r); case DIV: ... } pc++; }
型システム ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
実際の型と計算上の型とカテゴリ ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
実際の型と計算上の型とカテゴリ 2 double double 2 long long 1 returnAddress returnAddress 1 reference reference 1 float float 1 int int 1 int short 1 int char 1 int byte 1 int boolean カテゴリ 計算上の型 実際の型
命令の分類 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
ロード / ストア命令  (1) –  定数をオペランドスタックにロードする命令 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
bipush ,[object Object],[object Object],[object Object],[object Object],[object Object]
ldc ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
ロード / ストア命令  (2) –  ローカル変数の値をオペランドスタックにロードする ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
iload ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
fload ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
ロード / ストア命令  (3) –  値をローカル変数にストアする ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
istore ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
fstore ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
算術命令 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
iadd ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
lsub ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
型変換命令 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
i2l ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
i2b ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
配列関係の命令 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
newarray ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
arraylength ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
オブジェクトの生成・操作 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
new ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
getstatic ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
スタック管理命令 ,[object Object],[object Object],[object Object],[object Object],[object Object]
pop ,[object Object],[object Object],[object Object],[object Object],[object Object]
dup ,[object Object],[object Object],[object Object],[object Object],[object Object]
制御命令 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
goto ,[object Object],[object Object],[object Object],[object Object],[object Object]
ifeq ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
例外のスロー ,[object Object],[object Object]
athrow ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
同期化命令 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
メソッド呼び出し関係の命令 ,[object Object],[object Object],[object Object],[object Object],[object Object]
invokestatic ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
invokevirtual ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
使われなくなった命令 ,[object Object],[object Object],[object Object],[object Object],[object Object]
クラスファイルベリファイア ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
[object Object],[object Object],[object Object],[object Object],ベリファイアがはねるプログラム (1) –  スタックオーバーフロー .class public Overflow .super java/lang/Object .method public static main([Ljava/lang/String;)V .limit stack 2 LABEL: ldc &quot;Hello, World!&quot; goto LABEL return .end method
[object Object],[object Object],[object Object],ベリファイアがはねるプログラム (2) –  未初期化ローカル変数へのアクセス .class public Uninitialized .super java/lang/Object .method public static main([Ljava/lang/String;)V .limit stack 2 .limit locals 3 iload_1 return .end method
[object Object],[object Object],[object Object],ベリファイアがはねるプログラム (3)  -  型エラー .class public Incompatible .super java/lang/Object .method public static main([Ljava/lang/String;)V .limit stack 2 ldc 3.5 ldc 4.0 iadd return .end method
[object Object],[object Object],[object Object],ベリファイアがはねるプログラム (4)  -  カテゴリ間違い .class public PopLong .super java/lang/Object .method public static main([Ljava/lang/String;)V .limit stack 3 invokestatic java/lang/System/currentTimeMillis()J pop  ; pop2 なら OK . pop はカテゴリ 1 の値しか pop できないが long はカテゴリ 2 return .end method
練習問題 ,[object Object],[object Object],import java.util.Scanner; public class CalcSum { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while(scanner.hasNext()) { int result = 0; String[] line = scanner.nextLine().split(&quot;,&quot;); for(String element:line) result += Integer.parseInt(element); System.out.println(&quot;result:&quot; + result); } } }
練習問題 ,[object Object],public class CalcSum { ↓ Compiled from &quot;CalcSum.java&quot; public class CalcSum extends java.lang.Object{ public CalcSum(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object.&quot;<init>&quot;:()V 4: return
練習問題 ,[object Object],public static void main(String[] args) { Scanner scanner = new Scanner(System.in); ↓ public static void main(java.lang.String[]); Code: 0: new #2; //class java/util/Scanner 3: dup 4: getstatic #3; //Field java/lang/System.in:Ljava/io/InputStream; 7: invokespecial #4; //Method java/util/Scanner.&quot;<init>&quot;:(Ljava/io/InputStream;)V 10: astore_1
練習問題 ,[object Object],while(scanner.hasNext()) { ↓ 11: aload_1 12: invokevirtual #5; //Method java/util/Scanner.hasNext:()Z 15: ifeq 97
練習問題 ,[object Object],int result = 0; String[] line = scanner.nextLine().split(&quot;,&quot;); ↓ 18: iconst_0 19: istore_2 20: aload_1 21: invokevirtual #6; //Method java/util/Scanner.nextLine:()Ljava/lang/String; 24: ldc #7; //String , 26: invokevirtual #8; //Method java/lang/String.split:(Ljava/lang/String;)[Ljava/lang/String; 29: astore_3 30: aload_3 31: astore 4
練習問題 ,[object Object],for(String element:line) result += Integer.parseInt(element); ↓ 33: aload 4 35: arraylength 36: istore 5 38: iconst_0 39: istore 6 41: iload 6 43: iload 5 45: if_icmpge 69 48: aload 4 50: iload 6 52: aaload 53: astore 7 55: iload_2 56: aload 7 58: invokestatic #9; //Method java/lang/Integer.parseInt:(Ljava/lang/String;)I 61: iadd 62: istore_2 63: iinc 6, 1 66: goto 41
練習問題 ,[object Object],System.out.println(&quot;result:&quot; + result); } } } ↓ 69: getstatic #10; //Field java/lang/System.out:Ljava/io/PrintStream; 72: new #11; //class java/lang/StringBuilder 75: dup 76: invokespecial #12; //Method java/lang/StringBuilder.&quot;<init>&quot;:()V 79: ldc #13; //String result: 81: invokevirtual #14; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 84: iload_2 85: invokevirtual #15; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder; 88: invokevirtual #16; //Method java/lang/StringBuilder.toString:()Ljava/lang/String; 91: invokevirtual #17; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 94: goto 11 97: return }
知っていると役に立つ ( かもしれない )javap のオプション ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
何が嬉しいの? ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
まとめ ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]

Weitere ähnliche Inhalte

Was ist angesagt?

例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14Ryo Suzuki
 
ゲームエンジニアのためのデータベース設計
ゲームエンジニアのためのデータベース設計ゲームエンジニアのためのデータベース設計
ゲームエンジニアのためのデータベース設計sairoutine
 
.NET Core 3.0時代のメモリ管理
.NET Core 3.0時代のメモリ管理.NET Core 3.0時代のメモリ管理
.NET Core 3.0時代のメモリ管理KageShiron
 
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Masahito Zembutsu
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門大樹 小倉
 
イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化Gosuke Miyashita
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」Masahito Zembutsu
 
Rustに触れて私のPythonはどう変わったか
Rustに触れて私のPythonはどう変わったかRustに触れて私のPythonはどう変わったか
Rustに触れて私のPythonはどう変わったかShunsukeNakamura17
 
ドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解するドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する増田 亨
 
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門Fixstars Corporation
 
KiCadで雑に基板を作る チュートリアル
KiCadで雑に基板を作る チュートリアルKiCadで雑に基板を作る チュートリアル
KiCadで雑に基板を作る チュートリアル裕士 常田
 
DockerコンテナでGitを使う
DockerコンテナでGitを使うDockerコンテナでGitを使う
DockerコンテナでGitを使うKazuhiro Suga
 
WebAssembly向け多倍長演算の実装
WebAssembly向け多倍長演算の実装WebAssembly向け多倍長演算の実装
WebAssembly向け多倍長演算の実装MITSUNARI Shigeo
 
Rust で RTOS を考える
Rust で RTOS を考えるRust で RTOS を考える
Rust で RTOS を考えるryuz88
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?Yoshitaka Kawashima
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門masayoshi takahashi
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチンyohhoy
 

Was ist angesagt? (20)

例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
 
ゲームエンジニアのためのデータベース設計
ゲームエンジニアのためのデータベース設計ゲームエンジニアのためのデータベース設計
ゲームエンジニアのためのデータベース設計
 
.NET Core 3.0時代のメモリ管理
.NET Core 3.0時代のメモリ管理.NET Core 3.0時代のメモリ管理
.NET Core 3.0時代のメモリ管理
 
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」
 
Rustに触れて私のPythonはどう変わったか
Rustに触れて私のPythonはどう変わったかRustに触れて私のPythonはどう変わったか
Rustに触れて私のPythonはどう変わったか
 
ドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解するドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する
 
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
 
KiCadで雑に基板を作る チュートリアル
KiCadで雑に基板を作る チュートリアルKiCadで雑に基板を作る チュートリアル
KiCadで雑に基板を作る チュートリアル
 
DockerコンテナでGitを使う
DockerコンテナでGitを使うDockerコンテナでGitを使う
DockerコンテナでGitを使う
 
WebAssembly向け多倍長演算の実装
WebAssembly向け多倍長演算の実装WebAssembly向け多倍長演算の実装
WebAssembly向け多倍長演算の実装
 
Glibc malloc internal
Glibc malloc internalGlibc malloc internal
Glibc malloc internal
 
Rust で RTOS を考える
Rust で RTOS を考えるRust で RTOS を考える
Rust で RTOS を考える
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
 

Andere mochten auch

JVMの中身を可視化してみた
JVMの中身を可視化してみたJVMの中身を可視化してみた
JVMの中身を可視化してみたKengo Toda
 
JJUG CCC 2015 Spring 「新人エンジニア奮闘記 - Javaって何?からwebサービスを公開するまで -」発表スライド
JJUG CCC 2015 Spring 「新人エンジニア奮闘記 - Javaって何?からwebサービスを公開するまで -」発表スライドJJUG CCC 2015 Spring 「新人エンジニア奮闘記 - Javaって何?からwebサービスを公開するまで -」発表スライド
JJUG CCC 2015 Spring 「新人エンジニア奮闘記 - Javaって何?からwebサービスを公開するまで -」発表スライドToshiakiArai
 
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みJavaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みChihiro Ito
 
10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!bitter_fox
 
先駆的研究テーマ mruby/c
先駆的研究テーマ mruby/c先駆的研究テーマ mruby/c
先駆的研究テーマ mruby/cshimane-itoc
 
クラスローダーについて
クラスローダーについてクラスローダーについて
クラスローダーについてSuguru ARAKAWA
 
Vimから見たemacs
Vimから見たemacsVimから見たemacs
Vimから見たemacsShougo
 
プログラミング超超超入門
プログラミング超超超入門プログラミング超超超入門
プログラミング超超超入門rigibun
 
情報編集 (web) 第4回:HTML入門 3 情報を整理する - リスト、テーブル
情報編集 (web) 第4回:HTML入門 3 情報を整理する - リスト、テーブル情報編集 (web) 第4回:HTML入門 3 情報を整理する - リスト、テーブル
情報編集 (web) 第4回:HTML入門 3 情報を整理する - リスト、テーブルAtsushi Tadokoro
 
Google検索だけで満足しない、一歩先をいく収集・整理術(1day)
Google検索だけで満足しない、一歩先をいく収集・整理術(1day)Google検索だけで満足しない、一歩先をいく収集・整理術(1day)
Google検索だけで満足しない、一歩先をいく収集・整理術(1day)龍太郎(Ryutaro) 井元(Imoto)
 
Java の Collection 関連について整理してみました
Java の Collection 関連について整理してみましたJava の Collection 関連について整理してみました
Java の Collection 関連について整理してみましたGaprot
 
僕のデスクトップ整理方法
僕のデスクトップ整理方法僕のデスクトップ整理方法
僕のデスクトップ整理方法Kenta Komori
 
データを整理するための基礎知識
データを整理するための基礎知識データを整理するための基礎知識
データを整理するための基礎知識Gen Fujita
 
再入門、サーバープッシュ技術
再入門、サーバープッシュ技術再入門、サーバープッシュ技術
再入門、サーバープッシュ技術Shin Sekaryo
 
201412ことばの理解とワーキングメモリ:基本概念の整理(公開)
201412ことばの理解とワーキングメモリ:基本概念の整理(公開)201412ことばの理解とワーキングメモリ:基本概念の整理(公開)
201412ことばの理解とワーキングメモリ:基本概念の整理(公開)Kosuke Sugai
 
再入門!RESTとSpringMVC
再入門!RESTとSpringMVC再入門!RESTとSpringMVC
再入門!RESTとSpringMVCterahide
 

Andere mochten auch (20)

JVMの中身を可視化してみた
JVMの中身を可視化してみたJVMの中身を可視化してみた
JVMの中身を可視化してみた
 
JJUG CCC 2015 Spring 「新人エンジニア奮闘記 - Javaって何?からwebサービスを公開するまで -」発表スライド
JJUG CCC 2015 Spring 「新人エンジニア奮闘記 - Javaって何?からwebサービスを公開するまで -」発表スライドJJUG CCC 2015 Spring 「新人エンジニア奮闘記 - Javaって何?からwebサービスを公開するまで -」発表スライド
JJUG CCC 2015 Spring 「新人エンジニア奮闘記 - Javaって何?からwebサービスを公開するまで -」発表スライド
 
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みJavaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組み
 
10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!
 
Stack on JavaVM
Stack on JavaVMStack on JavaVM
Stack on JavaVM
 
先駆的研究テーマ mruby/c
先駆的研究テーマ mruby/c先駆的研究テーマ mruby/c
先駆的研究テーマ mruby/c
 
クラスローダーについて
クラスローダーについてクラスローダーについて
クラスローダーについて
 
Vimから見たemacs
Vimから見たemacsVimから見たemacs
Vimから見たemacs
 
プログラミング超超超入門
プログラミング超超超入門プログラミング超超超入門
プログラミング超超超入門
 
情報編集 (web) 第4回:HTML入門 3 情報を整理する - リスト、テーブル
情報編集 (web) 第4回:HTML入門 3 情報を整理する - リスト、テーブル情報編集 (web) 第4回:HTML入門 3 情報を整理する - リスト、テーブル
情報編集 (web) 第4回:HTML入門 3 情報を整理する - リスト、テーブル
 
Google検索だけで満足しない、一歩先をいく収集・整理術(1day)
Google検索だけで満足しない、一歩先をいく収集・整理術(1day)Google検索だけで満足しない、一歩先をいく収集・整理術(1day)
Google検索だけで満足しない、一歩先をいく収集・整理術(1day)
 
Java の Collection 関連について整理してみました
Java の Collection 関連について整理してみましたJava の Collection 関連について整理してみました
Java の Collection 関連について整理してみました
 
僕のデスクトップ整理方法
僕のデスクトップ整理方法僕のデスクトップ整理方法
僕のデスクトップ整理方法
 
データを整理するための基礎知識
データを整理するための基礎知識データを整理するための基礎知識
データを整理するための基礎知識
 
再入門、サーバープッシュ技術
再入門、サーバープッシュ技術再入門、サーバープッシュ技術
再入門、サーバープッシュ技術
 
201412ことばの理解とワーキングメモリ:基本概念の整理(公開)
201412ことばの理解とワーキングメモリ:基本概念の整理(公開)201412ことばの理解とワーキングメモリ:基本概念の整理(公開)
201412ことばの理解とワーキングメモリ:基本概念の整理(公開)
 
再入門!RESTとSpringMVC
再入門!RESTとSpringMVC再入門!RESTとSpringMVC
再入門!RESTとSpringMVC
 
SSL入門
SSL入門SSL入門
SSL入門
 
Docker超入門
Docker超入門Docker超入門
Docker超入門
 
HTTP/2入門
HTTP/2入門HTTP/2入門
HTTP/2入門
 

Ähnlich wie Javaバイトコード入門

BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdfHiroshi Ono
 
详细介绍什么是Java虚拟机(JVM)介绍资料
详细介绍什么是Java虚拟机(JVM)介绍资料详细介绍什么是Java虚拟机(JVM)介绍资料
详细介绍什么是Java虚拟机(JVM)介绍资料wensheng wei
 
How did yarv2llvm fail
How did yarv2llvm failHow did yarv2llvm fail
How did yarv2llvm failmiura1729
 
Boostのあるプログラミング生活
Boostのあるプログラミング生活Boostのあるプログラミング生活
Boostのあるプログラミング生活Akira Takahashi
 
帰って来たNemerle
帰って来たNemerle帰って来たNemerle
帰って来たNemerleKota Mizushima
 
C++模板与泛型编程
C++模板与泛型编程C++模板与泛型编程
C++模板与泛型编程deer hope
 
C++模板与泛型编程
C++模板与泛型编程C++模板与泛型编程
C++模板与泛型编程deer hope
 

Ähnlich wie Javaバイトコード入門 (8)

BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdf
 
详细介绍什么是Java虚拟机(JVM)介绍资料
详细介绍什么是Java虚拟机(JVM)介绍资料详细介绍什么是Java虚拟机(JVM)介绍资料
详细介绍什么是Java虚拟机(JVM)介绍资料
 
How did yarv2llvm fail
How did yarv2llvm failHow did yarv2llvm fail
How did yarv2llvm fail
 
Boostのあるプログラミング生活
Boostのあるプログラミング生活Boostのあるプログラミング生活
Boostのあるプログラミング生活
 
帰って来たNemerle
帰って来たNemerle帰って来たNemerle
帰って来たNemerle
 
JVM 学习笔记
JVM 学习笔记JVM 学习笔记
JVM 学习笔记
 
C++模板与泛型编程
C++模板与泛型编程C++模板与泛型编程
C++模板与泛型编程
 
C++模板与泛型编程
C++模板与泛型编程C++模板与泛型编程
C++模板与泛型编程
 

Mehr von Kota Mizushima

ドワンゴにおける新卒エンジニア向けScala研修について
ドワンゴにおける新卒エンジニア向けScala研修についてドワンゴにおける新卒エンジニア向けScala研修について
ドワンゴにおける新卒エンジニア向けScala研修についてKota Mizushima
 
株式会社ドワンゴにおけるScala教育の現状
株式会社ドワンゴにおけるScala教育の現状株式会社ドワンゴにおけるScala教育の現状
株式会社ドワンゴにおけるScala教育の現状Kota Mizushima
 
Scala Daysに行ってみて - あるいはスイス旅行記 -
Scala Daysに行ってみて - あるいはスイス旅行記 -Scala Daysに行ってみて - あるいはスイス旅行記 -
Scala Daysに行ってみて - あるいはスイス旅行記 -Kota Mizushima
 
Scalaの現状と今後
Scalaの現状と今後Scalaの現状と今後
Scalaの現状と今後Kota Mizushima
 
Scala Performance Tuning Tips
Scala Performance Tuning TipsScala Performance Tuning Tips
Scala Performance Tuning TipsKota Mizushima
 
こわくない型クラス
こわくない型クラスこわくない型クラス
こわくない型クラスKota Mizushima
 
About Capabilities for Uniqueness and Borrowing
About Capabilities for Uniqueness and BorrowingAbout Capabilities for Uniqueness and Borrowing
About Capabilities for Uniqueness and BorrowingKota Mizushima
 
Scala Macros makes it easy to provide useful libraries
Scala Macros makes it easy to provide useful librariesScala Macros makes it easy to provide useful libraries
Scala Macros makes it easy to provide useful librariesKota Mizushima
 
Scala + Finagleの魅力
Scala + Finagleの魅力Scala + Finagleの魅力
Scala + Finagleの魅力Kota Mizushima
 
Scalaの現状と課題
Scalaの現状と課題Scalaの現状と課題
Scalaの現状と課題Kota Mizushima
 
Scalaでのプログラム開発
Scalaでのプログラム開発Scalaでのプログラム開発
Scalaでのプログラム開発Kota Mizushima
 
日本Scalaユーザーズグループ発足
日本Scalaユーザーズグループ発足日本Scalaユーザーズグループ発足
日本Scalaユーザーズグループ発足Kota Mizushima
 
Implicit Implicit Scala
Implicit Implicit ScalaImplicit Implicit Scala
Implicit Implicit ScalaKota Mizushima
 
Implicit Explicit Scala
Implicit Explicit ScalaImplicit Explicit Scala
Implicit Explicit ScalaKota Mizushima
 

Mehr von Kota Mizushima (20)

ドワンゴにおける新卒エンジニア向けScala研修について
ドワンゴにおける新卒エンジニア向けScala研修についてドワンゴにおける新卒エンジニア向けScala研修について
ドワンゴにおける新卒エンジニア向けScala研修について
 
kollectionの紹介
kollectionの紹介kollectionの紹介
kollectionの紹介
 
株式会社ドワンゴにおけるScala教育の現状
株式会社ドワンゴにおけるScala教育の現状株式会社ドワンゴにおけるScala教育の現状
株式会社ドワンゴにおけるScala教育の現状
 
Macros in nemerle
Macros in nemerleMacros in nemerle
Macros in nemerle
 
Scala Daysに行ってみて - あるいはスイス旅行記 -
Scala Daysに行ってみて - あるいはスイス旅行記 -Scala Daysに行ってみて - あるいはスイス旅行記 -
Scala Daysに行ってみて - あるいはスイス旅行記 -
 
Introduction to PEG
Introduction to PEGIntroduction to PEG
Introduction to PEG
 
Scalaの現状と今後
Scalaの現状と今後Scalaの現状と今後
Scalaの現状と今後
 
Power of Scala
Power of ScalaPower of Scala
Power of Scala
 
Scala Performance Tuning Tips
Scala Performance Tuning TipsScala Performance Tuning Tips
Scala Performance Tuning Tips
 
こわくない型クラス
こわくない型クラスこわくない型クラス
こわくない型クラス
 
こわくないScala
こわくないScalaこわくないScala
こわくないScala
 
Scala is-unscared
Scala is-unscaredScala is-unscared
Scala is-unscared
 
About Capabilities for Uniqueness and Borrowing
About Capabilities for Uniqueness and BorrowingAbout Capabilities for Uniqueness and Borrowing
About Capabilities for Uniqueness and Borrowing
 
Scala Macros makes it easy to provide useful libraries
Scala Macros makes it easy to provide useful librariesScala Macros makes it easy to provide useful libraries
Scala Macros makes it easy to provide useful libraries
 
Scala + Finagleの魅力
Scala + Finagleの魅力Scala + Finagleの魅力
Scala + Finagleの魅力
 
Scalaの現状と課題
Scalaの現状と課題Scalaの現状と課題
Scalaの現状と課題
 
Scalaでのプログラム開発
Scalaでのプログラム開発Scalaでのプログラム開発
Scalaでのプログラム開発
 
日本Scalaユーザーズグループ発足
日本Scalaユーザーズグループ発足日本Scalaユーザーズグループ発足
日本Scalaユーザーズグループ発足
 
Implicit Implicit Scala
Implicit Implicit ScalaImplicit Implicit Scala
Implicit Implicit Scala
 
Implicit Explicit Scala
Implicit Explicit ScalaImplicit Explicit Scala
Implicit Explicit Scala
 

Javaバイトコード入門

  • 1. わかる !Java バイトコード ― 30 分でわからない ?Java バイトコード入門 筑波大学大学院 システム情報工学研究科 博士後期課程 水島宏太
  • 2.
  • 3.
  • 4.
  • 5. Hello, World!を逆アセンブルする public class Hello { public static void main(String[] args){ System.out.println(&quot;Hello, World!&quot;); } } ↓ public static void main(java.lang.String[]); Code: 0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 3: ldc #3; //String Hello, World! 5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 8: return
  • 6.
  • 7.
  • 8. スタックマシンの動作イメージ var pc: int var ops: byte[] ... while(pc < ops.length) { switch(ops[pc]) { case ADD: r = pop; l = pop; push(l + r); case SUB: r = pop; l = pop; push(l - r); case DIV: ... } pc++; }
  • 9.
  • 10.
  • 11. 実際の型と計算上の型とカテゴリ 2 double double 2 long long 1 returnAddress returnAddress 1 reference reference 1 float float 1 int int 1 int short 1 int char 1 int byte 1 int boolean カテゴリ 計算上の型 実際の型
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.