実行時のメモリ構造 (1) jasmin の基礎とフレーム内動作

26
1 実実実実実実実実実 (1) Jasmin 実実実実実実実実実実実 2002 実 5 実 19 実 実実 実実 5/20 実実実

Upload: milla

Post on 19-Mar-2016

54 views

Category:

Documents


8 download

DESCRIPTION

実行時のメモリ構造 (1) Jasmin の基礎とフレーム内動作. 2002 年 5 月 19 日 海谷 治彦. 5/20 改訂版. JVM 内の基本構造 ( 大雑把 ). クラスファイルの 内容チェック. クラスデータを保存. クラス ファイル. クラスローダー. メソッドエリア. クラスローダー. クラスファイル. クラスローダー. クラスローダー. 実行 エンジン. ヒープエリア. ヒープエリア. ヒープエリア. Java スタック. ヒープ. 各実行スレッドのローカルデータ ( 実行経過 ) を保存. インスタンスデータを保存. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 実行時のメモリ構造 (1) Jasmin の基礎とフレーム内動作

1

実行時のメモリ構造 (1)Jasmin の基礎とフレーム内動

作2002 年 5 月 19 日

海谷 治彦

5/20 改訂版

Page 2: 実行時のメモリ構造 (1) Jasmin の基礎とフレーム内動作

2

JVM 内の基本構造 ( 大雑把 )

クラスローダークラスローダークラスローダークラスローダー

メソッドエリア

ヒープ

ヒープエリアヒープエリアヒープエリアJava スタック

クラスファイル

クラスファイル

クラスファイルの内容チェック クラスデータを保存

実行エンジン

各実行スレッドのローカルデータ ( 実行経過 ) を保存

インスタンスデータを保存

* 原著および教科書 p.15 をベースに書いた.リンク有教科書 p.15

Page 3: 実行時のメモリ構造 (1) Jasmin の基礎とフレーム内動作

3

Java スタック内の構造

オペランドスタック

ローカル変数

フレーム

オペランドスタック

ローカル変数

フレーム

オペランドスタック

ローカル変数

フレームプログラ

ムカウンタ スタック増減

•「フレーム」という要素のスタック.•フレームは, 1 回のメソッド呼び出しに対応.•フレーム内の計算のためにも,スタック(オペランドスタック)が利用されている.•詳細は「実行時の構造」の回にて.

例えば教科書 p.20 の図

Page 4: 実行時のメモリ構造 (1) Jasmin の基礎とフレーム内動作

4

本日のお題

• JVM のアセンブラ Jasmin の概要を学ぶ– 実行時の動作を追跡するのに必要な概念

• フレーム内の動作を学ぶ– 一メソッド呼び出し内での計算を理解.

Page 5: 実行時のメモリ構造 (1) Jasmin の基礎とフレーム内動作

5

言語の高級・低級

• 一般にマシンが直接解釈できる言語を低級言語,人に読みやすい言語を高級言語と呼ぶ.

• Java 回りの場合,– Java– Jasmin や Oolong などのアセンブラ言語– Java バイトコードの順で低レベル化する.

Page 6: 実行時のメモリ構造 (1) Jasmin の基礎とフレーム内動作

6

アセンブラ言語

• ほぼマシン語 ( ここではバイトコード )と一対一対応している多少人に読みやすい形式のプログラム記述形式.

• マシン語にある命令やアドレス,ラベル等を人の分かりやすいキーワードに置き換えているだけ.

• 本授業では, Jasmin というアセンブラ言語を使う.

Page 7: 実行時のメモリ構造 (1) Jasmin の基礎とフレーム内動作

7

処理系と言語の関係• 言語 : プログラミング言語の種類のこと

– ソースコード : 主に高級言語で書いたプログラムのことを言う.

– アセンブラ : アセンブラ言語で書いたプログラム.

• 処理系 : 言語処理系のこと.– コンパイラ : ソースコードからマシン語へ

の変換プログラム.– アセンブラ : アセンブラからマシン語への

変換プログラム

Page 8: 実行時のメモリ構造 (1) Jasmin の基礎とフレーム内動作

8

処理と言語の関係図テキストエディタ等でテキストを編集

Java 言語 (.java)Jasmin アセンブラ

javac コマンド

java コマンドで実行

