|
|
コンパイラはコンピュータプログラムの一種であり、特定のプログラミング言語で書かれた任意のプログラムを、異なる言語形式に「翻訳」する(「コンパイルする」)ものを言う。
コンパイル前のプログラムを特に「ソースコード」(原始コード)と呼び、反対にコンパイル後のプログラムを「オブジェクトコード」(目的コード)と呼んで区別する。多くの場合、ソースコードの言語は、人間向けの簡潔な言語(高級言語)であり、オブジェクトコードはコンピュータが直接実行可能な機械語(言語に含めないこともある)である。機械語が特定のプロセッサ群の「固有語」であることから、機械語プログラムを「ネイティブコード」とも言い、またネイティブコードを出力するコンパイラを「ネイティブコンパイラ」という。
主としてコンパイラを用いて実行されるコンピュータ言語のことをコンパイラ言語と呼ぶ。これは主としてインタプリタを用いて実行されるコンピュータ言語に対比して用いられる言い方である。ただし、多くのコンピュータ言語は、コンパイラを使って実行される場合・インタプリタを使って実行される場合のいずれもあり、あくまでどちらが主流であるかを示すと考えるのがよい(注:コンパイラ・インタプリタいずれの方式にも入れられないコンピュータ言語もある)。多くの場合、コンパイラを用いた実行は、インタプリタを用いた実行より高速という特徴を持つ。反面、開発時には動作テストのたびにコンパイル作業が必要である。一般に、コンパイラ言語の方が、言語仕様がコンパイラ向きに、インタプリタ言語の方が、言語仕様がインタプリタ向きになっている。
コンパイラが出力するオブジェクトファイルは、実際に実行するコード以外に外部からの呼び出しをするための名前と、実行開始位置をセットにした情報を持っている場合があり、外部からコードを参照して実行することができる。場合によっては実行できるソフトウェアにするために、ほかのオブジェクトファイルとのリンクが必要なこともある。
開発環境とは別の環境で実行できるコードを生成するコンパイラは、クロスコンパイラと呼ばれる。新しいコンピュータが開発されるとき、BIOSやOSなどもっとも基本となるプログラムについて、既存のものがそのままでは実行できない場合がある。あるいは、組み込みシステムやPDAなど、それ自体が開発環境を動作させるだけの性能を持たない場合がある。こういった場合、クロスコンパイラが必要になる。同じCPUの場合はセルフコンパイラ。
直接CPUで解釈実行可能なコードを生成せずに、中間コードを生成し、別のインタプリタによって実行するものもある。これをインタプリタ・コンパイラとは呼ばない。中間言語コンパイラ、バイトコードコンパイラなどと言われる。 インタプリタを作るためのコンパイラがあれば、インタプリタ・コンパイラと呼んでもよい。
プログラミング言語の文法と出力形式を定義してコンパイラを作るためのコンパイラをコンパイラコンパイラという。
コンパイラの実行は、一般にソースコードを読み込み、字句列に分解する字句解析部、字句の列をもとにプログラミング言語の構文木を構築する構文解析部、対象計算機のコードを生成するコード生成部からなる。加えて、コード生成の前段階で効率の高いコードに変換する最適化部を持つことがある。