基本情報技術者 2016年 春期 午前(科目A) 問19
問題文
コンパイラにおける最適化の説明として、適切なものはどれか。
選択肢
ア:オブジェクトコードを生成する代わりに、インタプリタ用の中間コードを生成する。
イ:コンパイルを実施するコンピュータとは異なるアーキテクチャをもったコンピュータで動作するオブジェクトコードを生成する。
ウ:ソースコードを解析して、実行時の処理効率を高めたオブジェクトコードを生成する。(正解)
エ:プログラムの実行時に、呼び出されたサブプログラム名やある時点での変数の内容を表示するようなオブジェクトコードを生成する。
🔒 解説は解答すると表示されます
コンパイラ最適化【午前解説】
正解の理由
選択肢の中で最も適切なのは ウ です。コンパイラの最適化(optimization)はソースコードを解析し、不要な命令の削除や計算の前倒し、関数のインライン化、レジスタ割当の改善などの変換を行って、生成されるオブジェクトコード(機械語)を実行時に高速化または小型化することを目的とします。したがって「ソースコードを解析して、実行時の処理効率を高めたオブジェクトコードを生成する」という記述が最も正確です。
解法ステップ
- 問題文で固有名詞(ここでは「最適化」)の意味を明確にする。
- 各選択肢のキーワード(中間コード、異なるアーキテクチャ、実行効率、実行時表示)を照合する。
- 「最適化」の目的(実行性能・コードサイズ改善)に合致する選択肢を探す。
- 目的が異なる選択肢(中間コード生成、クロスコンパイル、デバッグ出力)を除外する。
- 残った選択肢が定義に合致するかを最終確認する。
選択肢別の誤答解説
- ア: オブジェクトコードを生成する代わりに、インタプリタ用の中間コードを生成する。
- 解説: これは「コンパイル対象を変える(中間コード生成)」の説明で、性能最適化を指すものではありません。中間コードは移植性やインタプリタ実行のためのもので、最適化そのものではないため誤りです。
- イ: コンパイルを実施するコンピュータとは異なるアーキテクチャをもったコンピュータで動作するオブジェクトコードを生成する。
- 解説: これはクロスコンパイル(ターゲットアーキテクチャの異なるコード生成)の説明であり、最適化の定義とは目的が異なります。
- ウ: ソースコードを解析して、実行時の処理効率を高めたオブジェクトコードを生成する。
- 解説: これが正解です。コンパイラ最適化は解析と変換を通じて実行効率やコードサイズを改善する工程を指します。
- エ: プログラムの実行時に、呼び出されたサブプログラム名やある時点での変数の内容を表示するようなオブジェクトコードを生成する。
- 解説: これはデバッグ情報やロギングを組み込む処理の説明で、最適化とは目的が異なります。
よくある誤解
- 「最適化=中間コードを生成する」と誤解しやすいが、中間コードは別の目的(ポータビリティやインタプリタ用)で使われ、最適化は生成物の性能改善が主目的です。
- 「別アーキテクチャ用のコード生成=最適化」と混同する人がいるが、これはクロスコンパイルの概念であり最適化そのものではありません。
- 「実行時に情報を表示するコードを生成するのが最適化」と考えるのは誤りで、表示はデバッグやロギングで最適化とは無関係です。
補足コラム
コンパイラ最適化の代表的な手法(概要)
- 定数畳み込み(constant folding):コンパイル時に定数計算を行い命令数を削減。
- 死コード削除(dead code elimination):到達しないコードや効果のない計算を除去。
- 関数インライン化(inlining):呼び出しオーバーヘッドを減らすために関数本体を展開。
- ループ最適化:ループ展開、ループ不変式の外出し等で反復処理を高速化。
- レジスタ割当と命令選択:レジスタ使用を最適化してメモリアクセスを減らす。
簡単な例(Cコード):
// 最適化前
int square_plus_one(int x){ return x * x + 1; }
int f(){ int a = 3; return square_plus_one(a); }
// 最適化後(インライン化と定数畳み込みの例)
int f(){ int a = 3; return 3 * 3 + 1; } // さらに定数計算で 10 に変換可能
このようにコンパイラは関数の展開や定数の前計算で実行時コストを削減します。ただし最適化はコンパイル時間を増やしたり、デバッグを難しくしたりするトレードオフがあります。
FAQ
Q1. 最適化すると常に実行結果は変わらないですか?
A1. 原則は同じ振る舞いですが、未定義動作に依存するコードでは最適化で挙動が変わることがあります。定義された動作下での最適化は意味を保ちます。
A1. 原則は同じ振る舞いですが、未定義動作に依存するコードでは最適化で挙動が変わることがあります。定義された動作下での最適化は意味を保ちます。
Q2. 最適化と中間コード生成はどちらが先ですか?
A2. コンパイラ設計により異なります。多段コンパイラは中間表現(IR)上で最適化を行い、その後オブジェクトコードを生成することが多く、IR生成と最適化は両立します(ただし問題の「最適化」の目的は実行効率向上です)。
A2. コンパイラ設計により異なります。多段コンパイラは中間表現(IR)上で最適化を行い、その後オブジェクトコードを生成することが多く、IR生成と最適化は両立します(ただし問題の「最適化」の目的は実行効率向上です)。
Q3. 高い最適化レベルは常に良いですか?
A3. 最適化レベルが高いほど実行性能が向上する傾向はありますが、コンパイル時間の増加やデバッグ困難、サイズ増加など副作用があります。用途に応じて選択します。
A3. 最適化レベルが高いほど実行性能が向上する傾向はありますが、コンパイル時間の増加やデバッグ困難、サイズ増加など副作用があります。用途に応じて選択します。
関連キーワード: コンパイラ、最適化、オブジェクトコード、中間コード、インタプリタ、クロスコンパイル、定数畳み込み、ループ最適化、インライン化、死コード削除

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