java バイトコード (.class)

jasmin コマンド djava コマンド

この辺の話が中心とな

Page 9: 実行時のメモリ構造 (1) Jasmin の基礎とフレーム内動作

9

djava コマンド• 逆アセンブルツール : すなわちマシン語

からアセンブラに変換するプログラム.• 実体は java で書かれたプログラム• 典型的な使い方

djava なんとか .classで標準出力に jasmin アセンブラを出力.

• 教科書 p.7 付近参照. ( ちょっと違う )• 実演 (Iadd.java)

Page 10: 実行時のメモリ構造 (1) Jasmin の基礎とフレーム内動作

10

java と jasmin の関係• メソッド・属性ほぼ一対一対応してい

る.• jasmin では省略したデフォルト・コン

ストラクタの記述も出てくる. ( ここは対応してない. )

• jasmin でも型がある,すなわち,バイトコードレベルでの型がある. (p.65)

Page 11: 実行時のメモリ構造 (1) Jasmin の基礎とフレーム内動作

11

最も簡単な jasmin の例

int add(int a, int b){ return a+b; }

.method add(II)I .limit stack 2 .limit locals 3 iload_1 iload_2 iadd ireturn.end method

djava

java ソース ( 一部 )jasmin ソース ( 一部 )

本日はフレーム内計算しかしないので,他の部分には言及しない

全体比較は, iadd/cmp.html を参照

Page 12: 実行時のメモリ構造 (1) Jasmin の基礎とフレーム内動作

12

良く似た jasmin の例

int add2(int a, int b){ int c; c=a+b; return c; }

.method add2(II)I .limit stack 2 .limit locals 4 iload_1 iload_2 iadd istore_3 iload_3 ireturn.end method

djava

java ソース ( 一部 )

jasmin ソース ( 一部 )

Page 13: 実行時のメモリ構造 (1) Jasmin の基礎とフレーム内動作

13

jasmin メソッドの基本構造( 例 )

• 青字部分は予約語• フレーム内のオペラ

ンドスタックの長さを指定.

• 同ローカル変数のサイズを指定.

• 残り 4 行が命令文

.method add(II)I .limit stack 2 .limit locals 3 iload_1 iload_2 iadd ireturn.end method

Page 14: 実行時のメモリ構造 (1) Jasmin の基礎とフレーム内動作

14

jasmin メソッドの引数 ( 例 )

• (II)I は引数と返り値の型を規定.– II 整数が二つ– I 整数が 1 つ

.method add(II)I .limit stack 2 .limit locals 3 iload_1 iload_2 iadd ireturn.end method

int add(int a, int b){ return a+b; }

Page 15: 実行時のメモリ構造 (1) Jasmin の基礎とフレーム内動作

15

jasmin の基本型 +α

ディスクリプタ J ava言語の型B byteC charD doubleF floatI intJ longS shortZ booleanV (void)

教科書 p.65 p.216 参照

Page 16: 実行時のメモリ構造 (1) Jasmin の基礎とフレーム内動作

16

ローカル変数の対応• 3 つあるという意味.• 0 から順に番号付け

されている..method add(II)I .limit stack 2 .limit locals 3 iload_1 iload_2 iadd ireturn.end method

int add(int a, int b){ return a+b; }

インスタンスへのリファレンス

0 番1 番 2 番

Page 17: 実行時のメモリ構造 (1) Jasmin の基礎とフレーム内動作

17

他の例のローカル変数の対応

int add2(int a, int b){ int c; c=a+b; return c; }

.method add2(II)I .limit stack 2 .limit locals 4 iload_1 iload_2 iadd istore_3 iload_3 ireturn.end method インスタンスへのリファレンス

0 番

1 番 2 番

3 番

Page 18: 実行時のメモリ構造 (1) Jasmin の基礎とフレーム内動作

18

フレーム内計算の例 1/3

教科書 p.29 とほぼ同じ

.method add2(II)I .limit stack 2 .limit locals 4 iload_1 iload_2 iadd istore_3 iload_3 ireturn.end method

add2(600, 123) を呼ぶ場合.

600123

0123

ローカル変数 スタック

iload_1

600123

0123

ローカル変数 スタック

iload_2

600

Page 19: 実行時のメモリ構造 (1) Jasmin の基礎とフレーム内動作

