【こんぱいる】

コンパイル とは?

最終更新:
💡 コードを別の実行用の表現へ「翻訳」する処理

ソースコードを解析し、別の実行用の表現へ変換する処理。出力は機械語だけでなく、バイトコードやアセンブリコードなどの場合もある。

📌 このページのポイント
変換先は、機械語だけではない C / GCC の例 source.c source.o 実行ファイル 変換 リンク オブジェクトを他のコード等と結合 Java の例 Code.java Code.class JVM で実行 javac .classにはバイトコードが入る JVMでは解釈実行やJITを使える
C/GCCとJavaの代表例。コンパイルによる変換、リンク、実行を区別する。設定や処理系で手順は異なる。
ひよこ ひよこ
コンパイルって何のためにするの?
ペンギン先生 ペンギン先生
人が書いたコードを解析して、実行に使う別の表現へ変換するためだよ。機械語になる場合もあれば、Javaのように仮想マシンで動くバイトコードを含むクラスファイルになる場合もあるんだ。
ひよこ ひよこ
変換したら、そのまま実行できる?
ペンギン先生 ペンギン先生
CをGCCで処理する例では、オブジェクトファイルを作ってから、ほかのコードやライブラリとリンクして実行ファイルを作るよ。コンパイルの出力がいつも完成した実行ファイル、というわけではないんだ。
ひよこ ひよこ
Pythonはコンパイルしないよね?
ペンギン先生 ペンギン先生
代表的な処理系のCPythonも、ソースを内部のバイトコードへコンパイルして実行するよ。自分でコンパイルのコマンドを打たなくても、内部で変換が行われるんだ。『インタプリタだからソースを1行ずつそのまま実行』という説明は正確ではないね。
ひよこ ひよこ
コンパイルが成功すれば安心?
ペンギン先生 ペンギン先生
構文や型の誤りなどを実行前に見つけられるのは利点だよ。でも検査内容は言語や設定によるし、意図と違う計算や実行中の不具合まで全部分かるわけではない。実行速度も、コンパイルするというだけで必ず速くなるとは決まらないんだ。
ひよこ ひよこ
JITとAOTって何が違うの?
ペンギン先生 ペンギン先生
主な違いは変換のタイミングだよ。AOTは実行前、JITは実行時に行う。JavaのHotSpot VMのように、バイトコードを解釈実行しながら実行情報を集め、コードを機械語へコンパイルする処理系もあるんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「コンパイル」って出てきたら「ソースコードを別の実行用の表現へ変換する処理」と思えばだいたいOK!
📖 おまけ:英語の意味
「Compile / Compiler」 = コードを変換する処理/その処理を行うプログラム
💬 コンパイルを行うプログラムがコンパイラだよ。出力が何になるかは、言語や処理系、設定によって違うんだ。

参考資料

← 用語集にもどる