---
title: "コンパイラ最適化とは？実行時間を短縮する仕組みを整理【基本情報技術者試験】"
description: "コンパイラ最適化を、生成する目的プログラムの実行効率を高める処理として整理し、実行時間短縮とコンパイル時間短縮の違い、定数畳み込み・不要コード削除などの代表例をFE試験向けに解説します。"
last_modified_at: "2026-08-16"
canonical_url: "https://stemtazoo.github.io/fe/compiler-optimization/"
section: "fe"
---

## まず結論

コンパイラ最適化とは、**ソースプログラムの意味を保ちながら、生成する目的プログラムをより効率よく実行できる形に変換する処理**です。

基本情報技術者試験では、まず次の切り分けを押さえると判断しやすくなります。

```text
コンパイラ最適化
→ 生成後のプログラムを速く・効率よくする

コンパイル時間の短縮
→ コンパイラ自身の処理を速くする
```

特に **「プログラムの実行時間を短縮する」** は、コンパイラ最適化の代表的な目的です。

## 直感的な説明

コンパイラ最適化は、**同じ仕事をするなら、むだの少ない手順に組み替える**と考えると分かりやすいです。

例えば、次の計算を考えます。

```text
x = 10 * 2
```

実行するたびに `10 * 2` を計算する必要がないなら、コンパイラがあらかじめ計算して、

```text
x = 20
```

のような形に変えられます。

プログラムの意味は同じですが、実行時の処理を減らせます。

つまり、

```text
同じ結果を出す
＋
むだな処理を減らす
↓
実行効率を高める
```

というのが最適化の基本イメージです。

## 定義・仕組み

コンパイラは、高水準言語で書かれたソースプログラムを、コンピュータが実行できる目的プログラムへ変換します。

大まかには、次のような処理を行います。

```text
ソースプログラム
↓
字句解析
↓
構文解析
↓
意味解析
↓
最適化
↓
コード生成
↓
目的プログラム
```

最適化では、**プログラムの動作結果を変えない範囲で、実行効率がよくなる形へ変換**します。

代表的な例として、次のようなものがあります。

| 最適化の例 | 何をする？ |
|---|---|
| 定数畳み込み | 定数だけの計算を事前に済ませる |
| 不要コード削除 | 実行結果に影響しない処理を削除する |
| 共通部分式除去 | 同じ計算の繰返しを減らす |
| ループ最適化 | 繰返し処理のむだを減らす |
| インライン展開 | 関数呼出しの一部を展開して呼出しコストを減らす |

例えば、

```text
a = 3 * 4
```

のように定数だけで計算できる場合は、

```text
a = 12
```

へ変換できます。

また、結果がどこからも使われない処理があれば、削除できる場合があります。

このテーマは、基本情報技術者試験の「ソフトウェア」や「プログラム言語」と関係する内容です。公式の出題範囲やシラバスは、[IPA：基本情報技術者試験](https://www.ipa.go.jp/shiken/kubun/fe.html) から確認できます。

## 科目Aでどう出る？

科目Aでは、**コンパイラ最適化の目的は何か**を問う形に注意します。

判断するときは、選択肢が「何を改善しようとしているか」を見ます。

| 選択肢の内容 | 主に関係するもの |
|---|---|
| 生成されたプログラムの実行時間を短縮する | コンパイラ最適化 |
| ソースコードのデバッグを容易にする | デバッガ・デバッグ情報 |
| ソースコードの保守性を高める | コーディング規約・設計・可読性 |
| 目的プログラムを生成する時間を短縮する | コンパイラ自身の処理性能 |

一番重要な判断基準は、次です。

```text
実行するプログラムを速くする
→ コンパイラ最適化

コンパイルそのものを速くする
→ 別の話
```

### 「最適化」という言葉だけで決めない

「時間を短縮する」と書かれていても、**どの時間なのか**を確認します。

```text
プログラムの実行時間
→ 最適化の目的

目的プログラムを生成する時間
→ コンパイル時間
```

この違いを見れば、よく似た選択肢を切りやすくなります。

## どんな場面で使う？

コンパイラ最適化は、同じソースコードから、より効率よく動く目的プログラムを生成したいときに使われます。

例えば、次のような改善につながることがあります。

- 実行時間を短くする
- 不要な命令を減らす
- CPUやレジスタを効率よく使う
- メモリアクセスを減らす
- 目的プログラムのサイズを小さくする

ただし、すべての最適化が必ず実行時間を短くするとは限りません。

例えば、実行速度とコードサイズがトレードオフになることもあります。

FE試験では細かな最適化アルゴリズムより、**「プログラムの意味を変えずに実行効率を改善する」**という目的を押さえることを優先します。

## よくある誤解・混同

### 最適化するとコンパイルが速くなる？

必ずしもそうではありません。

むしろ最適化処理を増やすと、コンパイルに時間がかかる場合もあります。

```text
最適化の主目的
→ 生成後のプログラムを効率化する

コンパイル時間
→ コンパイラが変換にかける時間
```

この二つを分けて考えます。

### 最適化するとソースコードの保守性が上がる？

コンパイラ最適化の主目的ではありません。

保守性は、人がソースコードを読み、修正しやすいかという観点です。

```text
保守性
→ 命名、コメント、構造化、設計

最適化
→ 実行効率
```

目的が違います。

### 最適化するとデバッグしやすくなる？

これも主目的ではありません。

最適化によって、ソースコードと実際に実行される命令の対応が分かりにくくなり、逆にデバッグしにくくなる場合もあります。

デバッグを容易にするのは、デバッガやデバッグ情報などの役割です。

### 最適化は処理結果を変えてよい？

基本的には、**プログラムとしての意味を保ったまま効率を改善する**ことが重要です。

```text
結果を変える
→ 正しい最適化ではない

同じ結果を、より効率よく得る
→ 最適化
```

### 「コード生成」と「最適化」は同じ？

同じではありません。

```text
最適化
→ より効率のよい形に整える

コード生成
→ 実際の目的コードへ変換する
```

コンパイラ内部では関連しますが、役割を分けて考えると理解しやすくなります。

## まとめ（試験直前用）

- コンパイラ最適化は、プログラムの意味を保ちながら実行効率を高める処理
- 代表的な目的は、**生成後のプログラムの実行時間を短縮すること**
- 「実行時間の短縮」と「コンパイル時間の短縮」を混同しない
- 保守性はソースコード設計、デバッグ容易性はデバッグ支援の話として切り分ける
- 定数畳み込み、不要コード削除、ループ最適化などが代表例

> **コンパイルを速くするのではなく、コンパイル後のプログラムを効率よくする。**
