• 検索結果がありません。

Microsoft PowerPoint ppt

N/A
N/A
Protected

Academic year: 2021

シェア "Microsoft PowerPoint ppt"

Copied!
37
0
0

読み込み中.... (全文を見る)

全文

(1)

1

仮想マシン(2), コード生成

http://cis.k.hosei.ac.jp/~asasaki /lect/compiler/2007-1204.pdf

(2)

2

概要

• 仮想マシン

概要(復習) 制御命令、出力命令

• コード生成

式のコード生成、文、文の列のコード生成

• 記号表

(3)

3

演習で作るコンパイラの例

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

(4)

4

Hsm (HiStackMachine)の概要(1)

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

• 構成

プログラムP ・命令列の置き場 プログラムカウンタ(pc) ・次に実行する命令を指示 スタック(S) ・演算対象(被演算数、演算結果)を置く ・記憶域 スタックポインタ(sp) ・スタックトップを指す フレームポインタ(fp) ・関数(手続き)のフレームの開始アドレス(後の講義で説明)

(5)

5

Hsm (HiStackMachine)の概要(2)

• 命令セット

(1) ロード・ストア命令 ・ロード命令:スタックトップに値を置く。 ・ストア命令:記憶域として確保した所に値を保存する。 ・記憶域の確保、開放の命令 (2) 演算命令 ・算術演算、関係演算。(論理演算はない) (3) ジャンプ命令、制御命令 ・無条件ジャンプ、条件ジャンプ、停止命令 (4) 入出力命令 ・入力、出力

(6)

6

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

(7)

7

制御命令

