gcc CコンパイラはC自体で書かれていますか?


87

gcc CコンパイラはC自体で書かれていますか?それともアセンブリで書かれていますか?コンパイラがCで記述されている場合、コンパイラコードのコンパイルに使用されるコンパイラは何ですか?


12
はい、そうです(ほとんど)。もちろん、CをコンパイルするにはCコンパイラが必要なので、ほとんどのコンパイラと同様に、一連の「ブートストラップ」フェーズがあります。一般的な考え方は、GCCのインストール:GCCの構築インストール-LFSで説明されています。

2
1980年代と90年代初頭のさまざまなブランドのワークステーションには、cコンパイラ、ツールなどを備えた独自のUNIXライクな環境があり、それらはすべて互いに少し異なっていました。GCCソースを使用すると、これらのプラットフォームの1つでgccの初期コンパイルを実行してから、gccをそれ自体で数回コンパイルして、固定小数点を多かれ少なかれチェックできます。
ポール

回答:


98

GCCに固有の履歴がで与えられているGCCのWiki。より一般的な点は、コンパイラーは通常、それ自体をコンパイルするのに十分強力になるまで、他のコンパイラーで最初にコンパイルされるということです。あるいは、アセンブラーで機能のサブセットを処理し、そこから構築できる基本的なコンパイラーを作成することもできます。しかし、繰り返しになりますが、これはもうほとんど必要ありません。さまざまな言語で利用できるコンパイラがたくさんあります。Stephen Johnsonがpcc(最初のCコンパイラーの1つ)を書いていたときでさえ、他の多くの言語とともに、B用のコンパイラーが利用可能でした。gccには、元々ビルドするために選択できるコンパイラがいくつかあり、RMSは、少なくとも最初の開発中はPastelコンパイラを使用していたと述べています。

CコンパイラをCで記述する必要はありません。必要に応じて、Perlで記述することもできます。特定のプラットフォームのコンパイラが元々そのプラットフォームで記述されている必要はありません(組み込みシステムはほとんどの場合、他のシステムでコンパイルされます)。したがって、自分をブートストラップする方法はたくさんあります。

この質問には、コンパイラのブートストラップの最初のインスタンスに関連するいくつかの興味深い微妙な点があります。あなたが非常に賢いなら、あなたはそのブートストラップを利用して、信じられないほど、華麗で恐ろしいことをすることができます。


うわー、あなたがリンクしたその2番目の記事はめちゃくちゃ賢いです。
ポンカドゥードル2011

1
素晴らしいブートストラップリンクをありがとう。私は、コンパイラは常にのために戻ってマシンコードに単純な言語のすべての方法を書かれたことを想定していたの並べ替え、この理由。(たとえば、コンパイラのバイナリに誤りがあることに気付いた場合はどうなりますか?これはもちろんはるかに強力な例を提供します。)では、コンパイラを独自の言語で記述することの利点は何ですか?非常に妄想的な人々はこれを心配し、「自己」ブートストラップなしでコンパイラを構築しますか?
RoG 2017年

4
一部の言語グループは、自分でコンパイルできることを光栄に思っています。Goは最近、この方向に大きく前進しました。一方、Swiftには、特にSwiftでコンパイラを書き直す計画はありません。ただし、GCCは常にCで記述されていることに注意してください。他のコンパイラでコンパイルされただけです。しかし、すべてのCコンパイラがBCPLで記述されている場合、パラノイアに関しては何も修正されません。問題を1ステップ戻すだけです。(GCC w / clangをコンパイルするだけで、同じパラノイアのメリットが得られます。)
Rob Napier

gccには、gccメジャーバージョンXは常にgccメジャーバージョンX-1でコンパイルできるというポリシーがあるため、Xでコンパイラに追加された新機能は、X +1からのgccソース自体でのみ使用できます。たとえば、マイナーバージョン番号に関係なくgccバージョン9をコンパイルでき、マイナーバージョンが何であってもgcc8をコンパイルできるはずです。
バルーク

51

もともとはいくつかのアセンブリ言語で書かれていましたが、その後ドッグフード自体が始まりました。


2
元のブートストラップにアセンブラーを使用したRMSへの参照は見たことがありません。そのためのあなたの情報源は何ですか?彼は他にもいくつかのコンパイラをブートストラップする必要があったので、それは大変な作業のようです。
ロブネイピア2011

17
用語はブートストラップでしたが。
マーティンヨーク

7
ははは私は数週間前にこれを読んで、あなたがその表現に気が狂っていると思いました、それが標準であることに気づいていませんでした。グッドショーサー!en.wikipedia.org/wiki/Eating_your_own_dog_food

3

これは明らかに非常に大まかな指標ですが、ディレクトリのこのクイックリストgcc-5.1.0-src/gcc/興味深いものでした。このディレクトリには、GCC自体の主なソースが含まれています(ランタイムライブラリを除く)。

これは、CファイルとC ++ファイルが支配的な拡張子でグループ化され上位のファイル数(100を超える)です。

    112 .opt
    118 .def
    140 .cc
    185 .x
    250 .exp
    353 .md
    366 .mm
    414 .f
    430 .f03
    521 .m
    625 .a
   1082 .go
   1371 .h
   1602 .ads
   1655 .adb
   1828 .ada
   3860 .f90
  11231 .C        // C++ 
  23811 .c        // C 

最近でGCCは、GNU Cコンパイラだけでなく、GNUコンパイラコレクションを指していることに注意してください。

6.3gccサブディレクトリ

gccディレクトリには、GCCのCソースの一部である多くのファイル、構成およびビルドプロセスの一部として使用される他のファイル、およびドキュメントやテストスイートを含むサブディレクトリが含まれています。

参照: https //gcc.gnu.org/onlinedocs/gccint/gcc-Directory.html

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.