対象試験と出題頻度
コンパイラは、ITパスポート・基本情報技術者・応用情報技術者のすべてで出題されるテーマです。
「インタプリタとの違い」や「コンパイルの処理順序(字句解析→構文解析→意味解析→最適化→コード生成)」を正確に区別できるかが繰り返し問われています。
詳細をクリックして確認
ITパスポート
基本情報技術者
応用情報技術者
★★★★☆
ランクA(重要)必ず覚えておくべき
用語の定義
情報処理試験を勉強していると、「コンパイラって結局何をするもの?インタプリタとどう違うの?」と混乱しがちです。
コンパイラ(Compiler)とは、一言で言うと
「人間が書いたソースコードを、コンピュータが実行できる機械語へ一括で翻訳するソフトウェア」
のことです。
イメージとしては、「本を丸ごと翻訳してから出版する翻訳者」です。
原稿(ソースコード)を最初から最後まで通して翻訳し、完成した翻訳本(機械語のプログラム)を一冊仕上げてから読者(CPU)に渡します。
途中で1ページずつ訳して読ませるのではなく、全体を翻訳し終えてから渡す点がコンパイラの特徴です。
📊 コンパイラの基本情報
| 項目 | 内容 |
|---|---|
| 英語名 | Compiler(compile=まとめる・編集する) |
| 分類 | 言語プロセッサ(言語処理系)の一種 |
| 入力 | ソースコード(原始プログラム) |
| 出力 | 目的プログラム(オブジェクトコード) |
| 最大の特徴 | ソースコード全体を一括で翻訳してから実行する |
解説
人間が書くプログラミング言語(C言語、Javaなど)は、そのままではCPUが理解できません。CPUが直接実行できるのは0と1で構成された機械語だけです。
この「人間の言葉」と「機械の言葉」の橋渡しを行うのが言語プロセッサであり、その代表格がコンパイラです。
コンパイルの5つの処理段階
コンパイラがソースコードを機械語に変換する工程は、5つのフェーズに分かれます。ここだけは確実に押さえてください。
📊 コンパイルの処理フロー
▶ 各フェーズの詳細(クリックで展開)
① 字句解析(Lexical Analysis)
ソースコードの文字列を、意味のある最小単位「トークン」に分割します。
int a = 5 + 3;
// ↓ トークンに分割int(型) a(変数) =(代入) 5(整数) +(加算) 3(整数) ;(区切り)
② 構文解析(Syntax Analysis)
トークンの並びがプログラミング言語の文法規則に合っているかをチェックし、構文木(パースツリー)を生成します。
| = | |||
| a | + | ||
| 5 | 3 | ||
▲ 構文木のイメージ:代入文 a = 5 + 3 を木構造で表現
③ 意味解析(Semantic Analysis)
構文的には正しくても、意味的に矛盾がないかを検証します。たとえば「宣言されていない変数を使っていないか」「整数型の変数に文字列を代入していないか」といったデータ型の整合性チェックがこのフェーズです。
④ 最適化(Optimization)
実行効率を高めるためにプログラムを再構成します。不要な演算の省略、定数同士の計算を事前に済ませる「定数畳み込み」、ループの展開などが行われます。
int a = 2 * 5;
// 最適化後(定数畳み込み)int a = 10;
⑤ コード生成(Code Generation)
最適化されたプログラムをもとに、CPUが実行可能な機械語やアセンブリ言語を出力します。これが最終成果物である「目的プログラム(オブジェクトコード)」です。
インタプリタとの違い
コンパイラと対になる言語プロセッサがインタプリタです。両者の違いは「翻訳の単位」と「実行タイミング」で整理できます。
| 比較項目 | コンパイラ | インタプリタ |
|---|---|---|
| 翻訳単位 | ソースコード全体を一括で翻訳 | 1行(1命令)ずつ逐次的に翻訳 |
| 実行速度 | 翻訳済みの機械語を直接実行するため高速 | 翻訳と実行を同時進行するため低速 |
| 目的プログラム | 生成する | 生成しない |
| エラー検出 | 翻訳時に全体のエラーをまとめて検出 | 実行中にエラーの行で停止 |
| 代表的な言語 | C、C++、Go | Python、Ruby、JavaScript |
▶ その他の言語プロセッサとの比較(クリックで展開)
| 言語プロセッサ | 役割 |
|---|---|
| アセンブラ | アセンブリ言語(低水準言語)を機械語に変換する。命令が1対1で対応するため、構文解析や最適化は行わない。 |
| クロスコンパイラ | 開発マシンとは異なるCPU向けの機械語を生成するコンパイラ。組み込みシステム開発で使われる。 |
| JITコンパイラ | 実行時に中間コード(バイトコード)を機械語に変換する。JavaのJVMが代表例で、インタプリタの柔軟性とコンパイラの実行速度を両立する。 |
では、この用語が試験でどのように出題されるか見ていきましょう。
💡 コンパイラの核心を3行で
・ソースコード全体を機械語に一括翻訳し、目的プログラムを生成する言語プロセッサ
・処理順序は「字句解析→構文解析→意味解析→最適化→コード生成」の5段階
・インタプリタは1行ずつ逐次実行、コンパイラは全体を翻訳してから実行する点が対比のポイント
試験ではこう出る!
コンパイラは、IP・FE・APの全試験区分で繰り返し出題されている定番テーマです。
出題パターンは大きく3つに分かれます。
📊 過去問での出題実績
| 試験回 | 出題内容 | 問われたポイント |
|---|---|---|
| IP H25秋 問55 |
インタプリタ方式とコンパイラ方式の実行の流れを図で示し、空欄に入る語を選ぶ問題。 | ・「目的プログラムを生成してから実行」がコンパイラ方式 ・「ソースコードを直接実行」がインタプリタ方式 |
| FE H30秋 科目A 問19 |
コンパイラが行う処理のうち、最初に行う処理を選ぶ問題。 | ・字句解析→構文解析→意味解析→最適化→コード生成の順序 ・正解は「字句解析」 |
| AP R6秋 午前 問20 |
コンパイラがコード生成までに行う処理のうち、最後に行う処理を選ぶ問題。 | ・FE H30秋 問19の逆パターン(流用問題) ・正解は「最適化」(コード生成の直前) |
| AP H25秋 午前 問20 |
字句解析・構文解析・意味解析・最適化の4フェーズのうち、意味解析の処理内容を選ぶ問題。 | ・各フェーズの処理内容を正確に区別できるか ・「変数の宣言と使用の対応付け」「データ型の整合性チェック」が意味解析 |
📝 IPA試験での出題パターン
パターン1:「コンパイラとインタプリタの違いを選べ」
IP・FEレベルで頻出。「一括翻訳か逐次翻訳か」「目的プログラムを生成するかしないか」の2軸で判断すれば即答できる。
パターン2:「処理順序の最初/最後を選べ」
FE・APレベルで繰り返し出題。5段階の順序を暗記しておけば確実に得点できる。「字句→構文→意味→最適→コード生成」の頭文字「じ・こ・い・さ・こ」で覚えるのも一手。
パターン3:「各フェーズの処理内容を選べ」
APレベルで出題。4つの選択肢にそれぞれ別フェーズの説明が並び、指定されたフェーズに該当するものを選ぶ形式。字句解析=「トークン分割」、構文解析=「文法チェック・構文木生成」、意味解析=「型の整合性チェック」、最適化=「実行効率の向上」というキーワードで区別する。
試験ではここまででOKです。コンパイラ自体の実装方法(再帰下降構文解析など)まで問われることはないので、深追いは不要です。
【確認テスト】理解度チェック
ここまでの内容を理解できたか、簡単なクイズで確認してみましょう。
Q. コンパイラの説明として、最も適切なものはどれでしょうか?
- A. ソースコードを1行ずつ解釈しながら逐次実行し、目的プログラムは生成しない。
- B. 高水準言語で記述されたソースコードを字句解析・構文解析・意味解析・最適化・コード生成の段階を経て、機械語の目的プログラムに一括変換する。
- C. アセンブリ言語の命令を1対1で機械語の命令に変換する。
正解と解説を見る
正解:B
解説:
コンパイラは、高水準言語のソースコードを5つの処理段階を経て機械語の目的プログラムへ一括変換する言語プロセッサです。「一括翻訳」「目的プログラムの生成」がキーワードになります。
選択肢Aはインタプリタの説明です。1行ずつ解釈・実行する方式であり、翻訳済みの目的プログラムを生成しません。選択肢Cはアセンブラの説明です。低水準言語であるアセンブリ言語を機械語に1対1で変換する処理であり、高水準言語を対象とする構文解析や最適化は含まれません。
よくある質問(FAQ)
Q. コンパイラが生成した目的プログラムは、そのまま実行できますか?
そのままでは実行できません。コンパイラが生成する目的プログラム(オブジェクトコード)は、標準ライブラリや外部モジュールへの参照が未解決の状態です。これを実行可能にするには「リンカ(連係編集プログラム)」で必要なモジュールを結合し、ロードモジュール(実行ファイル)にする工程が必要です。さらに実行時には「ローダ」が主記憶にプログラムを読み込みます。
Q. Javaは「コンパイラ言語」と「インタプリタ言語」のどちらですか?
Javaは両方の仕組みを併用しています。まずJavaコンパイラがソースコードをバイトコード(中間コード)に変換し、次にJVM(Java仮想マシン)上のインタプリタまたはJITコンパイラがバイトコードを機械語に変換して実行します。このため、どちらか一方に分類するのは正確ではありません。IPA試験では「中間コードを生成して仮想マシンで実行する方式」として問われることがあります。
Q. コンパイラの構文解析と逆ポーランド記法はどう関係していますか?
構文解析で生成された構文木を後順走査(帰りがけ順)でたどると、逆ポーランド記法の式が得られます。コンパイラは内部的にこの記法を中間表現として利用し、スタックベースで計算順序を管理しています。試験では別々のテーマとして出題されますが、裏側ではつながっている概念です。
Q. コンパイラの字句解析とオートマトンは関係がありますか?
直結しています。字句解析では、正規表現で定義したトークンのパターンを内部的に有限オートマトンに変換し、ソースコードの文字列をトークン列に分割しています。つまり、オートマトンは字句解析の実装基盤です。ただし、この関係はAPレベルでも詳細を問われることはないので、「字句解析はオートマトンで動いている」という認識で十分です。