この質問は、私の側のコンパイラーの誤解から生じるかもしれませんが、ここに行きます...
K&Rの初版(ページxi)の序文に次の記述があります。
オペレーティングシステムCコンパイラ、および基本的にすべてのUNIXアプリケーションプログラム(この本の準備に使用したすべてのソフトウェアを含む)は、Cで記述されています。
(私の強調)
私が理解できないことは次のとおりです。Cコードをコンパイルする前に、そのCコンパイラを自分でコンパイルする必要はありませんか?そして、そのCコンパイラがCで書かれている場合、コンパイルには既存のCコンパイラが必要ではないでしょうか?!
この無限回帰の難問(または鶏と卵の問題)から抜け出す唯一の方法は、K&Rが参照しているCで書かれたCコンパイラが、C以外の言語で書かれた既存のCコンパイラで実際にコンパイルされたことです。Cで書かれたCコンパイラは、後者に取って代わりました。
それとも完全にオフですか?
これは Bootstrapping と呼ばれ、Wikipediaから引用しています:
言語Xのコンパイラ(言語Xで記述されている)を取得するために言語Xのコンパイラが必要な場合、最初のコンパイラはどのように記述されましたか?この鶏または卵の問題を解決するための可能な方法は次のとおりです。
興味がある場合は、 here はデニスリッチーの最初のCコンパイラソースです。
Wikipediaページ の鶏と卵のセクションを参照してください。
言語Xのコンパイラ(言語Xで記述されている)を取得するために言語Xのコンパイラが必要な場合、最初のコンパイラはどのように記述されましたか?この鶏または卵の問題を解決するための可能な方法は次のとおりです。
通常、最初のコンパイラは別の言語で記述されます(この場合は直接PDP11アセンブラーで、またはほとんどの「現代」言語の場合はCで)。次に、この最初のコンパイラを使用して、言語自体で記述されたコンパイラをプログラムします。
これを読むことができます page C言語の歴史について。また、UNIXシステムに強くリンクされていることがわかります。
コンパイラがコンパイルする言語で書かれているのは、まったく普通のことです。これを実現する1つの方法は、言語Lの完全なコンパイラを他の言語で記述し、次にLのLの新しいコンパイラを記述することです。より興味深いアプローチは、Lのサブセットの最小コンパイラを他の言語を使用し、この最小サブセットを使用してコンパイラーを改善し、Lの使用可能なサブセットを最小化し、コンパイラーを改善します。このようにして、完全なコンパイラーを構築できます。