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

Slides:



Advertisements
Similar presentations
1 Reference, 配列,アクセスフラ グ, jdb での観察, アセンブラ上での編集 2002 年 6 月 6 日 海谷 治彦.
Advertisements

情報処理基礎 A ・ B 第 5 回 プログラミング入門 操作の自動化を実現する仕組み. 2004/11/16 ・ 17 情報処理基礎 A ・ B 2 本日の内容 処理の自動化~プログラムの概念 ハードウェアとソフトウェア プログラミング言語 Excel における処理の自動化 入力支援の機能 分析ツール.
オブジェクト指向 言語 論 知能情報学部 新田直也. 講義概要  私の研究室: 13 号館 2 階 (13-206)  講義資料について :  参考図書 : 河西朝雄 : 「原理がわかる プログラムの法則」,
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
プログラミング基礎I(再) 山元進.
ISD実習E 2009年6月29日 LISPシステム入門 (第5回) 関数ポインタ eval システム関数.
プログラミング入門 (教科書1~3章) 2005/04/14(Thu.).
クラスファイルの構造解析(1) 2002年6月16日 2003年6月8日 改訂 海谷 治彦.
情報工学基礎(改訂版) 岡崎裕之.
伺か with なでしこ 発表者:しらたま /05/05 うかべん大阪#3.
オブジェクト指向言語論 知能情報学部 新田直也.
Javaのインタフェース についての補足 2006年5月17日 海谷 治彦.
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
プログラミング演習II 2004年10月19日(第1回) 理学部数学科・木村巌.
プログラミング言語論 理工学部 情報システム工学科 新田直也.
プログラミング言語論 理工学部 情報システム工学科 新田直也.
Java2セキュリティ, クラスローダー,ベリファイア
繰り返し プログラミング 第4回 繰り返し プログラミング第4回.
例外,並行・同期処理,ゴミ集め 2002年7月7日 海谷 治彦.
の まとめ 2007/04/02 (Mon) / d;id:hzkr
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
進捗 Javaバイトコード変換による 細粒度CPU資源管理
実行時のメモリ構造(2) Javaスタック内動作他
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
プログラミング言語入門 手続き型言語としてのJava
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
Cプログラミング演習 第7回 メモリ内でのデータの配置.
コンピュータ系実験Ⅲ 「ワンチップマイコンの応用」 第1週目 アセンブリ言語講座
プログラミング言語入門.
Integer Java Virtual Machine
Java Bytecode Modification and Applet Security
クラスファイルの構造解析(2) 2003年6月23日 海谷 治彦.
TA 高田正法 B10 CPUを作る 3日目 SPIMの改造 TA 高田正法
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
Javaバイトコードの 動的依存解析情報を用いた スライシングシステムの実現
計算機構成 第3回 データパス:計算をするところ テキスト14‐19、29‐35
バイトコードを単位とするJavaスライスシステムの試作
アルゴリズムとデータ構造 2010年7月26日
オブジェクト指向プログラミングと開発環境
第5章 計算とプログラム 本章で説明すること ・計算の概観と記述法 ・代表的な計算モデル ・プログラムとプログラム言語.
先週の復習: CPU が働く仕組み コンピュータの構造 pp 制御装置+演算装置+レジスタ 制御装置がなければ電卓と同様
new Calc(7,3).divInt()実行前
配列変数とポインタ 静的確保と動的確保 ポインタ配列 2次元配列 時間計測 第1回レポートの課題
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
Javaバーチャルマシンを利用した 動的依存関係解析手法の提案
JAVAバイトコードにおける データ依存解析手法の提案と実装
オブジェクト プログラミング 第2回 プログラムの基本.
IF文 START もしも宝くじが当たったら 就職活動する 就職活動しない YES END NO.
プログラムが実行されるまで 2002年4月14日 海谷 治彦.
計算機プログラミングI 木曜日 1時限・5時限 担当: 増原英彦 第1回 2002年10月10日(木)
アルゴリズムとデータ構造1 2008年7月24日
コンピュータアーキテクチャ 第 2 回.
第5章 計算とプログラム 本章で説明すること ・計算の概観と記述法 ・代表的な計算モデル ・プログラムとプログラム言語 1.
Javaスタック ヒープ (インスタンス置き場) <init> i1215 i1512 r= r= | locals | =4
アルゴリズムとデータ構造1 2009年6月15日
復習 if ~ 選択制御文(条件分岐) カッコが必要 true 条件 false 真(true)なら この中が aを2倍する 実行される
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
プログラミング基礎a 第9回 Java言語による図形処理入門(1) Javaアプレット入門
コンパイラ 2012年10月11日
Inline 展開のアルゴリズム 長谷川啓
アルゴリズムとデータ構造 2010年6月17日
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
オブジェクト指向言語論 第一回 知能情報学部 新田直也.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
関数と再帰 教科書13章 電子1(木曜クラス) 2005/06/22(Thu.).
C#プログラミング実習 第1回.
1.2 言語処理の諸観点 (1)言語処理の利用分野
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
Presentation transcript:

