基本情報技術者 2011年 秋期 午前(科目A) 問22
問題文
コンパイラにおける最適化の説明として、適切なものはどれか。
選択肢
ア:オブジェクトコードを生成する代わりに、インタプリタ用の中間コードを生成する。
イ:コンパイルを実施するコンピュータとは異なるアーキテクチャをもったコンピュータで動作するオブジェクトコードを生成する。
ウ:プログラムコードを解析して、実行時の処理効率を高めたオブジェクトコードを生成する。(正解)
エ:プログラムの実行時に、呼び出されたサブプログラム名やある時点での変数の内容を表示するようなオブジェクトコードを生成する。
コンパイラにおける最適化の説明【午前2 解説】
要点まとめ
- 結論→ コンパイラの最適化は、プログラムを解析して実行効率やコードサイズを改善するオブジェクトコード生成の処理です。
- 根拠→ 最適化は定数畳み込み、デッドコード削除、ループ変換、インライン化など静的解析に基づく変換で性能向上を図ります。
- 差がつくポイント→ インタプリタ用中間コード、別アーキテクチャ向けのクロス生成、デバッグ用表示とは目的が異なる点を明確に区別してください。
正解の理由
正解は ウ です。コンパイラ最適化とは、ソースコードを解析してプログラムの実行時効率(速度やメモリ使用量、コードサイズなど)を向上させるためにオブジェクトコードを変換・生成する処理を指します。具体的には、定数畳み込みや共通式の除去、ループアンローリング、関数インライン化、デッドコード削除などの手法で、生成されるオブジェクトコードの実行性能を高めます。選択肢ウはこの定義に一致しています。
よくある誤解
- 「最適化=インタプリタ用の中間コード生成」と混同する誤り:中間コード生成は実行方式の違いであり、最適化の定義ではありません。
- 「最適化は常にプログラムを速くする」と思い込む誤り:最適化によってデバッグが困難になったり、コードサイズが増える場合や最適化によって性能が悪化するケースもあります。
- 「最適化=実行時に変数内容を表示するデバッグ機能」との混同:それはトレースやデバッグ用の機能であり、最適化とは別です。
解法ステップ
- 問題文のキーワード「最適化」「コンパイラ」を確認し、目的が「効率向上」であることを把握する。
- 各選択肢が示す処理の目的を短く整理する(中間コード生成、別アーキ向け生成、性能改善、デバッグ情報表示)。
- 「性能改善・オブジェクトコード生成」に該当する選択肢を選ぶ(ウが該当)。
- 他選択肢がインタプリタ、中間コード、デバッグ情報、クロスコンパイルなど別概念であることを根拠に除外する。
選択肢別の誤答解説
- ア: 「オブジェクトコードを生成する代わりに、インタプリタ用の中間コードを生成する。」
→ 誤り。これはコンパイル方式(中間コード+インタプリタ)の説明であり、最適化そのものの定義ではありません。 - イ: 「コンパイルを実施するコンピュータとは異なるアーキテクチャをもったコンピュータで動作するオブジェクトコードを生成する。」
→ 誤り。これはクロスコンパイルの説明で、最適化の本質(性能改善)とは別の概念です。 - ウ: 「プログラムコードを解析して、実行時の処理効率を高めたオブジェクトコードを生成する。」
→ 正解。最適化はまさにこの目的と手法を含みます。 - エ: 「プログラムの実行時に、呼び出されたサブプログラム名やある時点での変数の内容を表示するようなオブジェクトコードを生成する。」
→ 誤り。これはトレースやデバッグ支援の機能説明であり、最適化の説明ではありません。
補足コラム
- 最適化の分類:局所最適化(基本ブロック単位)、グローバル最適化(関数・モジュール単位)、ループ最適化(ループ変換・アンローリング)、プロファイル駆動最適化などがあります。
- コンパイル時最適化と実行時最適化(JIT):JITは実行時の情報を利用して最適化する方式で、静的コンパイラの最適化と役割が重なる部分もありますが、発生タイミングが異なります。
- 実務上の注意点:最適化レベル(例:-O0, -O2, -O3)を上げるとコンパイル時間やデバッグの難易度が上がるため、用途に応じて使い分けます。
- 簡単な例(定数畳み込み):
// 元のコード
int f() {
int x = 2 + 3;
return x * 4;
}
// 最適化後(定数畳み込み・簡約化)
int f() {
return 20;
}
FAQ
Q1: 最適化は必ず速くなるのですか?
A1: ほとんどの場合で性能向上が目的ですが、最適化の種類やコードの特性により逆効果になる場合やデバッグ困難になる場合があります。
A1: ほとんどの場合で性能向上が目的ですが、最適化の種類やコードの特性により逆効果になる場合やデバッグ困難になる場合があります。
Q2: 最適化はどの段階で行われますか?
A2: 主にコンパイル時(静的最適化)ですが、JITなどで実行時に行う場合もあります。
A2: 主にコンパイル時(静的最適化)ですが、JITなどで実行時に行う場合もあります。
Q3: 最適化はセーフティや正確性に影響しますか?
A3: 正規のコンパイラ最適化は言語の規格を尊重しますが、未定義動作に依存するコードでは動作が変わることがあります。
A3: 正規のコンパイラ最適化は言語の規格を尊重しますが、未定義動作に依存するコードでは動作が変わることがあります。
関連キーワード: コンパイラ、最適化、オブジェクトコード、定数畳み込み、ループ最適化、デッドコード削除、インライン化、JIT

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

