コンパイラ

人間が書いたソースコードを機械が実行できる形式に一括変換するプログラム

プログラミング基礎
コンパイラ」の技術書を見る (57 冊) →

コンパイラとは

コンパイラ (Compiler) は、人間が書いたソースコードを機械が実行できる形式に変換するプログラムである。ソースコード全体を一括で解析・変換し、実行可能なファイルを生成する。

コンパイラとインタプリタの違い

プログラムを実行する方式は大きく 2 つに分かれる。

方式動作
コンパイラソースコード全体を事前に変換C, Rust, Go, Java
インタプリタソースコードを 1 行ずつ逐次実行Python, Ruby, JavaScript

コンパイラは実行前に変換を済ませるため、実行速度が速い。インタプリタは変換なしにすぐ実行できるため、開発中の試行錯誤が楽である。

実際には多くの言語が両方の要素を持つ。Java はコンパイラでバイトコードに変換し、JVM (インタプリタ + JIT コンパイラ) で実行する。JavaScript もエンジン内部で JIT コンパイルされる。

コンパイルの流れ

コンパイラは以下の段階でソースコードを変換する。

ソースコード
  ↓ 字句解析 (Lexing)
トークン列
  ↓ 構文解析 (Parsing)
抽象構文木 (AST)
  ↓ 意味解析 (Semantic Analysis)
型チェック済み AST
  ↓ 最適化 (Optimization)
最適化済み中間表現
  ↓ コード生成 (Code Generation)
機械語 / バイトコード

トランスパイラとの違い

トランスパイラは、ある言語から別の言語への変換を行う。コンパイラが「高級言語 → 機械語」なのに対し、トランスパイラは「高級言語 → 高級言語」である。

ツール変換
TypeScript コンパイラ (tsc)TypeScript → JavaScript
Babel新しい JavaScript → 古い JavaScript
Rust コンパイラ (rustc)Rust → 機械語
Go コンパイラGo → 機械語

TypeScript の tsc は厳密にはトランスパイラだが、型チェックも行うためコンパイラと呼ばれることが多い。

コンパイルエラー

コンパイラはソースコードの問題を実行前に検出する。これがコンパイルエラーである。

// TypeScript のコンパイルエラー例
const name: string = 42;
// Error: Type 'number' is not assignable to type 'string'

コンパイルエラーは実行前に問題を発見できるため、実行時エラーより対処しやすい。静的型付け言語のコンパイラは、型の不整合を網羅的にチェックしてくれる。

主要なコンパイラ

コンパイラ言語特徴
gcc / clangC / C++歴史が長く、最適化が強力
rustcRustメモリ安全性を保証
go buildGoコンパイルが高速
javacJavaバイトコードを生成
tscTypeScript型チェック + JavaScript 生成

コンパイル時間の問題

大規模プロジェクトではコンパイル時間が開発効率に影響する。

対策説明
インクリメンタルコンパイル変更されたファイルだけ再コンパイル
キャッシュ前回のコンパイル結果を再利用
並列コンパイル複数ファイルを同時にコンパイル

TypeScript の --incremental フラグや、Rust の cargo のキャッシュ機構がこれにあたる。

コンパイラの仕組みと言語処理系の設計は関連書籍に詳しい。

この記事は役に立ちましたか?

関連用語

関連する記事