言語理論とコンパイラ

第十二回: 最適化

2006 年 7月11日

http://www.sw.it.aoyama.ac.jp/2006/Compiler/lecture12.html

AGU

© 2006 Martin J. Dürst 青山学院大学

目次

これからの日程

補講日: 7月11日 (火曜日) 4限 E202

最終の授業: 7月14日 (金曜日) 2限 E202

期末試験: 7月28日 (金曜日) 2限 (11:10-12:35)

全体の日程

去年の試験問題

コンパイラの段階

字句解析 (lexical analysis)

構文解析 (parsing; syntax analysis)

意味解析 (semantic analysis)

コード生成 (code generation)

最適化 (optimization)

機械の主な種類

超単純アセンブリ言語

(先週と若干修正)

命令の種類
命令 被演算子 説明 (コメント)
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 がある。

簡単な式のコード生成

式: b = a * 3 + c

生成されるコード:

        LOAD    R1, a
        CONST   R2, 3
        MUL     R3, R1, R2
        LOAD    R4, c
        ADD     R5, R3, R4
        STORE   b, R5

if 文などのコード生成

if 文のコード生成の例

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

生成されるコード:

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

if 文のコード生成の応用

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

最適化の目的

最適化の手法

最適化の手段 (1)

複数の手法を繰り返し組み合わせて少しづつ最適化

最適化の手段 (2)

この最適化はコードの量を増やすが、速くする

最適化の手段 (3)

この手段は機械に強く依存する

命令の順番の変更の応用例

式: 5 * a

最適化前:

	CONST   R1, 5
	LOAD    R2, a        ; LOAD は時間がかかる
	MUL     R3, R1, R2

最適化後:

 	LOAD    R1, a
	CONST   R2, 10       ; LOAD の間、CONST も実行可能
	MUL     R3, R1, R2

最適化の実例

ソース

最適化なし

最適化済み

(アセンブリ言語は Intel PC 用 (CISC))

授業改善のための学生アンケート