【こんぱいら】

コンパイラ とは?

💡 ソースコードを機械語に"一括翻訳"する通訳者
📌 このページのポイント
コンパイラ vs インタプリタ コンパイラ方式 ソースコード (全体) コンパイル 実行ファイル (.exe等) ⚡ 高速実行 何度でも速い インタプリタ方式 ソースコード (1行ずつ) 逐次実行 ✓ すぐ動く 手軽に試せる 🐢 低速 毎回解釈が必要 まとめて翻訳 vs その場で通訳
コンパイラは事前に全体を変換し高速実行、インタプリタは1行ずつ即座に実行
ひよこ ひよこ

コンパイラって何をするものなの?

ペンギン先生 ペンギン先生

人間が書いたプログラムソースコード)を、コンピュータが理解できる機械語に翻訳するプログラムだよ。人間の言葉を外国語に翻訳する通訳者のようなものだね

ひよこ ひよこ

なんでわざわざ翻訳が必要なの?ソースコードをそのまま実行できないの?

ペンギン先生 ペンギン先生

コンピュータのCPUが理解できるのは0と1で構成された機械語だけなんだ。人間にとって読みやすい「if」とか「for」みたいなキーワードは、CPUにとっては意味不明。だから誰かが間に入って翻訳してあげる必要があるんだよ

ひよこ ひよこ

インタプリタっていうのもあるよね?コンパイラと何が違うの?

ペンギン先生 ペンギン先生

翻訳のタイミングが違うんだ。コンパイラは「本番前に原稿を全部翻訳してから読み上げる」イメージ。インタプリタは「同時通訳のようにその場で1行ずつ翻訳しながら進める」イメージだよ。コンパイラ方式は実行が速く、インタプリタ方式はすぐ試せるのがメリットだね

ひよこ ひよこ

じゃあ速さ重視ならコンパイラ型、手軽さ重視ならインタプリタ型を選べばいいの?

ペンギン先生 ペンギン先生

ざっくり言えばそうだね。CやRustみたいにシステム開発や速度重視の場面ではコンパイル型、PythonRubyみたいにサッと試したいスクリプト用途ではインタプリタ型が選ばれることが多いよ

ひよこ ひよこ

でもJavaって「コンパイルする」のに、どこでも動くんでしょ?あれはどういう仕組み?

ペンギン先生 ペンギン先生

おっ、鋭いね。Javaソースコードを「バイトコード」という中間形式にコンパイルして、それをJVM(Java仮想マシン)がインタプリタ的に実行するんだ。つまりコンパイラとインタプリタの"いいとこ取り"をしているんだよ

ひよこ ひよこ

じゃあ、コンパイラとインタプリタの境界って実はあいまいなの?

ペンギン先生 ペンギン先生

まさにそこがベテランエンジニアでも意外と整理できていないポイントなんだ。現代ではJIT(Just-In-Time)コンパイルという技術があって、実行時に"ホットスポット"と呼ばれる頻繁に使われる部分だけを動的にコンパイルして高速化するんだよ。JavaScriptエンジンのV8もこの仕組みを使っていて、「インタプリタ型だから遅い」とは一概に言えない時代になっているんだ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「コンパイラ」って出てきたら「ソースコードを機械語にまとめて翻訳してくれるプログラム」と思えればだいたいOK!
📖 おまけ:英語の意味
「Compiler」 = 編集者、まとめる人
💬 ラテン語の「compilare(集めてまとめる)」が語源だよ。ソースコード全体を"まとめて"機械語に変換するからコンパイラと呼ばれているんだ。1952年にグレース・ホッパーが世界初のコンパイラ「A-0」を開発したとされているよ
← 用語集にもどる