J 0 N ジャンプ命令: pc ←N; FJ 0 N 条件ジャンプ命令: if (S[sp] == 0) pc ← N; else pc++; sp--; J 0 20 LDC 0 1 LDC 0 2 EQ 0 0 FJ 0 20 20番地に飛ぶ。 (次の命令は P[20]) 1==2が偽(0)であれば20番地に 飛ぶ。そうでなければ次の命令へ。 (Fall through (この場合1==2はa偽であるから、 必ず20番地に飛ぶ)

(8)

8

出力命令

LDC 0 1 WRI 0 0 LDC 0 70 WRC 0 0 整数1を表示 文字コード70番の文字(F)を表示 WRI 0 0 整数表示: S[sp]を表示; sp--; pc++; WRC 0 0 文字表示: 文字コードS[sp]に対する文字の表示; sp--; pc++; WNL 0 0 改行表示: 改行; pc++;

(9)

9

練習問題(1)

• FJ命令の動きに注意して、VMの動作をシミュレートしてみよ。

(紙と鉛筆を使って手で確認せよ。その後hsmで確かめると

良い。)

• 最初の命令が0: LDC 0 2の場合どうなるかも考えよ。

0: LDC 0 1 1: LDC 0 2 2: EQ 0 0 3: FJ 0 6 4: LDC 0 84 5: WRC 0 0 6: HLT 0 0 0: LDC 0 1 1: LDC 0 2 2: EQ 0 0 3: FJ 0 7 4: LDC 0 84 5: WRC 0 0 6: J 0 9 7: LDC 0 70 8: WRC 0 0 9: HLT 0 0

(10)
(11)

プログラムの構成要素(パーツ)とコード生成

int main() { int i, j; i = 3; j = 4; putint(i+j); } 宣言部(declaration) int i,j; 加算式(expression) i+j 文(statement) 文の列(連接文) stm1; stm2; stm3; 代入文 i =3; 出力文 putint(…) LDV 0 0 LDV 0 1 AD 0 0 WRI 0 0 PUSH 0 2 POP 0 2 定数式(expression) 3 LDC 0 3 STV 0 0 LDC 0 3 式(expression)

(12)

コード生成=各パーツのコードをつなぎ合わせ

int main() { int i, j; i = 3; j = 4; putint(i+j); } 宣言部(declaration) int i,j; 式 i+j 文(statement) 文の列(連接文) stm1; stm2; stm3; 代入文 i =3; 出力文 putint(i+j) PUSH 0 2 LDV 0 0 LDV 0 1 AD 0 0 WRI 0 0 POP 0 2 STV 0 0 LDC 0 3 代入文 J =4; STV 0 1 LDC 0 4 LDV 0 0 LDV 0 1 AD 0 0 WRI 0 0 STV 0 0 LDC 0 3 STV 0 1 LDC 0 3

(13)

13

コード生成(式)

1 +2 *3 LDC 0 1 LDC 0 2 LDC 0 3 ML 0 0 AD 0 0 AD 0 0 左辺 の翻訳結果 右辺 の翻訳結果 の翻訳結果 + 左辺 右辺 定数式(3つ)、加算式、 乗算式の各パーツのコード を組み合わせる 加算式のコード生成ルール (パーツの組み合わせ方) 左辺式の翻訳結果(コード生成の結果)の後に、 右辺式の翻訳結果を並べて、 最後に命令”AD 0 0”をくっつける

(14)

14

原始言語(Source Language):式の文法

<EXPRESSION>::= <TERM> | <EXPRESSION> '+' <TERM> | <EXPRESSION> '-' <TERM> <TERM>::= <UNARY> | <TERM> '*' <UNARY> | <TERM> '/' <UNARY> <UNARY>::== <FACTOR> | '-' <UNARY> <FACTOR>::= <IDENT> | <NUMBER> | '(' <EXPRESSION> ')' <IDENT>::=a~zの英字 <NUMBER>::=数字の1回以上の繰り返し文字列

(15)

15

「式」のコード生成(1)

AD 0 0 左辺 の翻訳結果 右辺 の翻訳結果 の翻訳結果 + 左辺 右辺 の翻訳結果 - 式 NEG 0 0 式 の翻訳結果 の翻訳結果 式

(16)

16

「式」のコード生成(2)

の翻訳結果 数字列 LDC 0 数字列 に対する整数 LDV 0 の翻訳結果 名前 addr( )名前

(17)

17

例: 1+2*3 (1)

AD 0 0 1 の翻訳結果 2*3 の翻訳結果 の翻訳結果 + 1 2*3 の翻訳結果 1 LDC 0 1 の翻訳結果 * 2 3 2*3 の翻訳結果 の翻訳結果 1+2*3

(18)

18

例: 1+2*3 (2)

ML 0 0 2 の翻訳結果 3 の翻訳結果 の翻訳結果 * 2 3 の翻訳結果 2 LDC 0 2 の翻訳結果 3 LDC 0 3 ML 0 0 LDC 0 2 LDC 0 3 2*3 の翻訳結果

(19)

19

例: 1+2*3 (3)

AD 0 0 2*3 の翻訳結果 の翻訳結果 + 1 2*3 の翻訳結果 1 LDC 0 1 ML 0 0 LDC 0 2 LDC 0 3 AD 0 0

(20)

20

例: 1+2*3 (4)

AD 0 0 2*3 の翻訳結果 の翻訳結果 + 1 2*3 の翻訳結果 1 LDC 0 1 ML 0 0 LDC 0 2 LDC 0 3 2 の翻訳結果 3 の翻訳結果 加算式 定数式 定数式 定数式 乗算式

(21)

21

構文解析と同時に行うコード生成

T E + F T F * F

NUM:”1” NUM:”2” NUM:”3”

E → T { '+' T } T → F { '*' F} F → NUM

(22)

22

構文解析と同時に行うコード生成

T E + F T F * F

NUM:”1” NUM:”2” NUM:”3”

E → T { '+' T } T → F { '*' T } F → NUM AD 0 0 LDC 0 1 ML 0 0 LDC 0 2 LDC 0 3 E → T { '+' T [AD 0 0]} T → F { '*‘ F [ML 0 0]} F → NUM [LDC 0, NUM に対する整数]

(23)

23

構文解析と同時に行うコード生成

T E + F T F * F

NUM:”1” NUM:”2” NUM:”3”

E → T { '+' T } T → F { '*' T } F → NUM AD 0 0 LDC 0 1 ML 0 0 LDC 0 2 LDC 0 3 LDC 0 1 LDC 0 2 LDC 0 3 ML 0 0 AD 0 0

(24)

24

練習問題(2)

• 1+2*3+4*5に対するコード生成を前頁のスライドを参考に、

構文木に沿った形で行え。

(25)

25

原始言語(Source Language):文、ブロック等

<PROGRAM>::= <MAIN>

<MAIN>::= 'int' 'main' '(' ')' <BLOCK> <BLOCK>::= '{' <STATEMENTLIST> '}' <STATEMENTLIST>::=empty

|<STATEMENTLIST> <STATEMENT>

<STATEMENT>::= <SUBSTITUTION> '=' <EXPRESSION> ';' | '{' <STATEMENTLIST> '}' | 'putint' '(' <EXPRESSION> ')' ';' | 'putnl'';' <SUBSTITUTION>::= <IDENT> ---putint <EXPRESSION>の値を整数で出力 putnl 改行コードをコンソールに出力する

(26)

26

出力文のコード生成

putint(1+2*3) ; LDC 0 1 LDC 0 2 LDC 0 3 ML 0 0 AD 0 0 WRI 0 0 の翻訳結果 putint( 式 ); WRI 0 0 式 の翻訳結果 WRI 0 0 整数表示: S[sp]を表示; sp--; pc++; putint(123) ; LDC 0 123 WRI 0 0

(27)

27

文の列(statementlist)のコード生成

putint(1+2*3) ; LDC 0 1 LDC 0 2 LDC 0 3 ML 0 0 AD 0 0 WRI 0 0 putint(123) ; LDC 0 123 WRI 0 0 putint(123) ; putint(1+2*3); LDC 0 123 WRI 0 0 LDC 0 1 LDC 0 2 LDC 0 3 ML 0 0 AD 0 0 WRI 0 0

(28)

28

「文の列」(statementlist)のコード生成

文の列 の翻訳結果 の翻訳結果 文の列 文 文の列 の翻訳結果 文 の翻訳結果 の翻訳結果 ε(空文) φ

(29)

29

「文」(statement)のコード生成

STV 0 式 の翻訳結果 の翻訳結果 = 名前 式 ; addr( )名前 文 の翻訳結果 の翻訳結果 putint( 式 ); の翻訳結果 putnl; の翻訳結果 { 文の列 } 文の列 の翻訳結果 WRI 0 0 式 の翻訳結果 WNL 0 0

(30)

30

代入文のコード生成

STV 0 addr(名前)は、名前に対して割り当てた 記憶域のアドレス 式 の翻訳結果 の翻訳結果 = 名前 式 ; addr( )名前 a = 1+2*3 ; LDC 0 1 LDC 0 2 LDC 0 3 ML 0 0 AD 0 0 STV 0 1 今、変数aの値を保持するアドレスが 1(addr(‘a’)=1 ) だとすれば、、、

(31)

31

練習問題(3)

• 下記のプログラムを、構文木に沿ってコード生成することで

翻訳せよ。ただし”int a; int b;”の宣言部は、変数a,bの値を

保持する領域を確保するコード(PUSH 0 2)に翻訳されるも

のとする。また、addr(a)=0, addr(b)=1とする。

int a; Int b; a = 1+2*3; b = a * 4; putint(a);

(32)

32

記号表(変数表)を使った記憶域の管理

• 宣言された変数の記憶場所などを管理するために、記号表

が必要となる。

int main() { int abc; int cd; int efg; cd = 10; putint(cd); } ident=“abc” address=0 ident=“cd” address=1 ident=“efg” address=2

記号表

ident=“abc” address=0

名前(エントリ)..

記号表に登録する内容 つづり 値を保持する アドレス

(33)

33

記号表(変数表)を使った記憶域の管理

• 必要なメモリの領域確保。(下記では3変数分必要)

• cd = 10, putint(cd)の各文では、addr(cd)を知る必要がある。

記号表からidentが”cd”である名前(エントリ)を検索する。 int main() { int abc; int cd; int efg; cd = 10; putint(cd); } ident=“abc” address=0 ident=“cd” address=1 ident=“efg” address=2

記号表

PUSH 0 3 LDC 0 10 STV 0 1 LDV 0 1 WRI 0 0 POP 0 3 HLT 0 0

コード

(34)

34

演習問題2(Problem2)

(1)文法の書き換えの演習

(2)JavaCCを用いたコンパイラの演習

(3)記号表の演習

(35)

35

演習問題2 (Problem 2)

• 問題は下記

http://cis.k.hosei.ac.jp/~asasaki /lectureCompiler/problem2.htm

• プログラムの提出指針

http://cis.k.hosei.ac.jp/~asasaki /lectureCompiler/guideline.html

• プログラムの提出状況(準備中)

http://cis.k.hosei.ac.jp/~asasaki /lectureCompiler/status.htm

(36)

36

コンパイラ作成の流れと、プログラムの実行

cs07k1234.class JavaCC/javac cs07k1234.jj コンパイラ作成の流れ 20+10*5 LDC 0 20 LDC 0 10 LDC 0 5 ML 0 0 AD 0 0 HLT 0 0 hsm プログラムのコンパイル、実行の流れ

(37)

37

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

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

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

参照

関連したドキュメント

1-1 睡眠習慣データの基礎集計 ……… p.4-p.9 1-2 学習習慣データの基礎集計 ……… p.10-p.12 1-3 デジタル機器の活用習慣データの基礎集計………

施工計画書 1)工事概要 2)計画工程表 3)現場組織表 4)主要機械 5)主要資材 6)施工方法 7)施工管理計画. 8)緊急時の体制及び対応

参考資料ー経済関係機関一覧(⑤各項目に関する機関,組織,企業(2/7)) ⑤各項目に関する機関,組織,企業 組織名 概要・関係項目 URL

・大都市に近接する立地特性から、高い県外就業者の割合。(県内2 県内2 県内2/ 県内2 / / /3、県外 3、県外 3、県外 3、県外1/3 1/3

口腔の持つ,種々の働き ( 機能)が障害された場 合,これらの働きがより健全に機能するよう手当

※立入検査等はなし 自治事務 販売業

エッジワースの単純化は次のよう な仮定だった。すなわち「すべて の人間は快楽機械である」という

ERROR  -00002 認証失敗または 圏外   クラウドへの接続設定及びア ンテ ナ 接続を確認して ください。. ERROR  -00044 回線未登録または