戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

基本情報技術者 2014年 春期 午前(科目A)18


問題文

コンパイラにおける最適化の説明として、適切なものはどれか。

選択肢

オブジェクトコードを生成する代わりに、インタプリタ用の中間コードを生成する。
コンパイルを実施するコンピュータとは異なるアーキテクチャをもったコンピュータで動作するオブジェクトコードを生成する。
ソースコードを解析して、実行時の処理効率を高めたオブジェクトコードを生成する。(正解)
プログラムの実行時に、呼び出されたサブプログラム名やある時点での変数の内容を表示するようなオブジェクトコードを生成する。

🔒 解説は解答すると表示されます

コンパイラ最適化【午前解説】

正解の理由

正解は です。
「ソースコードを解析して、実行時の処理効率を高めたオブジェクトコードを生成する」は最適化(optimization)の定義そのものです。コンパイラは文法解析や意味解析の結果に基づき、定数畳み込み、デッドコード除去、ループ最適化、インライン展開、レジスタ割り当てなどの変換を行い、効率的な機械語(オブジェクトコード)を出力します。これらはプログラムの正しい振る舞いを保ちながら性能や資源使用を向上させるための処理です。

解法ステップ

  1. 問題文のキーワード「最適化」を確認する。
  2. 各選択肢の動詞・目的(オブジェクトコード生成、中間コード生成、別アーキ、デバッグ情報)を読み分ける。
  3. 最適化の定義(実行時効率を高めるコード生成)と一致する選択肢を選ぶ。
  4. 他の選択肢が示す処理(中間コード生成、クロスアーキテクチャ、デバッグ出力)は最適化の説明と合致しないと除外する。

選択肢別の誤答解説

  • ア: 「オブジェクトコードを生成する代わりに、インタプリタ用の中間コードを生成する。」
    → これはコンパイル手法(中間表現・バイトコード生成)やインタプリタ方式の説明であり、最適化の意味ではありません。
  • イ: 「コンパイルを実施するコンピュータとは異なるアーキテクチャをもったコンピュータで動作するオブジェクトコードを生成する。」
    → これはクロスコンパイル(別アーキテクチャ向け生成)の説明で、最適化そのものではありません。
  • : 「ソースコードを解析して、実行時の処理効率を高めたオブジェクトコードを生成する。」
    → これが正解。最適化はまさにこの処理を指します。
  • エ: 「プログラムの実行時に、呼び出されたサブプログラム名やある時点での変数の内容を表示するようなオブジェクトコードを生成する。」
    → これはデバッグ用の振る舞いを組み込む説明であり、最適化とは逆に情報を追加する処理です。

よくある誤解

  • 「最適化=デバッグ情報の出力」:デバッグ用の情報付加(呼び出し名や変数内容表示)は最適化ではなく、デバッグ用のビルド設定です。
  • 「最適化=別アーキテクチャ向けのコード生成」:別アーキテクチャ向け生成はクロスコンパイルであり、最適化の定義とは別です。
  • 「最適化すると必ずコードサイズが小さくなる」:最適化は速度やメモリ、キャッシュ効率を優先することがあり、インライン展開などでサイズが増える場合があります。

補足コラム

コンパイラ最適化の種類と例(代表的なもの)
  • 定数畳み込み(constant folding):コンパイル時に定数式を評価して式を単純化する。
  • デッドコード除去(dead code elimination):到達しないコードや結果に寄与しない計算を削除。
  • インライン展開(inlining):関数呼び出しを展開して呼び出しオーバーヘッドを削減。
  • ループ最適化(ループ不変式移動、ループ展開、ループ交換など):ループ内のコスト削減で大きな効果を得る。
  • レジスタ割り当て(register allocation):変数をレジスタに割り当てメモリアクセスを減らす。
  • プロファイル駆動最適化(PGO):実行プロファイルに基づきホットパスを重点最適化する。
  • JIT最適化:実行時情報を使ってさらに最適化する方式(HotSpot等)。
簡単な例(擬似C、最適化前後)
// 最適化前
int sum(int n) {
    int s = 0;
    for (int i = 0; i < n; i++) {
        s += 1 + 1; // 毎回計算している
    }
    return s;
}

// 最適化後(定数畳み込み)
int sum(int n) {
    int s = 0;
    for (int i = 0; i < n; i++) {
        s += 2; // 1+1 はコンパイル時に 2 に畳み込まれる
    }
    return s;
}
最適化オプション例:GCC/Clang の -O0, -O1, -O2, -O3 や -Os(サイズ優先)、リンク時最適化(-flto)など。

FAQ

Q1: 最適化するとプログラムの動作が変わることはありますか?
A1: 正しいコンパイラの最適化はプログラムの意味を保ちますが、未定義動作があると最適化により結果が変わることがあります。未定義動作は避けるべきです。
Q2: デバッグ時は最適化を有効にすべきですか?
A2: 通常デバッグ時は最適化を切る(-O0)か低くすることで変数や制御の追跡が容易になります。最適化有効だと最適化により変数が消えたり並びが変わったりします。
Q3: 最適化は常にプログラムを速くしますか?
A3: 多くの場合は性能向上しますが、最適化の種類やターゲットによっては逆にメモリ使用やコードサイズが増え、キャッシュ劣化で遅くなる場合もあります。
Q4: プロファイル駆動最適化(PGO)とは何ですか?
A4: 実行時の挙動を収集してホットスポットを特定し、その情報を元に最適化を行う手法で、実運用に即した効果的な最適化が可能です。

関連キーワード: コンパイラ、最適化、オブジェクトコード、インタミディエイトコード、クロスコンパイル、デバッグ情報、定数畳み込み、デッドコード除去、インライン展開、ループ最適化、レジスタ割り当て、プロファイル駆動最適化、JIT
← 前の問題へこの年度をクイズで解く次の問題へ →
戦国ITクイズ機能

\ せっかくなら /

基本情報技術者
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について