コンパイル 【compile】 compilation
概要
コンパイル(compile)とは、プログラミング言語で書かれたコンピュータプログラム(ソースコード)を解析し、コンピュータが実行可能な形式のプログラム(オブジェクトコード)に変換すること。そのためのソフトウェアを「コンパイラ」(compiler)という。“compile” の原義は「翻訳する」。人間が読み書きしやすいプログラミング言語で記述されたコンピュータプログラムを「ソースコード」(source code)というが、これはそのままではコンピュータの処理装置であるCPUが解釈して実行することはできない。
実行可能にするにはCPUが直に理解して実行することができる機械語(マシン語)で書かれた「オブジェクトコード」(あるいはネイティブコード)に変換しなければならない。この変換工程を実行開始前に専用のソフトウェアを用いて一括して行うことをコンパイルという。
今日の一般的なプログラミング言語では、コンパイルのみで起動可能なファイルを生成することは難しく、ソースコードに対する前処理(プリプロセス)を行ったり、ライブラリなど外部のプログラムを連結(リンク)する工程が必要となることが多い。コンパイルを含む一連の実行ファイル作成工程を「ビルド」(build)あるいは「メイク」(make)という。
機械語への変換にはコンパイル以外の手法もあり、実行環境側に「インタプリタ」(interpreter)などのソフトウェアを用意して実行時にソースコードを少しずつ読み込んで変換しながら同時に実行する方式などがある。スクリプト言語などでよく利用される。
事前コンパイルと実行時コンパイル
単にコンパイルという場合は、プログラムの実行開始前に明示的にコンパイラを用いてまとめてコードを変換することを指し、これを事前コンパイル(AOTコンパイル:Ahead-Of-Time compile)という。商用ソフトウェアなどでは開発者が開発時に行うことが多く、オープンソースソフトウェアなどでは利用者がソフトウェア導入(インストール)時に行うことが多い。
一方、実行開始時に実行環境に内蔵されたコンパイラがソースコードや中間コードのプログラムを読み込み、その場でコンパイルして実行する方式もある。これを「実行時コンパイル」(JITコンパイル:Just-In-Time complie)と呼び、Javaや.NETなど標準のプログラム配布形式が中間コードである言語や処理系でよく用いられる。
ネイティブコードと中間コード
いくつかの言語や処理系では、開発時には直に特定のCPU向けの機械語コード(ネイティブコード)にコンパイルせず、実在しない仮想的なCPU向けの機械語で書かれた中間コードにコンパイルする仕組みになっている場合がある。実行時に実行環境のCPU向けのコードに改めてコンパイルしてから起動する。
直にネイティブコードにコンパイルする言語では、複数の異なるCPUにプログラムを対応させたい場合はそれぞれの機種ごとにコンパイルしなおして別々の実行プログラムを生成・配布しなければならない。開発側が対応していない機種でプログラムを動作させることは原則としてできない。
一方、中間コードにコンパイルする言語では、実行環境側の処理系がその機種固有のコードにコンパイルしなおしてくれるため、開発側は中間コードで書かれた単一の配布パッケージを作成するだけで済む。開発者が個別に対応しなくても、実行環境さえ用意されていればその言語で書かれたプログラムを動作させることができる。