(別のユーザーが正しく答えたとして、ブートストラップと呼ばれる)は、この技術の理由の一つは、次のようにコンパイラの最適化と作品(おおよそ)の異なる技術を使用することができます。
は、あなたが作業コンパイラを持っていると仮定Yは、言語Xを、例えばアセンブリ言語にコンパイルする。次に、このコンパイラは、言語Xで書かれたプログラムを、マシン上で理解可能で実行可能な形式(リンク後など)に変換するために必要なすべてのものです。
ここでは、このコンパイラはコアの面ではよく書かれていますが、他の面ではあまりよく書かれていないと思います(たとえば、長いcase文の評価が非常に遅いなど)。
あなたは、言語Xのサブセット(コンパイラYで実装されている)のみを使用して完全な言語Xを書き換え、前述の長いcase文(例)の評価を最適化します。
コンパイラZを使用すると、言語Xのプログラムが言語Xのコア文のみで評価されます。コンパイラYを使用すると、アセンブリ言語に変換できるようになりました。
一般的に、コンパイラの長い行のある時点では、実際に有効なマシン命令を生成するコンパイラが1つある必要があります。そうしないと、素晴らしいプログラムを実行できなくなります(ただし、 。
EDIT @merito:コンパイラは、ソース言語のプログラムをバイナリコードにすることができますが、ターゲット言語に変換しますが、必ずしもそうする必要はありません。インタプリタとコンパイラの違いは私には間違っているようです。