19

フレーム内計算の例 2/3

教科書 p.29 とほぼ同じ

.method add2(II)I .limit stack 2 .limit locals 4 iload_1 iload_2 iadd istore_3 iload_3 ireturn.end method

add2(600, 123) を呼ぶ場合.

600123

0123

ローカル変数 スタック

iadd

600123

0123

ローカル変数 スタック

istore_3

600123

723

Page 20: 実行時のメモリ構造 (1) Jasmin の基礎とフレーム内動作

20

フレーム内計算の例 3/3

教科書 p.29 とほぼ同じ

.method add2(II)I .limit stack 2 .limit locals 4 iload_1 iload_2 iadd istore_3 iload_3 ireturn.end method

add2(600, 123) を呼ぶ場合

600123723

0123

ローカル変数 スタック

iload_3

600123723

0123

ローカル変数 スタック

ireturn

723

( フレーム自体が消滅,来週の話 )

Page 21: 実行時のメモリ構造 (1) Jasmin の基礎とフレーム内動作

21

Java スタック内の構造

オペランドスタック

ローカル変数

フレーム

オペランドスタック

ローカル変数

フレーム

オペランドスタック

ローカル変数

フレームプログラ

ムカウンタ スタック増減

•「フレーム」という要素のスタック.•フレームは, 1 回のメソッド呼び出しに対応.•フレーム内の計算のためにも,スタック(オペランドスタック)が利用されている.•詳細は「実行時の構造」の回にて.

例えば教科書 p.20 の図

再掲載

Page 22: 実行時のメモリ構造 (1) Jasmin の基礎とフレーム内動作

22

フレーム内計算のテキスト表現

.method add2(II)I .limit stack 2 .limit locals 4 iload_1 iload_2 iadd istore_3 iload_3 ireturn.end method

add2(600, 123) を呼ぶ場合local=[this, 600, 123, ] stack=[]iload_1local=[this, 600, 123, ] stack=[600]iload_2local=[this, 600, 123, ] stack=[600, 123]iaddlocal=[this, 600, 123, ] stack=[723]istore_3local=[this, 600, 123, 723] stack=[]iload_3local=[this, 600, 123, 723] stack=[723]ireturn

Page 23: 実行時のメモリ構造 (1) Jasmin の基礎とフレーム内動作

23

stack 長は必要最低限である

.method add2(II)I .limit stack 2 .limit locals 4 iload_1 iload_2 iadd istore_3 iload_3 ireturn.end method

add2(600, 123) を呼ぶ場合local=[this, 600, 123, ] stack=[]iload_1local=[this, 600, 123, ] stack=[600]iload_2local=[this, 600, 123, ] stack=[600, 123]iaddlocal=[this, 600, 123, ] stack=[723]istore_3local=[this, 600, 123, 723] stack=[]iload_3local=[this, 600, 123, 723] stack=[723]ireturn

Page 24: 実行時のメモリ構造 (1) Jasmin の基礎とフレーム内動作

24

if 文の展開例

int larger(int a, int b){ int c; if(a>b) c=a; else c=b; return c; }

.method larger(II)I .limit stack 2 .limit locals 4 iload_1 iload_2 if_icmple Label1 iload_1 istore_3 goto Label2Label1: iload_2 istore_3Label2: iload_3 ireturn.end method

フレーム内の計算過程は, ifelse/exe.html を参照.

① ②③

Page 25: 実行時のメモリ構造 (1) Jasmin の基礎とフレーム内動作

25

ループの展開の例

int forLoop(int n){ int s=0;

for(int c=0; c<n; c++) s+=c;

return s; }

.method forLoop(I)I .limit stack 2 .limit locals 4 iconst_0 istore_2 iconst_0 istore_3 goto Label2

Label1: iload_2 iload_3 iadd istore_2 iinc 3 1Label2: iload_3 iload_1 if_icmplt Label1 iload_2 ireturn.end method

djava

①② ③

単に 0 から n-1 まで加算するルーチン

Page 26: 実行時のメモリ構造 (1) Jasmin の基礎とフレーム内動作

26

ループの実行例

• 長いので web ページ参照– loop/exe.html

• 実は for も while もほとんど同じ形に展開される– loop/cmp.html