コンパイラの最適化とは?
コンパイラの最適化とは、コンパイラが、意味を変えずに生成コードを速く・小さくするために行う変換。組込み開発では、速度を狙う最適化と容量を狙う最適化が相反する点が重要になる。定数の畳込み(コンパイル時に確定する式を先に計算して定数へ置き換える)と共通部分式の除去は命令そのものを消すのでコードが小さくなる。一方、関数のインライン展開(呼出しを本体の複製で置き換える)とループのアンローリング(繰返しの本体を複数回分展開する)は、呼出しや分岐の手間を省く代わりにコードを複製するので大きくなる。ループ内不変式の移動は、繰返しのたびに値が変わらない計算をループの外へ出すもので、実行回数は減るが命令数はほぼ変わらない。
エンベデッドシステムスペシャリスト試験の過去問では2回出題されています(2016年度〜2019年度)。
こんぱいらのさいてきか
コンパイラの最適化の意味
コンパイラが、意味を変えずに生成コードを速く・小さくするために行う変換。組込み開発では、速度を狙う最適化と容量を狙う最適化が相反する点が重要になる。定数の畳込み(コンパイル時に確定する式を先に計算して定数へ置き換える)と共通部分式の除去は命令そのものを消すのでコードが小さくなる。一方、関数のインライン展開(呼出しを本体の複製で置き換える)とループのアンローリング(繰返しの本体を複数回分展開する)は、呼出しや分岐の手間を省く代わりにコードを複製するので大きくなる。ループ内不変式の移動は、繰返しのたびに値が変わらない計算をループの外へ出すもので、実行回数は減るが命令数はほぼ変わらない。
コンパイラの最適化の具体例
for (i=0;i<100;i++) a[i] = 60*60*24 + b; をコンパイルすると、60*60*24 は定数の畳込みで86400に置き換わり、乗算命令が3つ消える。さらに +b がループ内不変ならループ外へ移動される。一方、この繰返しを4回分ずつ展開するアンローリングを掛けると、分岐は1/4に減るが本体の命令列は約4倍に膨らむ。
コンパイラの最適化は試験でどう引っ掛けられる?
「最適化=小さくなる」と一括りにしないこと。記憶容量を減らせるのは定数の畳込みのように命令を消す種類だけで、インライン展開とループアンローリングは容量を増やす方向に働く。ROM容量が厳しい組込み機器で速度重視の最適化を掛けると入りきらなくなる、という形で問われる。
コンパイラの最適化と関連する用語
コンパイラの最適化が出た過去問
コンパイラによる最適化において、オブジェクトコードの所要記憶容量が削減できるものはどれか。
正解:定数の畳込み
要点:定数畳込みは命令自体を消すのでコード量が減る
定数の畳込みは、コンパイル時に値が確定する演算をあらかじめ計算し、その結果の定数に置き換える最適化である。実行時の演算命令そのものが消えるので、生成されるコードの量が減り、実行速度も上がる。これに対し、インライン展開やループ展開は実行速度を狙って命令を複製するため、コード量は増える方向に働く。
出典:平成28年度 春期 エンベデッドシステムスペシャリスト試験 am2 問11(IPA)コンパイラによる最適化において、オブジェクトコードの所要記憶容量が削減できるものはどれか。
正解:定数の畳み込み
要点:定数の畳み込みは事前計算で命令を減らし容量も削減する
定数の畳み込みは、コンパイル時に確定する定数式をあらかじめ計算して結果に置き換える最適化で、実行時の演算命令が消えるためコードサイズも実行時間も削減できる。これに対しインライン展開とループアンローリングは、呼出しや分岐を減らす代わりにコードを複製するのでオブジェクトコードは大きくなる。ループ内不変式の移動は実行回数を減らす最適化で、記憶容量の削減が主目的ではない。
出典:令和1年度 春期 エンベデッドシステムスペシャリスト試験 am2 問11(IPA)
最終更新:2026-08-25/解説は資格暗記が独自に作成しています。 過去問の出典は各問題に記載のとおりです。