FE EXAM

コンパイラ(一括翻訳のしくみ)

ソースコード全体を一括して機械語に翻訳し、実行ファイルを生成するプログラム。

INTERACTIVE VISUALIZATION
ソース
変換段階
実行ファイル
現在の段階
ソースコード
進行度
1 / 7
翻訳方式
一括翻訳
シナリオ
ステップ1 / 7
STEP 1/7ソースコード(翻訳の前)まだ翻訳していない状態です。人間が書いたソースコード「x = 1 + 2」が入力です。コンピュータはこの文字の並びをそのままでは実行できないので、コンパイラがこれから順番に各段階を通して機械語へ変換していきます。
ソースコード字句解析構文解析意味解析最適化コード生成実行ファイル
source.txt
x = 1 + 2
解説

📌
コンパイラとは

ソース全体一括翻訳実行ファイル

コンパイラとは、ソースコード全体を一括して機械語に翻訳し、実行ファイルを生成するプログラムです。プログラムを動かす前に「全部まとめて翻訳しておく」のが最大の特徴です。

身近な例で考えると、本を1冊まるごと翻訳して出版するのに似ています。最初に全文を訳して翻訳版の本(実行ファイル)を刷っておけば、読者は訳者を待たずにすぐ読めます。翻訳に手間はかかりますが、一度作れば何度でもスムーズに読めるわけです。

上のツールで▶ボタンを押すと、「x = 1 + 2」という小さなコードが、字句解析から実行ファイル完成まで各段階を順に通っていく様子を確認できます。

🔧
変換ステップ

コンパイラは、ソースコードを次の段階を順に通して機械語へ変換します。
字句解析:文字の並びを意味の最小単位(トークン)に分解する
構文解析:トークンが文法的に正しいか調べ、構文木に組み立てる
意味解析:型や変数の整合性など、意味として正しいかを確認する
最適化:結果を変えずに処理を速く・小さくする工夫を施す
コード生成:仕上げに機械語の命令列を作り出す

これは工場の生産ラインに似ています。素材(ソースコード)が、切り分け→組み立て→検査→改良→仕上げ、と各工程を順に流れていき、最後に製品(実行ファイル)が完成するイメージです。前の工程が終わらないと次へ進めない点も生産ラインと同じです。

とくに最適化では、「1 + 2」のように実行前から答えが分かる計算をあらかじめ「3」に計算しておく(定数畳み込み)など、賢い工夫が行われます。上のツールで各段階の中身がどう変わるかを順に追ってみてください。

⚖️
インタプリタとの違い

同じ「高級言語の変換役」でも、いつ翻訳するかが決定的に違います。コンパイラは事前に一括翻訳して実行ファイルを作るので、実行時には翻訳が不要で動作が速いです。一方インタプリタは1行ずつ解釈実行するため、起動が速く移植性(=別の環境でも動かしやすい性質)が高い反面、毎回解釈する分だけ実行は遅くなります。

項目コンパイラインタプリタ
翻訳のしかた事前に一括翻訳1行ずつ解釈実行
実行ファイル作る作らない
実行速度速い遅め
得意なこと実行性能起動の速さ・移植性

料理にたとえると、コンパイラはレシピを全部読んで作り置きしておく方式、インタプリタはレシピを1行読んでは作る方式です。作り置きは食べるときが速く、その場調理は手軽に始められる、と覚えると整理しやすいです。

📌
一括翻訳のメリットとデメリット

コンパイル時全体を翻訳エラーをまとめて発見できる一度だけ実行時翻訳済みを動かすだけ→ とにかく速い(OS・CPU依存あり)

コンパイラの一括翻訳には大きなメリットが2つあります。
実行が速い:実行時には翻訳済みの機械語を動かすだけなので、毎回解釈する手間がない
エラーを事前にまとめて発見できる:コンパイル時にソース全体をチェックするため、実行する前に間違いを見つけられる

一方でデメリットもあります。
最初のコンパイルに時間がかかる:大きなプログラムは翻訳だけで数分かかることもある
環境に依存した実行ファイルができる:Windowsで作った実行ファイルはMacではそのまま動かないことが多い。実行ファイルはOSやCPUの種類に合わせて作られるため、別の環境では再度コンパイルが必要になる

なぜ実行が速いのか、もう少し掘り下げると——コンピュータが直接理解できるのは機械語(=CPUが実行できる命令の並び)だけです。コンパイラはすでに機械語に変換済みのファイルを作るので、実行時は「命令どおりに動くだけ」。インタプリタのように毎回「どういう意味か?」と解釈し直す必要がないぶん、速く動けるのです。

📌
アセンブラ・リンカとの違い

高級言語コンパイラ目的ファイル(中間産物)アセンブリ言語アセンブラコンパイラ経路アセンブラ経路

コンパイラと似た名前の道具がいくつかありますが、役割が違います。
コンパイラ:人間が書いた高級言語(C言語・Javaなど)を機械語に一括翻訳する
アセンブラアセンブリ言語(=機械語とほぼ1対1に対応した低レベルな言語)を機械語に変換する。コンパイラより翻訳対象のレベルが低い
リンカ:コンパイラが作った目的ファイル(=まだ完成していない機械語の断片)を複数結合して、1つの実行ファイルを完成させる

なぜリンカが必要か。大きなプログラムは複数のソースファイルに分けて書かれることが多く、コンパイラはファイルごとに目的ファイルを作ります。バラバラの部品をひとつにまとめて初めて動く実行ファイルになるので、それをつなぐ「接着剤」がリンカです。身近な例では、工場で作られた部品(目的ファイル)を組み立てて製品(実行ファイル)に仕上げる最終工程がリンカの仕事です。

練習問題

🎯
基本情報技術者 練習問題

Q1.コンパイラの説明として最も適切なものはどれか。
A.ソースコードを1行ずつ解釈しながら実行する
B.ソースコード全体を一括して機械語に翻訳し、実行ファイルを生成する
C.アセンブリ言語だけを機械語に変換する
D.複数の目的ファイルを結合して1つにまとめる
Q2.コンパイラの変換ステップを正しい順に並べたものはどれか。
A.構文解析 → 字句解析 → 意味解析 → 最適化 → コード生成
B.字句解析 → 構文解析 → 意味解析 → 最適化 → コード生成
C.コード生成 → 最適化 → 意味解析 → 構文解析 → 字句解析
D.字句解析 → 意味解析 → 構文解析 → コード生成 → 最適化
Q3.コンパイラとインタプリタの違いとして正しいものはどれか。
A.コンパイラは1行ずつ実行し、インタプリタは一括翻訳する
B.コンパイラは事前に一括翻訳して実行ファイルを作り、インタプリタは1行ずつ解釈実行する
C.どちらも実行ファイルを必ず生成する
D.コンパイラは実行が遅く、インタプリタは実行が速い

関連コンテンツ