Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

コンパイルとインタプリタ

プログラミング言語には、ソースコードを実行する方法が2種類あります。

2つの実行方式

コンパイル方式(Rustはこちら)

┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│ ソースコード │ ──→ │ コンパイラ   │ ──→ │ 実行ファイル │
│ (hello.rs)  │     │ (rustc)    │     │ (hello)     │
└─────────────┘     └─────────────┘     └─────────────┘
                                               │
                                               ↓
                                        ┌─────────────┐
                                        │ 何度でも実行 │
                                        └─────────────┘

特徴:

  • 実行前にソースコード全体を機械語に変換(コンパイル)
  • 一度変換すると、何度でも高速に実行できる
  • 変換時にエラーを検出できる

例え: 本の翻訳

英語の本を日本語に翻訳して出版するようなもの。翻訳には時間がかかるが、一度翻訳すれば何度でも読める。

インタプリタ方式

┌─────────────┐     ┌─────────────┐
│ ソースコード │ ──→ │インタプリタ  │ ──→ 実行
│ (hello.py)  │     │ (python)    │
└─────────────┘     └─────────────┘
                          │
                          ↓
                    1行ずつ変換しながら実行

特徴:

  • 実行しながら1行ずつ変換(逐次解釈)
  • すぐに実行できる
  • 実行速度はコンパイル方式より遅い

例え: 同時通訳

英語のスピーチを同時通訳するようなもの。すぐに理解できるが、通訳しながらなので時間がかかる。

比較表

観点コンパイル方式インタプリタ方式
変換タイミング実行前に全体を変換実行中に1行ずつ
実行速度高速比較的遅い
エラー検出実行前に検出実行時に検出
開発サイクル変換に時間がかかるすぐ試せる
代表的な言語Rust, C, C++, GoPython, 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 を実行すると何が起こる?

Q4. 「インタプリタ方式は実行前に全体をチェックするのでエラーを早期に発見できる」この説明は正しい?

Q5. 大量のデータを高速に処理するプログラムに適した方式は?


次のドキュメント: 04_rust_setup.md