コンパイラ

上の関数に、定数伝播・定数畳み込み・不要コードの削除を十分に行ったとき、関数が返す値と残るコードとして正しいものはどれか。

int h(void) {
    int a = 5;
    int b = a * 3;
    int c = b - a;
    if (c > 100) return 0;
    return c * 2;
}
  1. A常に20を返し、if文の判定は削除される
  2. B常に0を返し、return c * 2 は削除される
  3. C計算はすべて残り、実行時に20か0を返す
答えと解説を見る

正解:A. 常に20を返し、if文の判定は削除される

a = 5 を伝播すると b = 5 * 3 = 15、c = 15 − 5 = 10 と畳み込めます。すると条件 c > 100 は 10 > 100 で常に偽と分かるので、return 0 の分岐は決して実行されない不要コードとして削除されます。残る return c * 2 は 10 × 2 = 20 となり、関数は return 20; だけになります。条件が常に偽なので0を返すことはなく、実行時に計算や判定をする必要もありません。

  • A. 正しい。c = 10で条件は常に偽になり、20だけを返すコードになります。
  • B. 条件は常に偽なので、0を返すことはありません。
  • C. すべて定数で決まるので、実行時の計算は残りません。
この分野を解く 分野ページへ

コンパイラのほかの問題

  1. コンパイラの字句解析の役割として正しいものはどれか。
  2. コンパイラの構文解析で行うこととして正しいものはどれか。
  3. コンパイラの意味解析で見つかる誤りの例として最も適切なものはどれか。
  4. 抽象構文木(AST)の特徴として正しいものはどれか。
  5. コンパイラの内部で、ソース言語にもCPUにも依存しない中間表現(IR)を使う主な利点はどれか。