コンパイラ

リンク時最適化(LTO)によって可能になる最適化として最も適切なものはどれか。

  1. A別々のファイルの関数どうしでも、インライン展開などができる
  2. B1つの関数の中のループだけを展開できるようになる
  3. Cリンクの処理が不要になり、オブジェクトファイルがそのまま実行できる
答えと解説を見る

正解:A. 別々のファイルの関数どうしでも、インライン展開などができる

通常のコンパイルでは、ソースファイルを1つずつ別々に機械語へ変換するので、別のファイルにある関数の中身は見えず、ファイルをまたいだインライン展開や定数の伝播ができません。LTOでは、各ファイルを中間表現のまま残しておき、リンクのときにプログラム全体をまとめて最適化します。これにより、ファイルをまたいだインライン展開や、どこからも呼ばれない関数の削除などが可能になります。1つの関数の中のループの展開は、通常のコンパイルでもできます。

  • A. 正しい。ファイルをまたいだ最適化ができるようになります。
  • B. 関数の中のループの展開は通常のコンパイルでもできます。
  • C. リンクは引き続き必要です。
この分野を解く 分野ページへ

コンパイラのほかの問題

  1. C言語で、符号付き整数のオーバーフローは未定義動作である。この前提で、上の関数を最適化するコンパイラが生成しうるコードとして正しいものはどれか。
  2. プログラムの誤りのうち、コンパイルの時点で見つけることができるものはどれか。
  3. 静的な型をもつ言語で、コンパイラが型検査を行う主な利点はどれか。
  4. 字句解析でトークンを見分ける規則を表すのによく使われるものはどれか。
  5. 多くのプログラミング言語の文法を表すのに使われ、構文解析の基礎になる文法の種類はどれか。