web-dev-qa-db-ja.com

GCCとg ++はどのようにブートストラップされますか?

これはしばらくの間私を悩ませてきました。 GCCとg ++はどのようにコンパイルしますか?

私はすべてのリビジョンが以前にビルドされたリビジョンでコンパイルされると推測しています。これは本当ですか?もしそうなら、それは最も古いg ++およびGCCバージョンがアセンブリで書かれたことを意味しますか?

182
user1010005

GCCの最も古いバージョンは、別のCコンパイラを使用してコンパイルされました。これは、作成時に他のCコンパイラが存在したためです。史上初のCコンパイラ(ca. 1973、IIRC)は、 PDP-11 Assembly、またはそれに先行するBプログラミング言語のいずれかで実装されましたが、いずれの場合もBコンパイラはAssemblyで作成されました。 同様に、史上初のC++コンパイラ(CPre/ Cfront 、1979-1983)はおそらくCで最初に実装され、その後C++で書き直されました。

GCCまたはその他のセルフホスティングコンパイラをコンパイルする場合、ビルドの完全な順序は次のとおりです。

  1. 既存のCコンパイラでGCCの新しいバージョンをビルドします
  2. ビルドしたばかりのGCCの新しいバージョンを再ビルドします
  3. (オプション)確認のために手順2を繰り返します。

このプロセスは bootstrapping と呼ばれます。コンパイラ自体のコンパイル機能をテストし、結果のコンパイラが、それ自体が実装するすべての最適化でビルドされることを確認します。

[〜#〜] edit [〜#〜]:コメントで、ドリュー・ドーマンは 初期の実装のBjarne Stroustrupの説明を指していますC++の 。 C++で実装されましたが、Stroustrupが「プリプロセッサ」と呼ぶものによってC++からCに変換されました。彼の定義では完全なコンパイラではありませんが、それでもC++はCでブートストラップされていました。

174
Fred Foo