コンパイルとインタプリタ
プログラミング言語には、ソースコードを実行する方法が2種類あります。
2つの実行方式
コンパイル方式(Rustはこちら)
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ ソースコード │ ──→ │ コンパイラ │ ──→ │ 実行ファイル │
│ (hello.rs) │ │ (rustc) │ │ (hello) │
└─────────────┘ └─────────────┘ └─────────────┘
│
↓
┌─────────────┐
│ 何度でも実行 │
└─────────────┘
特徴:
- 実行前にソースコード全体を機械語に変換(コンパイル)
- 一度変換すると、何度でも高速に実行できる
- 変換時にエラーを検出できる
例え: 本の翻訳
英語の本を日本語に翻訳して出版するようなもの。翻訳には時間がかかるが、一度翻訳すれば何度でも読める。
インタプリタ方式
┌─────────────┐ ┌─────────────┐
│ ソースコード │ ──→ │インタプリタ │ ──→ 実行
│ (hello.py) │ │ (python) │
└─────────────┘ └─────────────┘
│
↓
1行ずつ変換しながら実行
特徴:
- 実行しながら1行ずつ変換(逐次解釈)
- すぐに実行できる
- 実行速度はコンパイル方式より遅い
例え: 同時通訳
英語のスピーチを同時通訳するようなもの。すぐに理解できるが、通訳しながらなので時間がかかる。
比較表
| 観点 | コンパイル方式 | インタプリタ方式 |
|---|---|---|
| 変換タイミング | 実行前に全体を変換 | 実行中に1行ずつ |
| 実行速度 | 高速 | 比較的遅い |
| エラー検出 | 実行前に検出 | 実行時に検出 |
| 開発サイクル | 変換に時間がかかる | すぐ試せる |
| 代表的な言語 | Rust, C, C++, Go | Python, JavaScript, Ruby |
Rustがコンパイル言語である意味
Rustはコンパイル方式を採用しています。これには大きなメリットがあります。
1. 実行前にエラーを発見できる
fn main() {
let x = 5;
x = 6; // エラー!変更不可の変数を変更しようとしている
}
このコードはコンパイル時にエラーになります。プログラムを動かす前に問題がわかります。
インタプリタ方式だと、実際にこの行が実行されるまでエラーがわかりません。
2. 高速に実行できる
コンパイル済みのプログラムは機械語になっているので、CPUが直接実行できます。
実行速度のイメージ:
Rust (コンパイル): ████████████████████ 100%
Python (インタプリタ): ███ 10-30%
3. 配布が簡単
コンパイルして作られた実行ファイルは、そのまま他の人に渡せます。受け取った人はRustをインストールしなくても実行できます。
コンパイルの流れ(Rust)
┌─────────────┐
│ hello.rs │ ソースコードを書く
└──────┬──────┘
│ rustc hello.rs(または cargo build)
↓
┌─────────────┐
│ コンパイル │
│ ・文法チェック│
│ ・型チェック │
│ ・所有権チェック│
│ ・最適化 │
└──────┬──────┘
│
↓
┌─────────────┐
│ hello │ 実行ファイル(機械語)
└──────┬──────┘
│ ./hello
↓
┌─────────────┐
│ 実行結果 │ Hello, World!
└─────────────┘
Rustのコンパイラは特にチェックが厳しいことで知られています。
- 文法チェック:書き方が正しいか
- 型チェック:データの種類が合っているか
- 所有権チェック:メモリの使い方が安全か
これらのチェックのおかげで、実行時のバグを減らせます。
コンパイルエラーは友達
コンパイル時にエラーが出ると、最初は戸惑うかもしれません。
しかし、実行時にエラーが出るより、コンパイル時にエラーが出る方がはるかに良いのです。
なぜなら:
- 実行時エラー:本番環境でユーザーに影響する可能性
- コンパイルエラー:開発中に気づける、ユーザーには影響しない
Rustのコンパイラはエラーメッセージが親切です。エラーを恐れず、メッセージをよく読みましょう。
まとめ
- コンパイル方式: 実行前に全体を変換、高速、エラーを早期発見
- インタプリタ方式: 1行ずつ変換しながら実行、すぐ試せる
- Rustはコンパイル方式: 安全性と速度を両立
- コンパイルエラーは味方: 実行前に問題を発見できる
確認テスト
Q1. コンパイル方式の特徴として正しいものはどれ?
Q2. Rustがコンパイル言語であるメリットとして正しいものはどれ?
Q3. rustc hello.rs を実行すると何が起こる?
rustcはRustコンパイラです。hello.rsをコンパイルして、実行ファイルhelloを生成します。
Q4. 「インタプリタ方式は実行前に全体をチェックするのでエラーを早期に発見できる」この説明は正しい?
Q5. 大量のデータを高速に処理するプログラムに適した方式は?
次のドキュメント: 04_rust_setup.md