これはしばらく私を悩ませています。 gcc/g ++はどうやってコンパイルされますか? 私は、すべてのリビジョンが以前にビルドされたリビジョンでコンパイルされると思います。これは本当ですか?それがあれば、最も古いg ++/gccバージョンがアセンブリで書かれたことを意味するのでしょうか?gcc/g ++はどのようにブートストラップされていますか?
答えて
GCCの最も古いバージョンは、別のCコンパイラを使ってコンパイルされました。これまでのCコンパイラは、PDP-11アセンブリまたはその前のBプログラミング言語のいずれかで実装されましたが、いずれの場合もBコンパイラはアセンブリ言語で記述されていました。 同様に、最初のC++コンパイラ(CPre/Cfront、1979-1983)はおそらく最初にCで実装され、次にC++で書き直されました。
あなたはGCCやその他のセルフホスティングコンパイラをコンパイルすると、建物の完全な順序は次のとおりです。
- はとGCCの新しいバージョンを再構築し、既存のCコンパイラ
- とGCCの新しいバージョンをビルド
- (オプション)検証のために手順2を繰り返します。
このプロセスはbootstrappingと呼ばれます。コンパイラのコンパイル機能をテストし、コンパイラ自体が実装しているすべての最適化機能を組み込んでいることを確認します。
EDIT:Drew DormannはコメントでBjarne Stroustrupのアカウントearliest implementation of C++を指しています。これはC++で実装されましたが、StroustrupがC++からCへの「プリプロセッサ」と呼んでいます。彼の定義では完全なコンパイラではなく、C言語でもC++がブートストラップされていました。
ステップ2は通常2〜3回繰り返しませんか?私は 'clang'がそれをすると信じています。 – bitmask
テスト以外の理由はわかりません。最初のコンパイラが言語を正しく実装していると仮定すると、おそらく最適ではないコンパイラが作成されますが、手順2では新しいコンパイラが持つすべての最適化が実装されます。ステップ2の後で最後のバイナリを変更しないでください。 –
ブートストラップのビルドプロセスの3ステップバージョンは確かに検証用です。コンパイラ自体は独自のテストケースとして使用されます。 [other]でコンパイルされたGCCは、GCCが[other]でコンパイルされてコンパイルされたときと同じ結果(同じバイナリ、 '__DATE__と' __TIME__ 'のマクロを同じ*もしそうでなければ、それはバグであり、3段階のブートストラップビルドはそれを捕らえるように設計されています。 – pmdj
- 1. ブートストラップ4ボードカードはどのようにしていますか?
- 2. ブートストラップの公式ページに表示されているように、位置は固定されていますか?
- 3. ブートストラップで@altfontfamily変数はどのように使用されますか?
- 4. はどのようにブートストラップ
- 5. はどのようにブートストラップ
- 6. バリエーションはどのように保存されていますか?
- 7. @privateはどのように実装されていますか?
- 8. PCI ROMはどのようにシャドーされていますか?
- 9. BigDecimalはどのように実装されていますか?
- 10. lpCmdLineはどのように格納されていますか?
- 11. time_tはどのように定義されていますか?
- 12. HttpSessionはどのように実装されていますか?
- 13. ウェブページはどのようにリンクされていますか?
- 14. removeEventListenerはどのように実装されていますか?
- 15. commit_on_successはどのようにネストされていますか?
- 16. FPGAはどのように更新されていますか
- 17. コーデックはどのように登録されていますか?
- 18. INativeElementViewはどのように実装されていますか?
- 19. JSケーススイッチはどのようにフォーマットされていますか?
- 20. ListView.DataSourceはどのように使用されていますか?
- 21. PTRACE_SINGLESTEPはどのように実装されていますか?
- 22. テンソルフローはどのように実装されていますか?
- 23. \ bはどのように実装されていますか?
- 24. オクターブデバッガはどのように使用されていますか?
- 25. NSTableCellViewsはどのようにレイアウトされていますか?
- 26. フィルタはどのように実装されていますか?
- 27. MarshalByRefObjectはどのように実装されていますか?
- 28. マクロはどのように定義されていますか?
- 29. クロスバリデーションはどのように実装されていますか?
- 30. ウェブホスティングサービスはどのように作成されていますか?
最終的に各リビジョンをコンパイルできます。 :) –
[This](http://homepage.ntlworld.com/edmund.grimley-evans/bcompiler.html)は、最初のコンパイラの仕組みを見たいと思ったら読んでおもしろいです。 – parkovski
@parkovskiリンクが壊れていませんか? – Nubcake