言語理論とコンパイラ

第十四回: 最適化

2014 年 7 月 11日

http://www.sw.it.aoyama.ac.jp/2014/Compiler/lecture14.html

Martin J. Dürst

AGU

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

目次

これからの予定

過去問とその活用方法

 

過去問活用方法

前回のまとめ

前回の宿題 (1): 論理積のコード生成

C 言語の断片:

if (a<5 && b>10)
    c = d;

入れ子の if 文に変換:

if (a<5)
    if (b>10)
        c = d;

 

前回の宿題 (1) の解答例

[都合により削除]

 

前回の宿題 (2): for 文のコード生成

(発展問題)

C 言語の断片:

for (i=0; i<15; i++)
    a += b;

準備: while 文に変換:

i = 0;
while (i<15) {
    a += b;
    i++;
}

 

前回の宿題 (2) の解答例

[都合により削除]

 

最適化の目的

最適化の手法

 

最適化の手段 (1)

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

 

最適化の手段 (2)

コードの量が増加しても、実行を加速

 

最適化の手段 (3)

機械に強く依存

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

式: 5 * a

最適化前:

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

最適化後:

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

 

最適化の実例

ソース

最適化なし (gcc -O0 -S code.c)

最適化済み (gcc -O1 -S code.c)

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

gcc の最適化に関する設定項目: 英語日本語

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

お願い: 自由記述に必ず良かった点、問題点を具体的に書きましょう

(悪い例: 発音が分かりにくい; 良い例: さ行が濁っているかどうか分かりにくい)