基本情報技術者 2010年 秋期 午前(科目A) 問22
問題文
コンパイラによる最適化の主な目的はどれか。
選択肢
ア:プログラムの実行時間を短縮する。(正解)
イ:プログラムのデバッグを容易にする。
ウ:プログラムの保守性を改善する。
エ:目的プログラムを生成する時間を短縮する。
コンパイラによる最適化の主な目的はどれか。【午前2 解説】
要点まとめ
- 結論→コンパイラ最適化の主目的はプログラムの実行時間短縮や命令効率の向上など、実行性能を改善することであり正解はアです。
- 根拠→最適化はループ展開やインライン化、定数畳み込み、デッドコード削除、レジスタ割付など実行時効率を高める変換を行うため、性能改善が狙いです。
- 差がつくポイント→最適化はコンパイル時間増加やデバッグ困難化、コードサイズ増減といったトレードオフがある点を理解して選択肢を絞ることが重要です。
正解の理由
正解は ア です。コンパイラ最適化は生成される機械語(目的コード)を解析・変換して、命令の数やメモリアクセス、キャッシュ効率、分岐予測への影響などを改善し、結果的にプログラムの実行時間を短縮することを主目的としています。最適化手法(例:ループ最適化、インライン展開、定数畳み込み、デッドコード除去、レジスタ割付、命令並べ替えなど)はすべて実行効率向上に寄与するため、選択肢アが最も適切です。
よくある誤解
- コンパイラ最適化は「デバッグを容易にする」:実際は最適化によりソースと生成コードの対応が崩れ、デバッグが難しくなることが多いです。
- 最適化は「保守性を高める」:最適化は実行コードの効率化を目的とし、ソースコードの可読性や保守性向上を直接的に意図していません。
- 最適化は「コンパイル時間短縮」:多くの最適化は解析や変換処理を追加するためコンパイル時間はむしろ増える場合が多いです。
解法ステップ
- 問題文で問われている対象(コンパイラによる最適化)を明確に把握する。
- 各選択肢の目的を短く言い換えて、コンパイラ最適化の定義と照らし合わせる。
- 「実行時間短縮/デバッグ容易化/保守性向上/コンパイル時間短縮」のうち、コンパイラ最適化が直接狙うのはどれかを検討する。
- 実行時性能に寄与する具体的な最適化手法(ループ展開、インライン化、定数畳み込みなど)を想起して、該当する選択肢を確定する。
選択肢別の誤答解説
- ア: プログラムの実行時間を短縮する。 — 正解。最適化は命令数削減やメモリアクセス改善で実行性能を高めるのが主目的です。
- イ: プログラムのデバッグを容易にする。 — 誤り。最適化は構造を変えるためソースと実行コードの対応が崩れデバッグが難しくなることが多いです。
- ウ: プログラムの保守性を改善する。 — 誤り。保守性はコードの可読性や設計に依存し、最適化は主に生成コードの効率化を目指します。
- エ: 目的プログラムを生成する時間を短縮する。 — 誤り。最適化処理は追加解析を伴うため、目的プログラム生成(コンパイル)時間を短縮することが目的ではありません。
補足コラム
コンパイラ最適化には次のような分類があります。
- 機械語レベル(マシン依存)最適化:命令並べ替え、レジスタ割付、パイプライン配慮など。
- 機械語非依存(高水準)最適化:式の簡約、デッドコード除去、ループ変換、インライン化など。
- ローカル最適化 vs グローバル最適化:基本ブロック内の最適化か、関数間やモジュール全体での最適化か。
また、最適化レベル(例:-O0, -O1, -O2, -O3)によって適用される技術が異なり、最適化を強めるほどコンパイル時間が長くなり、デバッグが難しくなる傾向があります。JITコンパイラでは実行時プロファイルを使ってさらに高度な最適化を行うこともあります。
コード例(C言語): インライン化で関数呼び出しオーバーヘッドを削減する例
// 普通の関数呼び出し
int add(int a, int b) { return a + b; }
int f() { return add(1, 2); }
// インライン化で呼び出しを消す(コンパイラ最適化)
inline int add_inline(int a, int b) { return a + b; }
int g() { return add_inline(1, 2); }
インライン化により関数呼び出し命令がなくなり、実行時間短縮につながる場合があります。
FAQ
Q: 最適化は常にプログラムを速くするのですか?
A: ほとんどの場合は性能向上を狙いますが、コードサイズ増加やキャッシュ効率の悪化で逆に遅くなる場合もあります。プロファイルに基づく最適化で効果を確認することが重要です。
A: ほとんどの場合は性能向上を狙いますが、コードサイズ増加やキャッシュ効率の悪化で逆に遅くなる場合もあります。プロファイルに基づく最適化で効果を確認することが重要です。
Q: 最適化を有効にするとデバッグできなくなりますか?
A: 最適化は変換により変数や制御フローが変わるため、デバッグ情報が見づらくなります。開発中は低最適化(-O0)でデバッグし、リリース時に高最適化(-O2/-O3)を用いる運用が一般的です。
A: 最適化は変換により変数や制御フローが変わるため、デバッグ情報が見づらくなります。開発中は低最適化(-O0)でデバッグし、リリース時に高最適化(-O2/-O3)を用いる運用が一般的です。
Q: JITコンパイラの最適化と静的コンパイラ最適化の違いは何ですか?
A: JITは実行時プロファイル情報を使って実際の実行パスに特化した最適化が可能で、より効果的な変換を行える一方、静的コンパイラは一般的なケースに対する最適化を行います。
A: JITは実行時プロファイル情報を使って実際の実行パスに特化した最適化が可能で、より効果的な変換を行える一方、静的コンパイラは一般的なケースに対する最適化を行います。
関連キーワード: コンパイラ最適化、ループ最適化、インライン化、定数畳み込み、デッドコード除去、レジスタ割付、最適化レベル、JIT、命令スケジューリング、コードサイズと性能のトレードオフ

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

