Gibt es nicht ein Henne-Ei-Problem, da GCC in C ++ selbst geschrieben ist?

10

Seit Version 4.8 ist der C ++ - Compiler GCC (der G ++ - Teil davon) nicht mehr in C, sondern in C ++ selbst geschrieben. Ich habe eine hypothetische Frage dazu.

Ich frage mich, wie man den C ++ - Code von GCC auf einer neuen Plattform kompiliert, die noch keinen C ++ - Compiler hat. Natürlich können Sie vorgefertigte Binärdateien verwenden, die auf anderen Computern kompiliert wurden. Oder Sie können eine ältere Version von GCC verwenden, die in C geschrieben wurde, und die aktuelle Version damit kompilieren.

Ohne vorgefertigte Binärdateien und nur die neueste Version steckten Sie jedoch fest, oder? Wenn nicht, gibt es andere Auswirkungen auf diese Situation, die durch den Wechsel von C zu C ++ des GCC-Projekts entstehen?

Danijar
quelle
3
Ich bin mir nicht sicher, was Sie hier fragen, obwohl Sie vielleicht etwas über Cross Compilation lesen möchten .
5
Eine völlig neue Plattform wird weder einen C ++ - Compiler noch einen C-Compiler haben. Cross Compilation ist die Antwort.
Doc
1
Sie sollten wahrscheinlich lesen GCC Umzug nach C ++ , Umzug in C ++ und möglicherweise die Diskussion GCC wird nun brauchen C ++ Build auf reddit. Ich bin nicht sicher, ob gccvor 4.8 mit dem C-Compiler gebaut werden konnte, der mit einem beliebigen Betriebssystem gepackt war (und das würde Sie bei vielen auf C89 beschränken).
2
Ich verstehe nicht, was an C ++ für diese Frage besonders ist. Das Problem besteht bei C oder einer anderen Sprache, nicht wahr?
RemcoGerlich

Antworten:

16

Dies ist eigentlich ein bekanntes Konzept namens Bootstrapping . Grundsätzlich gibt es irgendwo eine minimale C-Codebasis, um eine Version von GCC zu erstellen, mit der die aktuelle GCC-Codebasis erstellt werden kann. Selbsthosting-Sprachen machen solche Dinge seit Jahrzehnten.

Mason Wheeler
quelle
Nicht wirklich. Das ist nicht mehr der Fall (und das Problem mit der Frage). gcckann nicht mehr nur vom AC-Compiler erstellt werden. Die einzige Garantie für die von ihnen erstellten gcc-Kompilierungen besteht darin, dass die gcc-Version N mit der gcc-Version N-1 erstellt werden kann.
9
@MichaelT: Aber eine frühere Version von GCC kann mit einem C-Compiler erstellt werden, der dann spätere in C ++ geschriebene Versionen kompilieren kann, was ich gesagt habe.
Mason Wheeler
Ich möchte auch auf die Fragen in der Frage hinweisen: However, without prebuilt binaries and just the newest version, you were stuck, right? If not, are there other implications on this situation raised by the switch from C to C++ of the GCC project?- Es setzt voraus, dass Sie keinen Zugriff auf frühere Versionen haben, und es werden auch nicht die anderen Auswirkungen des Wechsels von C zu C ++ auf die Codebasis angesprochen.
9

Das Erstellen eines Compilers, der in derselben Sprache geschrieben ist, in der er kompiliert wird, wird als Bootstrapping bezeichnet . Der Wikipedia-Artikel beschreibt eine Reihe von Möglichkeiten, wie ein Compiler gebootet werden kann.

Angesichts Ihrer Einschränkung, dass Sie nur einen G ++ - Quellcode nach 4.8 und keine vorgefertigten Binärdateien für Ihre Zielplattform haben (kein vorhandener C ++ - Compiler), kann das Bootstrapping des G ++ - Compilers durch Cross-Compilation erfolgen .

Wenn Sie einen Compiler mithilfe der Cross-Kompilierung booten, erstellen Sie mehrere Versionen Ihres Compilers

  1. Auf Ihrem PC installieren Sie einen C ++ - Compiler (kann ein beliebiger C ++ - Compiler sein, muss nicht G ++ sein)
  2. Mit diesem Compiler erstellen Sie einen G ++ - Cross-Compiler, der auf dem PC ausgeführt werden kann und Code für die Zielplattform generiert
  3. Mit dem soeben erstellten G ++ - Cross-Compiler erstellen Sie einen nativen G ++ - Compiler, der auf der Zielplattform ausgeführt und Code dafür erstellt werden kann.
  4. Du bist fertig. Sie haben einen C ++ - Compiler für die neue Plattform erstellt.

Wenn Sie auch keinen PC (oder einen ähnlichen) haben, auf dem Sie die ersten Schritte ausführen können, stecken Sie zwar fest, aber die Wahrscheinlichkeit, in dieser Situation zu sein und zu versuchen, einen Compiler zu booten, ist vernachlässigbar.

Bart van Ingen Schenau
quelle