言語理論とコンパイラ

第十一回: コード生成

2008 年 6月20日

http://www.sw.it.aoyama.ac.jp/2008/Compiler/lecture11.html

Martin J. Dürst

duerst@it.aoyama.ac.jp, O 棟 529号室

AGU

© 2005-7 Martin J. Dürst 青山学院大学

目次

宿題: 有理数の電卓

提出: 再来週の木曜日 (6月19日) 19時00分、O 棟 529号室の前

簡単な電卓を 2×2 行列の電卓に拡張してください。

次の表現を使えるようにしなさい:

[a1,1 a1,2; a2,1 a2,1]: 2×2 の行列

[v1 v2]: 横のベクトル、[v1; v2]: 縦のベクトル、s: スカラ

各定数は整数 (十進数のみ) の構文も含む浮動小数点数

演算としては足し算、引き算、掛け算で、演算子の大きさが合わない場合は Error! と出力

matrix.lexmatrix.y を A4 の紙で提出ください。

宿題の正解例

matrix.y, matrix.lex

入力の一例

先週の復習

コンパイラの主な段階

コード生成と最適化の関係

コード生成の難しさ

コード生成の手法

機械の主な種類

コードの書き方: アセンブリ言語

(assembly language)

超単純アセンブリ言語

命令の種類
命令 被演算子 説明 (コメント)
LOAD R1, a メモリの変数 a の値をレジスタ R1 に代入
STORE a, R1 レジスタ R1 の値をメモリの変数 a に代入
CONST R1, 5 レジスタ R1 に 5 の定数を代入
JUMP label 無条件の label へジャンプ
JUMP< R1, label レジスタ R1 が 0 より小さい時 label へジャンプ (同様に JUMP<=, JUMP==, JUMP!=, JUMP>= とJUMP> がある。)
ADD R1, R2, R3 R2 と R3 を足して R1 に代入。同じレジスタを何回使ってもよい。同様に SUB、MUL、DIV がある。

超単純アセンブリ言語の一例

入力のプログラムの一部:

sum += price * 25;

出力:

LOAD   R1, price    ; R1 (レジスタ1) に price というアドレスからロード
CONST  R2, 25       ; R2 (レジスタ2) に 25 の定数をロード
MUL    R1, R1, R2   ; R1 に R1 と R2 の掛け算の結果を入れる
LOAD   R2, sum      ; R2 に sum というアドレスからロード
ADD    R2, R1, R2   ; R2 に R1 と R2 の合計を入れる
STORE  sum, R2      ; sum というアドレスに R2 を入れる

if 文などのコード生成

if 文のコード生成の例

文: if (a>10) { b = 15; }

生成されるコード:

       LOAD    R1, a
       CONST   R2, 10
       SUB     R3, R1, R2   ; R3 = a-10
       JUMP<=  R3, endif    ; jump over if part if a-10<=0
       CONST   R4, 15
       STORE   b, R4
endif:

関数呼び出しのコード生成