実行時のメモリ構造(1) Jasminの基礎とフレーム内動作 2002年5月19日 海谷 治彦 5/20改訂版

JVM内の基本構造(大雑把) クラスファイルの 内容チェック クラスデータを保存 クラス ファイル クラスローダー メソッドエリア 実行 エンジン ヒープエリア ヒープエリア ヒープエリア Javaスタック ヒープ 各実行スレッドのローカルデータ(実行経過)を保存 インスタンスデータを保存 教科書 p.15 * 原著および教科書p.15をベースに書いた. リンク有

Javaスタック内の構造 フレーム フレーム フレーム 「フレーム」という要素のスタック. フレームは,1回のメソッド呼び出しに対応. オペランド スタック ローカル 変数 フレーム オペランド スタック ローカル 変数 フレーム オペランド スタック ローカル 変数 フレーム プログラム カウンタ スタック増減 「フレーム」という要素のスタック. フレームは,1回のメソッド呼び出しに対応. フレーム内の計算のためにも,スタック(オペランドスタック)が利用されている. 詳細は「実行時の構造」の回にて. 例えば教科書 p.20の図

本日のお題 JVMのアセンブラ Jasminの概要を学ぶ フレーム内の動作を学ぶ 実行時の動作を追跡するのに必要な概念 一メソッド呼び出し内での計算を理解.

言語の高級・低級 一般にマシンが直接解釈できる言語を低級言語,人に読みやすい言語を高級言語と呼ぶ. Java回りの場合, Java Jasmin や Oolong などのアセンブラ言語 Javaバイトコード の順で低レベル化する.

アセンブラ言語 ほぼマシン語(ここではバイトコード)と一対一対応している多少人に読みやすい形式のプログラム記述形式. マシン語にある命令やアドレス,ラベル等を人の分かりやすいキーワードに置き換えているだけ. 本授業では,Jasminというアセンブラ言語を使う.

処理系と言語の関係 言語: プログラミング言語の種類のこと 処理系: 言語処理系のこと. ソースコード: 主に高級言語で書いたプログラムのことを言う. アセンブラ: アセンブラ言語で書いたプログラム. 処理系: 言語処理系のこと. コンパイラ: ソースコードからマシン語への変換プログラム. アセンブラ: アセンブラからマシン語への変換プログラム

処理と言語の関係図 テキストエディタ等でテキストを編集 Java言語 (.java) この辺の話が中心となる Jasmin アセンブラ javacコマンド jasminコマンド djavaコマンド javaバイトコード(.class) javaコマンドで実行

djavaコマンド 逆アセンブルツール: すなわちマシン語からアセンブラに変換するプログラム. 実体はjavaで書かれたプログラム 典型的な使い方 djava なんとか.class で標準出力にjasminアセンブラを出力. 教科書p.7付近参照.(ちょっと違う) 実演 (Iadd.java)

javaとjasminの関係 メソッド・属性ほぼ一対一対応している. jasminでも型がある,すなわち,バイトコードレベルでの型がある.(p.65)

最も簡単なjasminの例 javaソース(一部) 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 全体比較は,iadd/cmp.html を参照 本日はフレーム内計算しかしないので, 他の部分には言及しない

良く似たjasminの例 javaソース(一部) int add2(int a, int b){ int c; jasminソース(一部) c=a+b; return c; } jasminソース(一部) .method add2(II)I .limit stack 2 .limit locals 4 iload_1 iload_2 iadd istore_3 iload_3 ireturn .end method djava

jasminメソッドの基本構造(例) .method add(II)I .limit stack 2 .limit locals 3 iload_1 iload_2 iadd ireturn .end method 青字部分は予約語 フレーム内のオペランドスタックの長さを指定. 同ローカル変数のサイズを指定. 残り4行が命令文

jasminメソッドの引数(例) .method add(II)I .limit stack 2 .limit locals 3 iload_1 iload_2 iadd ireturn .end method (II)Iは引数と返り値の型を規定. II 整数が二つ I 整数が1つ int add(int a, int b){ return a+b; }

jasminの基本型+α 教科書 p.65 p.216 参照

ローカル変数の対応 .method add(II)I .limit stack 2 .limit locals 3 iload_1 3つあるという意味. 0から順に番号付けされている. .method add(II)I .limit stack 2 .limit locals 3 iload_1 iload_2 iadd ireturn .end method 2番 1番 0番 int add(int a, int b){ return a+b; } インスタンスへのリファレンス

他の例のローカル変数の対応 .method add2(II)I .limit stack 2 .limit locals 4 iload_1 iadd istore_3 iload_3 ireturn .end method 2番 1番 int add2(int a, int b){ int c; c=a+b; return c; } 3番 0番 インスタンスへのリファレンス

フレーム内計算の例 1/3 .method add2(II)I .limit stack 2 .limit locals 4 iload_1 ローカル変数 スタック .method add2(II)I .limit stack 2 .limit locals 4 iload_1 iload_2 iadd istore_3 iload_3 ireturn .end method 1 600 2 123 3 iload_1 ローカル変数 スタック 1 600 2 123 3 600 iload_2 教科書p.29とほぼ同じ

フレーム内計算の例 2/3 .method add2(II)I .limit stack 2 .limit locals 4 iload_1 ローカル変数 スタック .method add2(II)I .limit stack 2 .limit locals 4 iload_1 iload_2 iadd istore_3 iload_3 ireturn .end method 1 600 2 123 123 3 600 iadd ローカル変数 スタック 1 600 2 123 3 723 istore_3 教科書p.29とほぼ同じ

フレーム内計算の例 3/3 .method add2(II)I .limit stack 2 .limit locals 4 iload_1 iadd istore_3 iload_3 ireturn .end method ローカル変数 スタック 1 600 2 123 3 723 iload_3 ローカル変数 スタック 1 600 2 123 3 723 723 ireturn (フレーム自体が消滅,来週の話) 教科書p.29とほぼ同じ

Javaスタック内の構造 再掲載 フレーム フレーム フレーム 「フレーム」という要素のスタック. オペランド スタック ローカル 変数 フレーム オペランド スタック ローカル 変数 フレーム オペランド スタック ローカル 変数 フレーム プログラム カウンタ スタック増減 「フレーム」という要素のスタック. フレームは,1回のメソッド呼び出しに対応. フレーム内の計算のためにも,スタック(オペランドスタック)が利用されている. 詳細は「実行時の構造」の回にて. 例えば教科書 p.20の図

フレーム内計算のテキスト表現 add2(600, 123) を呼ぶ場合 local=[this, 600, 123, ] stack=[] iload_1 local=[this, 600, 123, ] stack=[600] iload_2 local=[this, 600, 123, ] stack=[600, 123] iadd local=[this, 600, 123, ] stack=[723] istore_3 local=[this, 600, 123, 723] stack=[] iload_3 local=[this, 600, 123, 723] stack=[723] ireturn .method add2(II)I .limit stack 2 .limit locals 4 iload_1 iload_2 iadd istore_3 iload_3 ireturn .end method

stack長は必要最低限である add2(600, 123) を呼ぶ場合 local=[this, 600, 123, ] stack=[] iload_1 local=[this, 600, 123, ] stack=[600] iload_2 local=[this, 600, 123, ] stack=[600, 123] iadd local=[this, 600, 123, ] stack=[723] istore_3 local=[this, 600, 123, 723] stack=[] iload_3 local=[this, 600, 123, 723] stack=[723] ireturn .method add2(II)I .limit stack 2 .limit locals 4 iload_1 iload_2 iadd istore_3 iload_3 ireturn .end method

if文の展開例 .method larger(II)I .limit stack 2 .limit locals 4 iload_1 if_icmple Label1 istore_3 goto Label2 Label1: Label2: iload_3 ireturn .end method if文の展開例 int larger(int a, int b){ int c; if(a>b) c=a; else c=b; return c; } ① ② ③ フレーム内の計算過程は,ifelse/exe.htmlを参照.

ループの展開の例 .method forLoop(I)I .limit stack 2 .limit locals 4 iconst_0 istore_2 istore_3 goto Label2 Label1: iload_2 iload_3 iadd istore_2 iinc 3 1 Label2: iload_1 if_icmplt Label1 ireturn .end method 単に0からn-1まで加算するルーチン djava int forLoop(int n){ int s=0; for(int c=0; c<n; c++) s+=c; return s; } ① ② ③

ループの実行例 長いのでwebページ参照 実はforもwhileもほとんど同じ形に展開される loop/exe.html loop/cmp.html