web-dev-qa-db-ja.com

CコンパイラはどのようにCで作成できますか?

この質問は、私の側のコンパイラーの誤解から生じるかもしれませんが、ここに行きます...

K&Rの初版(ページxi)の序文に次の記述があります。

オペレーティングシステムCコンパイラ、および基本的にすべてのUNIXアプリケーションプログラム(この本の準備に使用したすべてのソフトウェアを含む)は、Cで記述されています。

(私の強調)

私が理解できないことは次のとおりです。Cコードをコンパイルする前に、そのCコンパイラを自分でコンパイルする必要はありませんか?そして、そのCコンパイラがCで書かれている場合、コンパイルには既存のCコンパイラが必要ではないでしょうか?!

この無限回帰の難問(または鶏と卵の問題)から抜け出す唯一の方法は、K&Rが参照しているCで書かれたCコンパイラが、C以外の言語で書かれた既存のCコンパイラで実際にコンパイルされたことです。Cで書かれたCコンパイラは、後者に取って代わりました。

それとも完全にオフですか?

55
jub0bs

これは Bootstrapping と呼ばれ、Wikipediaから引用しています:

言語Xのコンパイラ(言語Xで記述されている)を取得するために言語Xのコンパイラが必要な場合、最初のコンパイラはどのように記述されましたか?この鶏または卵の問題を解決するための可能な方法は次のとおりです。

  1. 言語Xのインタープリターまたはコンパイラーを言語Yで実装しました。NiklausWirthは、Fortranで最初のPascalコンパイラーを作成したことを報告しました。
  2. X用の別のインタープリターまたはコンパイラーは、すでに別の言語Yで作成されています。これは、Schemeがしばしばブートストラップされる方法です。
  3. コンパイラの以前のバージョンは、他のコンパイラが存在するXのサブセットで記述されていました。これが、Java、Haskell、および初期のFree Pascalコンパイラのいくつかのスーパーセットがブートストラップされる方法です。
  4. Xのコンパイラは、Xのコンパイラが存在する別のアーキテクチャからクロスコンパイルされます。これは、C用のコンパイラが通常他のプラットフォームに移植される方法です。また、これは初期ブートストラップ後にFree Pascalに使用される方法です。
  5. Xでコンパイラを作成します。次に、ソースから手動でコンパイルし(最適化されていない方法が最も可能性が高い)、コード上で実行して最適化されたコンパイラを取得します。ドナルド・クヌースはこれを自分のWEBリテラシープログラミングシステムに使用しました。

興味がある場合は、 here はデニスリッチーの最初のCコンパイラソースです。

39
Yu Hao

Wikipediaページ の鶏と卵のセクションを参照してください。

言語Xのコンパイラ(言語Xで記述されている)を取得するために言語Xのコンパイラが必要な場合、最初のコンパイラはどのように記述されましたか?この鶏または卵の問題を解決するための可能な方法は次のとおりです。

  • 言語Xのインタープリターまたはコンパイラーを言語Yで実装しました。NiklausWirthは、Fortranで最初のPascalコンパイラーを作成したことを報告しました。
  • X用の別のインタープリターまたはコンパイラーは、すでに別の言語Yで作成されています。これは、Schemeがしばしばブートストラップされる方法です。
  • コンパイラの以前のバージョンは、他のコンパイラが存在するXのサブセットで記述されていました。これが、Java、Haskell、および初期のFree Pascalコンパイラのいくつかのスーパーセットがブートストラップされる方法です。
  • Xのコンパイラは、Xのコンパイラが存在する別のアーキテクチャからクロスコンパイルされます。これは、C用のコンパイラが通常他のプラットフォームに移植される方法です。また、これは初期ブートストラップ後にFree Pascalに使用される方法です。
  • Xでコンパイラを作成します。次に、ソースから手動でコンパイルし(最適化されていない方法が最も可能性が高い)、コード上で実行して最適化されたコンパイラを取得します。ドナルド・クヌースはこれを自分のWEBリテラシープログラミングシステムに使用しました。
9
Pascal Cuoq

通常、最初のコンパイラは別の言語で記述されます(この場合は直接PDP11アセンブラーで、またはほとんどの「現代」言語の場合はCで)。次に、この最初のコンパイラを使用して、言語自体で記述されたコンパイラをプログラムします。

これを読むことができます page C言語の歴史について。また、UNIXシステムに強くリンクされていることがわかります。

6
perror

コンパイラがコンパイルする言語で書かれているのは、まったく普通のことです。これを実現する1つの方法は、言語Lの完全なコンパイラを他の言語で記述し、次にLのLの新しいコンパイラを記述することです。より興味深いアプローチは、Lのサブセットの最小コンパイラを他の言語を使用し、この最小サブセットを使用してコンパイラーを改善し、Lの使用可能なサブセットを最小化し、コンパイラーを改善します。このようにして、完全なコンパイラーを構築できます。

5
Jon Kiparsky