2012-02-24 19 views
174

これはしばらく私を悩ませています。 gcc/g ++はどうやってコンパイルされますか? 私は、すべてのリビジョンが以前にビルドされたリビジョンでコンパイルされると思います。これは本当ですか?それがあれば、最も古いg ++/gccバージョンがアセンブリで書かれたことを意味するのでしょうか?gcc/g ++はどのようにブートストラップされていますか?

+13

最終的に各リビジョンをコンパイルできます。 :) –

+4

[This](http://homepage.ntlworld.com/edmund.grimley-evans/bcompiler.html)は、最初のコンパイラの仕組みを見たいと思ったら読んでおもしろいです。 – parkovski

+1

@parkovskiリンクが壊れていませんか? – Nubcake

答えて

167

GCCの最も古いバージョンは、別のCコンパイラを使ってコンパイルされました。これまでのCコンパイラは、PDP-11アセンブリまたはその前のBプログラミング言語のいずれかで実装されましたが、いずれの場合もBコンパイラはアセンブリ言語で記述されていました。 同様に、最初のC++コンパイラ(CPre/Cfront、1979-1983)はおそらく最初にCで実装され、次にC++で書き直されました。

あなたはGCCやその他のセルフホスティングコンパイラをコンパイルすると、建物の完全な順序は次のとおりです。

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

このプロセスはbootstrappingと呼ばれます。コンパイラのコンパイル機能をテストし、コンパイラ自体が実装しているすべての最適化機能を組み込んでいることを確認します。

EDIT:Drew DormannはコメントでBjarne Stroustrupのアカウントearliest implementation of C++を指しています。これはC++で実装されましたが、StroustrupがC++からCへの「プリプロセッサ」と呼んでいます。彼の定義では完全なコンパイラではなく、C言語でもC++がブートストラップされていました。

+1

ステップ2は通常2〜3回繰り返しませんか?私は 'clang'がそれをすると信じています。 – bitmask

+0

テスト以外の理由はわかりません。最初のコンパイラが言語を正しく実装していると仮定すると、おそらく最適ではないコンパイラが作成されますが、手順2では新しいコンパイラが持つすべての最適化が実装されます。ステップ2の後で最後のバイナリを変更しないでください。 –

+19

ブートストラップのビルドプロセスの3ステップバージョンは確かに検証用です。コンパイラ自体は独自のテストケースとして使用されます。 [other]でコンパイルされたGCCは、GCCが[other]でコンパイルされてコンパイルされたときと同じ結果(同じバイナリ、 '__DATE__と' __TIME__ 'のマクロを同じ*もしそうでなければ、それはバグであり、3段階のブートストラップビルドはそれを捕らえるように設計されています。 – pmdj

関連する問題