Ist der gcc C-Compiler in C selbst geschrieben?

85

Ist der gcc C-Compiler in C selbst geschrieben? Oder steht es in der Versammlung? Wenn der Compiler in C geschrieben ist, mit welchem ​​Compiler wird dann der Compilercode kompiliert?

Euphorie83
quelle
12
Ja, das ist es (meistens). Natürlich benötigt man einen C-Compiler, um C zu kompilieren. Wie bei den meisten Compilern gibt es eine Reihe von "Boot-Strap" -Phasen. Die allgemeine Idee wird unter Installieren von GCC: Erstellen und Installieren von GCC - LFS behandelt .
2
Verschiedene Markenarbeitsplätze in den 1980er und frühen 90er Jahren hatten ihre eigenen Unix-ähnlichen Umgebungen mit C-Compiler, Tools usw., die sich alle ein wenig voneinander unterschieden. Mit der GCC-Quelle können Sie eine erste Kompilierung von gcc auf einer dieser Plattformen durchführen und dann einige Male gcc mit sich selbst kompilieren, um mehr oder weniger nach einem festen Punkt zu suchen.
Paul

Antworten:

97

Die spezifische Geschichte von gcc finden Sie im GCC-Wiki . Der allgemeinere Punkt ist, dass Compiler im Allgemeinen ursprünglich mit einem anderen Compiler kompiliert werden, bis sie leistungsfähig genug sind, um sich selbst zu kompilieren. Alternativ ist es möglich, einen Basis-Compiler zu schreiben, der eine Teilmenge Ihrer Funktionen in Assembler verarbeiten und von dort aus aufbauen kann. Aber auch dies wird fast nie mehr benötigt. Es stehen zahlreiche Compiler in verschiedenen Sprachen zur Verfügung. Selbst als Stephen Johnson pcc schrieb (einer der ersten C-Compiler), gab es neben vielen anderen Sprachen auch Compiler für B. gcc hatte mehrere Compiler zur Auswahl, um es ursprünglich zu erstellen, und RMS sagt, dass er den Pastel-Compiler zumindest während seiner anfänglichen Entwicklung verwendet hat.

Denken Sie daran, dass ein C-Compiler nicht in C geschrieben werden muss. Sie können ihn in Perl schreiben, wenn Sie möchten. Es ist nicht erforderlich, dass ein Compiler für eine bestimmte Plattform ursprünglich auf dieser Plattform geschrieben wurde (eingebettete Systeme werden fast immer auf einem anderen System kompiliert). Es gibt also viele Möglichkeiten, sich selbst in die Knie zu zwingen.

Diese Frage enthält einige interessante Feinheiten im Zusammenhang mit der ersten Instanz des Bootstrapings des Compilers. Wenn Sie sehr schlau wären, könnten Sie diesen Bootstrap nutzen, um etwas Unglaubliches, Brillantes und Furchterregendes zu tun .

Rob Napier
quelle
Woah, dieser zweite Artikel, auf den du verlinkt hast, ist wahnsinnig schlau.
Ponkadoodle
1
Vielen Dank für den tollen Bootstrapping-Link. Ich hatte angenommen, dass Compiler aus diesem Grund immer in einfacheren Sprachen bis hin zum Maschinencode geschrieben waren . (Was ist zum Beispiel, wenn Sie feststellen, dass die Binärdatei für Ihren Compiler einen Fehler enthält? Dies ist natürlich ein viel stärkeres Beispiel.) Welche Vorteile bietet es, den Compiler in seiner eigenen Sprache zu schreiben? Sorgen sich extrem paranoide Leute darüber und bauen ihre Compiler ohne "selbst" Bootstrapping?
RoG
4
Einige Sprachgruppen betrachten es als Ehrenzeichen, sich selbst zusammenstellen zu können. Go hat kürzlich einen großen Schub in diese Richtung gemacht. Swift hingegen hat derzeit keine Pläne, seinen Compiler in Swift neu zu schreiben. Beachten Sie jedoch, dass GCC immer in C geschrieben wurde. Es wurde nur mit anderen Compilern kompiliert. Aber wenn alle C-Compiler in BCPL geschrieben wären, würde dies nichts in Bezug auf Paranoia beheben. Es bewegt das Problem nur einen Schritt zurück. (Sie würden die gleichen Paranoia-Vorteile erhalten, wenn Sie nur GCC mit Clang kompilieren.)
Rob Napier
51

Ursprünglich war es in einer Assemblersprache geschrieben, dann begann es selbst mit Hundefutter.

Daniel A. White
quelle
2
Ich habe keine Verweise auf RMS mit Assembler für den ursprünglichen Bootstrap gesehen. Was ist deine Quelle dafür? Er hatte mehrere andere Compiler, mit denen er booten konnte, also scheint das eine Menge Arbeit zu sein.
Rob Napier
16
Ich dachte, der Begriff war Bootstrap.
Martin York
6
hahaha, ich habe das vor ein paar Wochen gelesen und dachte, du wärst mit diesem Ausdruck verrückt, wusste nicht, dass es Standard ist. Gute Show, Sir! en.wikipedia.org/wiki/Eating_your_own_dog_food
3

Obwohl dies offensichtlich nur ein sehr grober Indikator ist, fand ich diese schnelle Auflistung im gcc-5.1.0-src/gcc/Verzeichnis interessant. Dieses Verzeichnis enthält die Hauptquellen von GCC selbst (mit Ausnahme von Laufzeitbibliotheken).

Hier sind die höchsten Dateizahlen (über 100), gruppiert nach Erweiterungen, die von C- und C ++ - Dateien dominiert werden.

    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 

Bitte beachten Sie, dass sich heutzutage GCCauf die GNU Compiler Collection bezieht, nicht nur auf den GNU C Compiler.

6.3 Das Unterverzeichnis gcc

Das gcc-Verzeichnis enthält viele Dateien, die Teil der C-Quellen von GCC sind, andere Dateien, die im Rahmen des Konfigurations- und Erstellungsprozesses verwendet werden, sowie Unterverzeichnisse, einschließlich Dokumentation und Testsuite.

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

oo_miguel
quelle