web-dev-qa-db-ja.com

GCCはC ++自体で記述されているため、鶏と卵の問題はありませんか?

4.8リリース以降、C++コンパイラGCC(そのG ++部分)は、CではなくC++自体で記述されています。これについて架空の質問があります。

まだC++コンパイラがない新しいプラットフォームでGCCのC++コードをコンパイルする方法を知りたいです。もちろん、他のマシンでコンパイルされたビルド済みのバイナリを使用することもできます。または、Cで書かれた古いバージョンのGCCを使用し、それを使用して現在のバージョンをコンパイルすることもできます。

しかし、ビルド済みのバイナリと最新バージョンだけがないと、行き詰まっていましたよね?そうでない場合、GCCプロジェクトのCからC++への切り替えによって引き起こされるこの状況に他の影響がありますか?

10
danijar

これは実際には bootstrapping と呼ばれるよく知られた概念です。基本的に、どこかに、現在のGCCコードベースをビルドできるGCCのバージョンをビルドするための最小限のCコードベースが存在します。セルフホスティング言語は何十年もそのようなことをしてきました。

16
Mason Wheeler

コンパイルするのと同じ言語で書かれたコンパイラを作成することは、 bootstrapping と呼ばれます。ウィキペディアの記事では、コンパイラーをブートストラップできるいくつかの方法について説明しています。

4.8以降のG ++ソースコードのみがあり、ターゲットプラットフォーム用のビルド済みのバイナリがない(既存のC++コンパイラはない)という制限がある場合、G ++コンパイラのブートストラップは クロスコンパイル

クロスコンパイルを使用してコンパイラをブートストラップするとき、コンパイラのいくつかのバージョンをビルドします

  1. PCにC++コンパイラをインストールします(任意のC++コンパイラを使用できますが、G ++である必要はありません)。
  2. そのコンパイラーを使用して、PCで実行できるG ++クロスコンパイラーを作成し、ターゲットプラットフォームのコードを生成します。
  3. 先ほど作成したG ++クロスコンパイラーを使用して、ターゲットプラットフォームで実行できるネイティブG ++コンパイラーを作成し、そのコードを作成します。
  4. 完了です。新しいプラットフォーム用のC++コンパイラを作成しました。

最初のステップを実行するPC(または同様の)もない場合、実際には行き詰まっていますが、そのような状況にあり、bootstrapコンパイラーを試みる可能性があります。無視できる。