Upload
others
View
2
Download
0
Embed Size (px)
Citation preview
1
仮想マシン(1)
2
仮想マシン
• 復習
• 仮想マシンの概要
• hsm仮想マシン
3
プログラム言語の処理系(コンパイラ)
原始プログラム(Source program)
解析
目的プログラム(Object code)
目的言語(Object Language)
原始言語(Source language) 合成
コンパイルする/翻訳する(to compile / to translate)
コンパイラ(Compiler)
4
コンパイラのフェーズ
原始プログラム(Source program)
目的プログラム(Object code)
意味解析(SemanticAnalysis)
字句解析(Scanning)
構文解析(Parseing)
コード生成(Code Generation)
5
T Diagram
C → M_pentium
f
M_pentium
f
C
M_pentium
言語Cで記述した機能f 言語M_pentiumで記述した機能f(Pentiumの機械語)
Pentium用のCコンパイラ
Pentium
計算機
プログラム プログラム
コンパイラ
6
ある機能fの実現(Implementation)
• fを機械語(Pentium)で記述する。
• Pentiumの上で実行。
f
M_pentium
M_pentium
7
C言語による言語処理過程
• 機能fの実現
fをC言語のプログラムとして記述する
C Compilerでコンパイルする
機械語(Pentium)によるfに変換された!
Pentiumの上で実行
C → M_pentium
f
M_pentium
f
C
M_pentium
8
Java言語による言語処理過程
• 機能fの実現
Javacでコンパイルする
Javaバイトコードよるfに変換された!(F.class)
Jvm(Java virtual machine)上で実行
Java →Java ByteCode
f
Java byte
code
f
Java
M_pentium
Java byte
code
M_pentium
M_PowerPC
Java byte
code
M_PowerPC
9
コンパイラ・インタプリタ方式と仮想マシン
• 原始プログラムをその言語に適した仮想的な計算機(仮想機械, Virtual Machine)の機械語に変換する。
現実の計算機の機械語に変換するより容易にコンパイラを作成可能
• VMを用いる利点、欠点
○移植性が高い(マシン独立)
○目的コードが小さい
×実行速度が遅い
→ JIT (Just In Time)コンパイラ技術など
10
Java言語の例
public class Test{
…
}
Test.java
b22b 1700 0303
00b6 5718 b62b
1900 2b57
Test.class
Java仮想機械(java Test)
Javaコンパイラ(javac Test.java)
11
Java言語の例
0: iconst_3
1: istore_1
2: iconst_4
3: istore_2
4: getstatic #2;
7: iload_1
8: iload_2
9: iadd
10: invokevirtual #3;
13: return
public class Test{
public static void main(String[] arg){
int i=3;
int j=4;
System.out.println(i+j);
}
…
0001 2804 2949 0056 0021 0004 0005 0000
0000 0002 0001 0006 0007 0001 0008 0000
001d 0001 0001 0000 2a05 00b7 b101 0000
0100 0900 0000 0600 0100 0000 0100 0900
…
Test.classを逆アセンブルjavap –c Testで表示
Test.classの内容(一部)od –h Test.classで表示
Test.java
12
演習で作るコンパイラの例
0: iconst_3
1: istore_1
2: iconst_4
3: istore_2
4: getstatic #2;
7: iload_1
8: iload_2
9: iadd
10: invokevirtual #3;
13: return
Int main()
{ int i j;
i = 3;
j = 4;
putint(i+j);
}
PUSH 0 2
LDC 0 3
STV 0 0
LDC 0 4
STV 0 1
LDV 0 0
LDV 0 1
AD 0 0
WRI 0 0
POP 0 2
HLT 0 0
Test.classを逆アセンブルjavap –c Testで表示
test.hsm
test.hcc
13
Hsm (HiStackMachine)の概要(1)
• 演習で用いる仮想機械(スタックマシン)
• 構成プログラムP
・命令列の置き場
プログラムカウンタ(pc)
・次に実行する命令を指示
スタック(S)
・演算対象(被演算数、演算結果)を置く
・記憶域
スタックポインタ(sp)
・スタックトップを指す
フレームポインタ(fp)
・関数(手続き)のフレームの開始アドレス(後の講義で説明)
14
Hsm (HiStackMachine)の概要(2)
• 命令セット(1) ロード・ストア命令
・ロード命令:スタックトップに値を置く。
・ストア命令:記憶域として確保した所に値を保存する。
・記憶域の確保、開放の命令
(2) 演算命令
・算術演算、関係演算。(論理演算はない)
(3) ジャンプ命令、制御命令
・無条件ジャンプ、条件ジャンプ、停止命令
(4) 入出力命令
・入力、出力
15
hsmの構成図
命令0 pc
P
命令1
命令2
命令3
命令4
命令5
0
…
0
1
2
3
4
5
S
5
4
3
2
1
0
…
sp
-1
pc = 0のとき、命令0
を実行する。pc = 1のとき、命令1
を実行する…
pc = nのとき命令nを
実行する
値をロードする場合には、sp←sp+1としてS[sp]に置く。
16
hsmの実行例
HLT 0 0 .. プログラムの終了LDC 0 N … Nをスタックトップの上に積む。
sp++ ; S[sp] ← N ; pc++
注:spは、スタックトップ(一番最後に値をロードした場所)を指す解釈と、次に値をロードする場所(一番最後に値をロードした場所の一段上)を
指す解釈が可能。
本講義、演習では前者の解釈を採用する。
17
実行例(1)
LDC 0 10 pc
P
LDC 0 20
HLT 0 0
0
…
0
1
2
3
4
5
S
5
4
3
2
1
0
…
sp
-1
18
実行例(2)
LDC 0 10 pc
P
LDC 0 20
HLT 0 0
1
…
0
1
2
3
4
5
S
10
5
4
3
2
1
0
…
sp
0
19
実行例(3)
LDC 0 10 pc
P
LDC 0 20
HLT 0 0
2
…
0
1
2
3
4
5
S
20
10
5
4
3
2
1
0
…
sp
1
20
演算命令
SB 0 0 引き算命令:sp-- ; S[sp] ←S[sp]-S[sp+1]; pc++
NEG 0 0 符号反転命令:S[sp] ← -S[sp]; pc++;
LE 0 0 関係演算命令<=sp-- ; if (S[sp] <= S[sp+1) then S[sp]←1
else S[sp] ← 0; pc++
算術演算:AD, SB,ML,DV, NEG … +, -, *, /, 反転関係演算:EQ, NEQ, LT,LE,GT,GE … ==, !=, <, <=, >, >=
21
実行例(4)
LDC 0 10 pc
P
LDC 0 20
SB 0 0
HLT 0 0
2
…
0
1
2
3
4
5
S
20
10
5
4
3
2
1
0
…
sp
1
22
実行例(5)
LDC 0 10 pc
P
LDC 0 20
SB 0 0
HLT 0 0
3
…
0
1
2
3
4
5
S
-10
5
4
3
2
1
0
…
sp
0
23
練習問題(1)
• 3+5*-1を計算するhsmマシン語のプログラムを書け。
• そのプログラムの動作をシミュレートせよ。
24
ロード命令、ストア命令(暫定版)
STV 0 N ストア命令S[N] ←S[sp]; sp--; pc++
LDV 0 N ロード命令sp++; S[sp]←S[N]; pc++
LDC 0 N 即値ロード命令sp++; S[sp]←N; pc++
Hsmのwebページの説明では、STV p q
s[base(p)+q]=s[t];t=t-1;pc=pc+1;
となっている。p=0のときは、base(p)=0である。Pが0以外
の場合については後の講義で説明する。
25
メモリの確保と開放
PUSH 0 N メモリを確保sp←sp+N; pc++
POP 0 N メモリを開放sp←sp-N; pc++
5
4
3
2
1
0
sp
-1
5
4
3
2
1
0
sp
3
PUSH 0 4
4つ分の領
域を確保
26
練習問題(2)
• 次のプログラムの動作を説明せよ。
PUSH 0 3
LDC 0 10
STV 0 2
LDC 0 5
STV 0 1
LDV 0 2
LDV 0 2
ML 0 0
LDV 0 1
LDV 0 2
ML 0 0
AD 0 0
STV 0 0
POP 0 3
HLT 0 0
PUSH 0 10
LDC 0 16
STV 0 3
LDV 0 3
LDV 0 3
ML 0 0
STV 0 7
POP 0 10
HLT 0 0
(1) (2)
27
練習問題(3)
• 1. 次のプログラムと同等の動作をするhsmマシン語プログラムを書け。(変数用の記憶域を確保し、それを利用すること)
• 2. 上記プログラムおよび、これまで出てきた例をhsm仮想機
械で実行せよ。http://cis.k.hosei.ac.jp/~nakata/lectureCompiler
/HiStackMachine-ALL/index.html
http://cis.k.hosei.ac.jp/~nakata/lectureCompiler
/JavaHiStackMachine-ALL/index.html
c = 10;
b = 5;
a = c * (-3) + b * c;
28
演習問題1 (Problem 1)
(1)練習問題(3)-1を行え。(p23)
実行結果を確かめるために、hsm(Swing/Java版)を用いて、a,b,cの
最終的な結果が記憶域に保存された状態のスナップショットを取ること。変数の保存、参照についての説明は、以下にもある。
http://cis.k.hosei.ac.jp/~nakata/lectureCompiler
/HiStackMachine-ALL/node8.html
(2)整数,四則演算,括弧からなる中置記法の式をhsmマシン語プログラムに翻訳するコンパイラをJavaCC使って作成せよ。 次のページにあるテストプログラムで確認すること。http://cis.k.hosei.ac.jp/~asasaki
/lectureCompiler/problem1.htm
• なお、プログラムの提出は下記にある提出指針に従うこと。http://cis.k.hosei.ac.jp/~asasaki
/lectureCompiler/guideline.htm (準備中)
29
コンパイラ作成の流れと、プログラムの実行
cs07k1234.class cs07k1234.jjJavaCC/javac
コンパイラ作成の流れ
20+10*5
LDC 0 20
LDC 0 10
LDC 0 5
ML 0 0
AD 0 0
HLT 0 0
hsmプログラムのコンパイル、実行の流れ
30
再提出レポート等についての注意
• 再提出レポートは、他のレポートとは別に提出してください。
• 前回との差分がわかるように、最初に提出したものも一緒に提出してください。