Wie kann ein C-Compiler in C geschrieben werden? [duplicate]

Lesezeit: 5 Minuten

Benutzeravatar von jub0bs
jub0bs

Diese Frage könnte auf ein Missverständnis von Compilern meinerseits zurückzuführen sein, aber hier geht es …

Im Vorwort zur ersten Ausgabe von K&R (Seite xi) findet sich folgende Aussage:

Das Betriebssystem, der C-Compilerund im Wesentlichen alle UNIX-Anwendungsprogramme (einschließlich der gesamten Software, die zur Erstellung dieses Buchs verwendet wurde) sind in C geschrieben.

(meine Betonung)

Folgendes verstehe ich nicht: Muss dieser C-Compiler nicht selbst kompiliert werden, bevor er C-Code kompilieren kann? Und wenn dieser C-Compiler in C geschrieben ist, würde das Kompilieren dann nicht einen bereits vorhandenen C-Compiler erfordern?!

Der einzige Ausweg aus diesem unendlichen Regressionsrätsel (oder Henne-Ei-Problem) besteht darin, dass der in C geschriebene C-Compiler, auf den sich K&R bezieht, tatsächlich mit einem bereits vorhandenen C-Compiler kompiliert wurde, der in einer anderen Sprache als C geschrieben wurde Der in C geschriebene C-Compiler löste dann letzteren ab.

Oder bin ich komplett daneben?

  • Nun, Sie beginnen mit einem in Assembler oder was auch immer, und sobald Sie das haben, ist es möglich, es zu verwenden, um eines in C zu erstellen und so weiter danach.

    – Chris

    15. August 2013 um 7:13 Uhr

  • C wurde zuerst in B geschrieben, das ein abgespecktes BCPL war, das, glaube ich, ein abgespecktes Algol 60 war. B wurde aber wahrscheinlich in einem Makro-Assembler geschrieben.

    – aoeu256

    4. September 2019 um 18:19 Uhr

Benutzeravatar von Yu Hao
Yu Hao

Es heißt BootstrappingZitat aus Wikipedia:

Wenn man einen Compiler für Sprache X braucht, um einen Compiler für Sprache X zu erhalten (der in Sprache X geschrieben ist), wie wurde dann der erste Compiler geschrieben? Mögliche Methoden zur Lösung dieses Huhn- oder Ei-Problems sind:

  1. Implementierung eines Interpreters oder Compilers für Sprache X in Sprache Y. Niklaus Wirth berichtete, dass er den ersten Pascal-Compiler in Fortran geschrieben habe.
  2. Ein anderer Interpreter oder Compiler für X wurde bereits in einer anderen Sprache Y geschrieben; so wird Scheme oft gebootstrapped.
  3. Frühere Versionen des Compilers wurden in einer Teilmenge von X geschrieben, für die es einen anderen Compiler gab; Auf diese Weise werden einige Supersets von Java, Haskell und dem anfänglichen Free Pascal-Compiler gebootstrapped.
  4. Der Compiler für X wird aus einer anderen Architektur querkompiliert, wo es einen Compiler für X gibt; so werden Compiler für C normalerweise auf andere Plattformen portiert. Dies ist auch die Methode, die für Free Pascal nach dem anfänglichen Bootstrap verwendet wird.
  5. Schreiben des Compilers in X; Kompilieren Sie es dann von Hand aus der Quelle (höchstwahrscheinlich auf nicht optimierte Weise) und führen Sie es auf dem Code aus, um einen optimierten Compiler zu erhalten. Donald Knuth nutzte dies für sein WEB-Literate-Programmiersystem.

Und wenn Sie interessiert sind, hier ist Dennis Richies erste C-Compiler-Quelle.

Benutzeravatar von perror
Pech

Normalerweise wird ein erster Compiler in einer anderen Sprache geschrieben (in diesem Fall direkt in PDP11-Assembler oder in C für die meisten “modernen” Sprachen). Dann wird dieser erste Compiler verwendet, um einen in der Sprache selbst geschriebenen Compiler zu programmieren.

Sie können dies lesen Seite über die Geschichte der C-Sprache. Sie werden sehen, dass es auch stark mit dem UNIX-System verbunden ist.

  • Seien Sie vorsichtig, wenn Sie die Wahrheiten von 1970 in die Gegenwart transportieren. GCC auf C++ umgestellt 🙂

    – Marco van de Voort

    15. August 2013 um 19:36 Uhr


  • Hmmm, GCC in C++… Da bin ich etwas skeptisch (und auch ängstlich! :-)).

    – Pech

    16. August 2013 um 8:10 Uhr

  • gcc.gnu.org/gcc-4.8/changes.html erste Linie.

    – Marco van de Voort

    16. August 2013 um 20:36 Uhr

Sehen Sie sich den Abschnitt Huhn und Ei an Wikipedia-Seite:

Wenn man einen Compiler für Sprache X braucht, um einen Compiler für Sprache X zu erhalten (der in Sprache X geschrieben ist), wie wurde dann der erste Compiler geschrieben? Mögliche Methoden zur Lösung dieses Huhn- oder Ei-Problems sind:

  • Implementierung eines Interpreters oder Compilers für Sprache X in Sprache Y. Niklaus Wirth berichtete, dass er den ersten Pascal-Compiler in Fortran geschrieben habe.
  • Ein anderer Interpreter oder Compiler für X wurde bereits in einer anderen Sprache Y geschrieben; so wird Scheme oft gebootstrapped.
  • Frühere Versionen des Compilers wurden in einer Teilmenge von X geschrieben, für die es einen anderen Compiler gab; Auf diese Weise werden einige Supersets von Java, Haskell und dem anfänglichen Free Pascal-Compiler gebootstrapped.
  • Der Compiler für X wird aus einer anderen Architektur querkompiliert, wo es einen Compiler für X gibt; so werden Compiler für C normalerweise auf andere Plattformen portiert. Dies ist auch die Methode, die für Free Pascal nach dem anfänglichen Bootstrap verwendet wird.
  • Schreiben des Compilers in X; Kompilieren Sie es dann von Hand aus der Quelle (höchstwahrscheinlich auf nicht optimierte Weise) und führen Sie es auf dem Code aus, um einen optimierten Compiler zu erhalten. Donald Knuth nutzte dies für sein WEB-Literate-Programmiersystem.

  • Pascal cuoq … Im ersten Punkt sollte Sprache Y zuerst einen Compiler haben, richtig? Ich denke, Sprachen wie Clojure wurden auf diese Weise geschrieben. Können Sie das “Handkompilieren” erklären?

    – AV94

    9. Februar 2015 um 13:40 Uhr

Es ist völlig normal, dass ein Compiler in der Sprache geschrieben ist, die er kompiliert. Eine Möglichkeit, dies zu erreichen, wäre, einen vollständigen Compiler für die Sprache L in einer anderen Sprache zu schreiben und dann einen neuen Compiler für L in L zu schreiben. Ein interessanterer Ansatz wäre, einen minimalen Compiler für eine Teilmenge von L in einigen zu schreiben anderen Sprache, und verwenden Sie dann diese minimale Teilmenge, um den Compiler zu verbessern, indem Sie ihn weniger minimal machen und die verfügbare Teilmenge von L erhöhen. Auf diese Weise kann ein vollständiger Compiler erstellt werden.

1417000cookie-checkWie kann ein C-Compiler in C geschrieben werden? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy