30
1 仮想マシン(1)

仮想マシン (1)...Java byte code M_PowerPC 9 コンパイラ・インタプリタ方式と仮想マシン • 原始プログラムをその言語に適した仮想的な計算機(仮想

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 仮想マシン (1)...Java byte code M_PowerPC 9 コンパイラ・インタプリタ方式と仮想マシン • 原始プログラムをその言語に適した仮想的な計算機(仮想

1

仮想マシン(1)

Page 2: 仮想マシン (1)...Java byte code M_PowerPC 9 コンパイラ・インタプリタ方式と仮想マシン • 原始プログラムをその言語に適した仮想的な計算機(仮想

2

仮想マシン

• 復習

• 仮想マシンの概要

• hsm仮想マシン

Page 3: 仮想マシン (1)...Java byte code M_PowerPC 9 コンパイラ・インタプリタ方式と仮想マシン • 原始プログラムをその言語に適した仮想的な計算機(仮想

3

プログラム言語の処理系(コンパイラ)

原始プログラム(Source program)

解析

目的プログラム(Object code)

目的言語(Object Language)

原始言語(Source language) 合成

コンパイルする/翻訳する(to compile / to translate)

コンパイラ(Compiler)

Page 4: 仮想マシン (1)...Java byte code M_PowerPC 9 コンパイラ・インタプリタ方式と仮想マシン • 原始プログラムをその言語に適した仮想的な計算機(仮想

4

コンパイラのフェーズ

原始プログラム(Source program)

目的プログラム(Object code)

意味解析(SemanticAnalysis)

字句解析(Scanning)

構文解析(Parseing)

コード生成(Code Generation)

Page 5: 仮想マシン (1)...Java byte code M_PowerPC 9 コンパイラ・インタプリタ方式と仮想マシン • 原始プログラムをその言語に適した仮想的な計算機(仮想

5

T Diagram

C → M_pentium

M_pentium

C

M_pentium

言語Cで記述した機能f 言語M_pentiumで記述した機能f(Pentiumの機械語)

Pentium用のCコンパイラ

Pentium

計算機

プログラム プログラム

コンパイラ

Page 6: 仮想マシン (1)...Java byte code M_PowerPC 9 コンパイラ・インタプリタ方式と仮想マシン • 原始プログラムをその言語に適した仮想的な計算機(仮想

6

ある機能fの実現(Implementation)

• fを機械語(Pentium)で記述する。

• Pentiumの上で実行。

M_pentium

M_pentium

Page 7: 仮想マシン (1)...Java byte code M_PowerPC 9 コンパイラ・インタプリタ方式と仮想マシン • 原始プログラムをその言語に適した仮想的な計算機(仮想

7

C言語による言語処理過程

• 機能fの実現

fをC言語のプログラムとして記述する

C Compilerでコンパイルする

機械語(Pentium)によるfに変換された!

Pentiumの上で実行

C → M_pentium

M_pentium

C

M_pentium

Page 8: 仮想マシン (1)...Java byte code M_PowerPC 9 コンパイラ・インタプリタ方式と仮想マシン • 原始プログラムをその言語に適した仮想的な計算機(仮想

8

Java言語による言語処理過程

• 機能fの実現

Javacでコンパイルする

Javaバイトコードよるfに変換された!(F.class)

Jvm(Java virtual machine)上で実行

Java →Java ByteCode

Java byte

code

Java

M_pentium

Java byte

code

M_pentium

M_PowerPC

Java byte

code

M_PowerPC

Page 9: 仮想マシン (1)...Java byte code M_PowerPC 9 コンパイラ・インタプリタ方式と仮想マシン • 原始プログラムをその言語に適した仮想的な計算機(仮想

9

コンパイラ・インタプリタ方式と仮想マシン

• 原始プログラムをその言語に適した仮想的な計算機(仮想機械, Virtual Machine)の機械語に変換する。

現実の計算機の機械語に変換するより容易にコンパイラを作成可能

• VMを用いる利点、欠点

○移植性が高い(マシン独立)

○目的コードが小さい

×実行速度が遅い

→ JIT (Just In Time)コンパイラ技術など

Page 10: 仮想マシン (1)...Java byte code M_PowerPC 9 コンパイラ・インタプリタ方式と仮想マシン • 原始プログラムをその言語に適した仮想的な計算機(仮想

10

Java言語の例

public class Test{

}

Test.java

b22b 1700 0303

00b6 5718 b62b

1900 2b57

Test.class

Java仮想機械(java Test)

Javaコンパイラ(javac Test.java)

Page 11: 仮想マシン (1)...Java byte code M_PowerPC 9 コンパイラ・インタプリタ方式と仮想マシン • 原始プログラムをその言語に適した仮想的な計算機(仮想

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

Page 12: 仮想マシン (1)...Java byte code M_PowerPC 9 コンパイラ・インタプリタ方式と仮想マシン • 原始プログラムをその言語に適した仮想的な計算機(仮想

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

Page 13: 仮想マシン (1)...Java byte code M_PowerPC 9 コンパイラ・インタプリタ方式と仮想マシン • 原始プログラムをその言語に適した仮想的な計算機(仮想

13

Hsm (HiStackMachine)の概要(1)

• 演習で用いる仮想機械(スタックマシン)

• 構成プログラムP

・命令列の置き場

プログラムカウンタ(pc)

・次に実行する命令を指示

スタック(S)

・演算対象(被演算数、演算結果)を置く

・記憶域

スタックポインタ(sp)

・スタックトップを指す

フレームポインタ(fp)

・関数(手続き)のフレームの開始アドレス(後の講義で説明)

Page 14: 仮想マシン (1)...Java byte code M_PowerPC 9 コンパイラ・インタプリタ方式と仮想マシン • 原始プログラムをその言語に適した仮想的な計算機(仮想

14

Hsm (HiStackMachine)の概要(2)

• 命令セット(1) ロード・ストア命令

・ロード命令:スタックトップに値を置く。

・ストア命令:記憶域として確保した所に値を保存する。

・記憶域の確保、開放の命令

(2) 演算命令

・算術演算、関係演算。(論理演算はない)

(3) ジャンプ命令、制御命令

・無条件ジャンプ、条件ジャンプ、停止命令

(4) 入出力命令

・入力、出力

Page 15: 仮想マシン (1)...Java byte code M_PowerPC 9 コンパイラ・インタプリタ方式と仮想マシン • 原始プログラムをその言語に適した仮想的な計算機(仮想

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]に置く。

Page 16: 仮想マシン (1)...Java byte code M_PowerPC 9 コンパイラ・インタプリタ方式と仮想マシン • 原始プログラムをその言語に適した仮想的な計算機(仮想

16

hsmの実行例

HLT 0 0 .. プログラムの終了LDC 0 N … Nをスタックトップの上に積む。

sp++ ; S[sp] ← N ; pc++

注:spは、スタックトップ(一番最後に値をロードした場所)を指す解釈と、次に値をロードする場所(一番最後に値をロードした場所の一段上)を

指す解釈が可能。

本講義、演習では前者の解釈を採用する。

Page 17: 仮想マシン (1)...Java byte code M_PowerPC 9 コンパイラ・インタプリタ方式と仮想マシン • 原始プログラムをその言語に適した仮想的な計算機(仮想

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

Page 18: 仮想マシン (1)...Java byte code M_PowerPC 9 コンパイラ・インタプリタ方式と仮想マシン • 原始プログラムをその言語に適した仮想的な計算機(仮想

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

Page 19: 仮想マシン (1)...Java byte code M_PowerPC 9 コンパイラ・インタプリタ方式と仮想マシン • 原始プログラムをその言語に適した仮想的な計算機(仮想

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

Page 20: 仮想マシン (1)...Java byte code M_PowerPC 9 コンパイラ・インタプリタ方式と仮想マシン • 原始プログラムをその言語に適した仮想的な計算機(仮想

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 … ==, !=, <, <=, >, >=

Page 21: 仮想マシン (1)...Java byte code M_PowerPC 9 コンパイラ・インタプリタ方式と仮想マシン • 原始プログラムをその言語に適した仮想的な計算機(仮想

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

Page 22: 仮想マシン (1)...Java byte code M_PowerPC 9 コンパイラ・インタプリタ方式と仮想マシン • 原始プログラムをその言語に適した仮想的な計算機(仮想

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

Page 23: 仮想マシン (1)...Java byte code M_PowerPC 9 コンパイラ・インタプリタ方式と仮想マシン • 原始プログラムをその言語に適した仮想的な計算機(仮想

23

練習問題(1)

• 3+5*-1を計算するhsmマシン語のプログラムを書け。

• そのプログラムの動作をシミュレートせよ。

Page 24: 仮想マシン (1)...Java byte code M_PowerPC 9 コンパイラ・インタプリタ方式と仮想マシン • 原始プログラムをその言語に適した仮想的な計算機(仮想

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以外

の場合については後の講義で説明する。

Page 25: 仮想マシン (1)...Java byte code M_PowerPC 9 コンパイラ・インタプリタ方式と仮想マシン • 原始プログラムをその言語に適した仮想的な計算機(仮想

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つ分の領

域を確保

Page 26: 仮想マシン (1)...Java byte code M_PowerPC 9 コンパイラ・インタプリタ方式と仮想マシン • 原始プログラムをその言語に適した仮想的な計算機(仮想

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)

Page 27: 仮想マシン (1)...Java byte code M_PowerPC 9 コンパイラ・インタプリタ方式と仮想マシン • 原始プログラムをその言語に適した仮想的な計算機(仮想

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;

Page 28: 仮想マシン (1)...Java byte code M_PowerPC 9 コンパイラ・インタプリタ方式と仮想マシン • 原始プログラムをその言語に適した仮想的な計算機(仮想

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 (準備中)

Page 29: 仮想マシン (1)...Java byte code M_PowerPC 9 コンパイラ・インタプリタ方式と仮想マシン • 原始プログラムをその言語に適した仮想的な計算機(仮想

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プログラムのコンパイル、実行の流れ

Page 30: 仮想マシン (1)...Java byte code M_PowerPC 9 コンパイラ・インタプリタ方式と仮想マシン • 原始プログラムをその言語に適した仮想的な計算機(仮想

30

再提出レポート等についての注意

• 再提出レポートは、他のレポートとは別に提出してください。

• 前回との差分がわかるように、最初に提出したものも一緒に提出してください。