コンパイラ

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

プログラミング基礎

コンパイラとは

コンパイラ (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 / clang C / C++ 歴史が長く、最適化が強力
rustc Rust メモリ安全性を保証
go build Go コンパイルが高速
javac Java バイトコードを生成
tsc TypeScript 型チェック + JavaScript 生成

コンパイル時間の問題

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

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

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

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

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

関連用語

関連する記事