重複の可能性:
言語のブートストラップ
コンパイラ自体は高級言語で書かれています。では、コンピュータはコンパイラをどのように理解するのでしょうか? 彼らは HLL を機械レベルのコードに変換しますが、それら自体はコンピューターによってどのように理解されるのでしょうか?
重複の可能性:
言語のブートストラップ
コンパイラ自体は高級言語で書かれています。では、コンピュータはコンパイラをどのように理解するのでしょうか? 彼らは HLL を機械レベルのコードに変換しますが、それら自体はコンピューターによってどのように理解されるのでしょうか?
1 つのコンパイラはマシン コードで記述されていました。残りはそれまたは他の既にコンパイルされたコンパイラを使用できます(既存のバージョンを使用して新しいバージョンを再コンパイルできる、それ自体の将来のバージョンを含む)。
PSほとんどのコンパイラは「高レベル コード」をマシン コードにコンパイルしないことに注意してください。それらには、フロントエンドとバックエンドの 2 つのコンポーネントがあります。フロントエンドはコードを中間中間言語にコンパイルし、バックエンドは中間言語を機械語にコンパイルします。
これにより、n
言語とアーキテクチャがある場合、言語/マシンごとにコンパイラがある場合ではなく、コンポーネントm
のみが必要になります。n+m
n*m
1つのバージョンはアセンブラコードで記述する必要があります。次に、このコンパイラを使用して、他のコンパイラを含む他のプログラムをコンパイルできます。
ただし、興味深い論文/観察は、コンパイラが学習できることです。つまり、ソースコードの一部を削除しても、機能を維持できます;)1つの例は、\n
文字の解析です。次の論文はこれを非常にうまく示しています!http://cm.bell-labs.com/who/ken/trust.html
言語Yで記述された言語Xのコンパイラ(XとYは同じ言語である場合とそうでない場合があります)は、言語Yのコンパイラを使用してマシンコードにコンパイルする必要があります(または、 Yが解釈される場合は、コンパイラはYインタプリタによって実行される必要があります)。本当に、これを回避する方法はありません。Yがアセンブリでない限り。つまり、Xコンパイラをアセンブリで記述します。
言語Xのコンパイラを言語X で記述したい場合は、次のように行うことができます。
X言語用のコンパイラを、コンパイラがすでに存在する(またはアセンブリにある)別の言語、たとえばYで記述します。
次に、XコンパイラをXで記述し、言語Y(手順1で記述したもの)で記述されたXコンパイラを使用してコンパイルします。
新しいXコンパイラが十分に完成していれば、それ自体のコピーをコンパイルできるはずです(結局のところ、Xソースであるため)。
これはブートストラップと呼ばれます。