23 Stimmen

Quelloffener C-Compiler in C#?

Ich habe mich mit der Erstellung von Compilern beschäftigt. Ich habe einige tolle Sachen für Anfänger und Fortgeschrittene gefunden, aber nichts in der Mitte. Ich habe 3 verschiedene einfache Proof-of-Concept-Compiler für Spielzeugsprachen erstellt, aber ich möchte mich an etwas Richtiges heranwagen.

Die einfachste Sprache in Bezug auf die Syntax scheint C zu sein. Da die Sprache, mit der ich mich im Moment am wohlsten fühle, C# ist, würde ich gerne den Quellcode eines echten C-Compilers in C# studieren, der kein Tutorial ist. Gibt es einen solchen (mit verfügbarem Quellcode)?


Idealerweise hätte ich gerne einen C-Compiler, keinen .NET- oder C#-Compiler, aber mit dem Quellcode in C# geschrieben.
Ich weiß, C# --> C fühlt sich ein wenig rückwärts, aber es wird mir erlauben, tiefer in Compilern beginnend mit einer vertrauten Sprache zu erleichtern, bevor ich gehen, dass zu ändern.

Obwohl ich nicht auf der Suche nach C#/.NET Compilern bin, hier sind einige, falls jemand diese Frage sieht, der danach sucht:

11voto

Hans Passant Punkte 894572

Sie werden es schwer haben, einen Beispielcode zu finden. Compiler-Autoren verwenden bootstrapping . Der erste C-Compiler wurde in B geschrieben. Daraus wurde dann der erste C++-Compiler geschrieben. Mit ihm wurde der C#-Compiler geschrieben. Die sehr häufig verwendet wird, um Compiler für verwalteten Code zu schreiben.

Dies ist kein Prozess, der jemals rückwärts läuft. Obwohl Side-ways üblich waren, wurden C-Compiler oft zur Cross-Compilierung eines Compilers für ein anderes Betriebssystem verwendet.

Ich glaube, ich habe dieses Buch In den Anhängen befindet sich hervorragender C-Compiler-Code. Geschrieben in C. Ich habe Teile davon verwendet, als ich einen Basic-Compiler schrieb, den ich für ein großes Projekt benötigte. Der Ausdrucks-Parser ist schwer richtig zu machen, es hat eine elegante Lösung für die Operator-Prioritätsregeln.

Eine verwaltete Sprache ist der einfachere Weg, dies in Gang zu bringen. Die Sprache sollte keine allzu große Rolle spielen, die eigentliche Herausforderung besteht darin, sie zum Laufen zu bringen. Auch wenn es sich um eine Los Es ist einfacher, verwalteten Code zum Laufen zu bringen. Wenn Sie auf C abzielen wollen, benötigen Sie Maschinencode-Kenntnisse auf höchstem Niveau und einen tiefen Einblick in das Objektdateiformat und den Linker.

10voto

Eric Lippert Punkte 628543

Die von der Syntax her einfachste Sprache scheint C zu sein.

Ich bin mir nicht sicher, was Sie mit "echter Sprache" meinen, aber was auch immer "echte Sprache" bedeutet, ich kann nicht zustimmen, dass C eine "einfache" lexikalische oder syntaktische Grammatik hat, und seine Semantik ist unterspezifiziert. Wenn Sie eine extrem einfache Sprache mit ziemlich gut definierter Semantik wollen, warum nehmen Sie dann nicht Scheme? Scheme hat eine sehr einfache Grammatik, aber es ist sicher nicht trivial, die Semantik richtig zu verstehen.

5voto

Luiscencio Punkte 3775

4voto

Ken Punkte 2804

Ich weiß nicht, ob es so etwas gibt, aber es gibt keinen Grund, warum es nicht möglich wäre oder sein sollte.

Das Schreiben eines Compilers für eine C-ähnliche Sprache ist ein klassisches Projekt für einsemestrige College-Compiler-Kurse. Wenn Sie C# bereits kennen, bietet es eine Menge Funktionen, die Ihnen die Arbeit leichter machen als zu meiner Studienzeit! Es gibt jede Menge Bibliotheken, die Ihnen die Arbeit erleichtern, ohne Ihnen die Herausforderung zu nehmen, und Sie können sie jederzeit durch Ihren eigenen Ad-hoc-Code ersetzen, wenn Sie Flexibilität benötigen, die sie nicht bieten.

Der erste C-Compiler wurde in BCPL geschrieben, weil es das war, was sie hatten. Aktuelle C-Compiler sind in der Regel in C geschrieben, weil sie portabel sein sollen. Ich glaube nicht, dass irgendjemand bestreiten würde, dass C eine gute Sprache zum Schreiben von Compilern ist. (C# ist zwar nicht perfekt, aber viel besser!) Bei einer statisch kompilierten Sprache wie C glaube ich nicht, dass es viel bringt, wenn überhaupt, wenn man die Zielsprache zum Schreiben des Compilers verwendet.

Ein Compiler in einer HLL hat potenziell viele Vorteile. Er wäre kürzer und einfacher als ein in C geschriebener. Das allein könnte viele Dinge so weit vereinfachen, dass sie unter die Schwelle von "zu schwer, dass niemand sie jemals machen wird" fallen. (GCC ist so etwas wie das Aushängeschild dafür, dass ein in einer LLL geschriebener Compiler so komplex sein kann, dass er sich mit eisiger Geschwindigkeit bewegt). Optimierungen sind im Grunde Graphentransformationen, die nicht gerade die Stärke von C sind.

Ich halte es keineswegs für "rückständig", C# zu verwenden, um C zu kompilieren. Solange jemand nicht vorschlägt, seinen gesamten C-Code in einer höheren Sprache neu zu schreiben, muss er immer noch irgendwie kompiliert werden, und das bedeutet, dass man einen Compiler braucht. Sollte dieser Compiler nicht mit Werkzeugen geschrieben werden, die es ihm ermöglichen, die beste Zuverlässigkeit und Leistung zu bieten?

Viel Glück! Ich freue mich darauf zu sehen, was Sie schreiben!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X