コンパイラ
人間が書いたソースコードを機械が実行できる形式に一括変換するプログラム
プログラミング基礎
コンパイラとは
コンパイラ (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 のキャッシュ機構がこれにあたる。
コンパイラの仕組みと言語処理系の設計は関連書籍に詳しい。
この記事は役に立ちましたか?