1

.cソースコードから最終的に実行可能ファイルまでの操作の完全なチェーンを知っている人はいます.exeか?

c-parser.ygccのソースをダウンロードしましたが、c:にも記述されていることがわかりました。

extdef:
    fndef
    | datadef
    | ASM_KEYWORD '(' expr ')' ';'
        { STRIP_NOPS ($3);
          if ((TREE_CODE ($3) == ADDR_EXPR
               && TREE_CODE (TREE_OPERAND ($3, 0)) == STRING_CST)
              || TREE_CODE ($3) == STRING_CST)
            assemble_asm ($3);
          else
            error ("argument of `asm' is not a constant string"); }
    | extension extdef
        { pedantic = $<itype>1; }
    ;

それで、誰かがcの自己ホスティングの完全な話を知っていますか?

アップデート

スクリプト用のコンパイラがどのように記述されているかを知っています。それらのほとんどはcコンパイラに依存しています。

だから私は今、cコンパイラがどのように機能するかを尋ねています。

4

2 に答える 2

6

GCC には複数段階のプロセスがありますが、動作中の C コンパイラ (GCC の別のバージョンである場合とそうでない場合があります) から開始します。

  1. 他の C コンパイラを使用して、GCC の最初のバージョンである GNU C コンパイラを作成します。
    • これにより、GCC の新しいバージョンの作業コピーが得られます (古いコンパイラが使用可能であると仮定します)。
    • ただし、信じられないほどの偶然を除いて、GCC (の新しいバージョン) が生成するコンパイラと同じではありません。
  2. GCC の最初のバージョンを使用して、GCC の 2 番目のバージョンを作成します。
    • GCC の 2 番目のバージョンは、(明らかに) GCC が生成するコードです。これがベンチマークバージョンです。
    • ただし、これが安定していることはまだ示されていません。
  3. GCC の 2 番目のバージョンを使用して、GCC の 3 番目のバージョンを作成します。
    • GCC の 2 番目のバージョンは、GCC の 3 番目のバージョンに対して同じ出力を生成する必要があります。
  4. GCC の 2 番目と 3 番目のバージョンが同じであることを確認します。
    • 一部のプラットフォームでは、オブジェクト ファイルにコンパイル時間が含まれています。明らかに、コンパイル時間はコンパイル時間の違いを割り引く必要があります。
    • 2 番目と 3 番目のバージョンが「同じ」であると仮定すると、GCC は独自のソース コードから生成できることがわかります。
    • 新しいバージョンの GCC を使用して、さまざまなランタイム ライブラリやファミリ内の他のコンパイラを安全にビルドできるようになりました。
  5. 新しい C コンパイラを使用して、GNU Compiler Collection の他の部分をビルドします。
    • ほとんどの人は、GNU Compiler Collection を C コンパイラだけに限定しません。
    • 通常、C++ および Java (通常は Objective C) コンパイラも生成します。
    • また、標準 C++ ライブラリのサポートも必要です。
    • 通常、C コンパイラはプラットフォームが提供する C ライブラリを使用します。
于 2011-03-05T03:18:08.600 に答える
1

CコンパイラがCで書かれていることに驚いていますか?Cの専門家がコンパイラを作成するときに、他にどのような言語を使用しますか?

明らかな鶏が先か卵が先かという問題は、ずっと前に、利用可能なコンパイラがまったくなかったときに一度だけ発生しました。次に、誰かがアセンブリで1つを作成する必要がありました(他の誰かがマシンコードで最初のアセンブラーを作成した後:-)

于 2011-03-05T12:18:06.447 に答える