1. ホーム
  2. c++

[解決済み] GCCとg++はどのようにブートストラップされるのですか?

2022-04-13 10:45:02

質問

以前から気になっていたことがあります。GCCとg++はどのように自分自身をコンパイルしているのでしょうか?

すべてのリビジョンは、以前にビルドされたリビジョンとコンパイルされるのでしょうね。これは本当でしょうか?もしそうなら、最も古いバージョンのg++とGCCはアセンブリで書かれているということになるのでしょうか?

解決方法は?

GCCの最も古いバージョンは、他のCコンパイラを使ってコンパイルされています。なぜなら、GCCが書かれた当時、他のコンパイラが存在したからです。史上最初のCコンパイラ(1973年頃、IRC)は、以下のどちらかで実装されていました。 PDP-11 アセンブリか、その前のB言語か、いずれにせよBコンパイラはアセンブリで書かれていました。 同様に、史上初のC++コンパイラ(CPre/ Cフロント 1979-1983)は、おそらく最初にC言語で実装され、その後C++で書き直されたのでしょう。

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

  1. 既存のCコンパイラで新バージョンのGCCをビルドする。
  2. 新しいバージョンのGCCを、先ほどビルドしたものと一緒に再ビルドします。
  3. (オプション) 検証のため、手順2を繰り返す。

この処理は ブートストラップ . これは、コンパイラが自分自身をコンパイルする能力をテストし、コンパイラ自身が実装しているすべての最適化でコンパイラがビルドされていることを確認するものです。

EDIT : Drew Dormannがコメントで、Bjarne Stroustrupの記述を指摘しています。 C++の最古の実装 . C++で実装されたが、Stroustrupがプリプロセッサと呼ぶものによってC++からCに変換された。彼の定義では、完全なコンパイラではないが、それでもC++はCでブートストラップされていたのだ。