Ich habe mich gefragt, warum C ++ eine gute Wahl ist, um einen Compiler zu schreiben. Natürlich ist C auch für diesen Zweck gut, da viele Compiler entweder in C oder C ++ geschrieben sind, aber ich bin diesmal mehr an C ++ interessiert. Irgendwelche guten Gründe? Das habe ich im Internet gesucht, aber ich kann keine guten Gründe finden.
15
Antworten:
C ++ hat zwei Seiten. Es hat eine Low-Level-Entwicklungsseite, die es wie eine natürliche Sprache erscheinen lässt, um Low-Level-Aufgaben wie die Codegenerierung auszuführen. Es hat auch eine High-Level-Seite (was C nicht tut), mit der Sie eine komplexe Anwendung (wie einen Compiler) auf logische, objektorientierte Weise strukturieren können, ohne die Leistung zu beeinträchtigen. Da es sowohl Low- als auch High-Level-Aspekte aufweist, ist es eine gute Wahl für große Anwendungen, die Low-Level-Funktionen oder -Leistung erfordern.
quelle
Meine Erfahrung stimmt hier nicht mit Ihrer Prämisse überein. Tatsächlich ist es bei allgemeinen Hochsprachen üblich, den Compiler in derselben Sprache wie die Ausgangssprache (die zu kompilierende Sprache) zu schreiben . Beispielsweise:
Eine Ausnahme bilden Compiler-Frontends, die für vorhandene Compiler-Frameworks wie GCC, LLVM oder Polyglot geschrieben wurden und dann in der Sprache des Frameworks geschrieben wurden, oder Compiler, die auf vorhandenen Parser-Generatoren wie Yacc basieren. Da GCC, LLVM und Yacc gängige, in C und C ++ geschriebene Tools sind, bieten sie den Compiler-Autoren einen Anreiz, sie zu verwenden, was dazu führen kann, dass C und C ++ einen großen Anteil an der Verteilung der Compiler-Implementierungssprache haben.
quelle
javac
Befehlszeile) von Sun , mit dem Java in Java-Bytecode kompiliert wird. Es ist in Java geschrieben - ich habe es selbst oft modifiziert und Sie können die Java-Quellen online durchsuchen . Der andere ist der in die Hotspot-JVM eingebettete Just-in-Time-Compiler, der Java- Bytecode in systemeigenen Maschinencode kompiliert. Wie die meisten JVMs ist es in C ++ geschrieben, aber es ist kein Java-Compiler - tatsächlich weiß es nichts über die Java-Sprache.Um was zu was zu kompilieren? Ein Compiler transformiert einen Quellcode von einer Sprache (Quellsprache) in eine andere (Zielsprache), was nichts über die niedrige Ebene der Zielsprache aussagt.
Die Sprache, die Sie zum Schreiben eines Compilers auswählen, hängt vom Kontext ab.Bei der Arbeit an einem Projekt, das eine von PHP abgeleitete Sprache in einen nativen PHP-Code übersetzt, habe ich zum Schreiben des Compilers eine Mischung aus PHP und C # verwendet, da dies für mich aufgrund meiner Fähigkeiten am sinnvollsten war. Eine andere Person würde Python oder Java und PHP oder C ++ mit etwas JavaScript oder was auch immer auswählen.
C oder C ++ ist aufgrund der Unterstützung von Compiler-bezogenen Tools (siehe die Antwort von Telastyn) und der Tatsache, dass diese beiden Sprachen es Ihnen ermöglichen, wirklich muttersprachlich zu werden, eine beliebte Wahl. Aber es ist nichts Falsches daran, eine andere Sprache zu wählen.
Beachten Sie, dass , um mehr zu sein geeky , können Sie die Quellsprache wählen Sie den Compiler selbst zu schreiben. Genau das ist beim CoffeeScript-Compiler und vielen anderen Compilern passiert. Es ist auch bei den IDEs beliebt: Eines der ersten Visual Studios wurde mit demselben Visual Studio erstellt.
quelle
Ich neige dazu, die grundlegende Prämisse hier in Frage zu stellen. Während C und C ++ hervorragend zum Schreiben von Compilern geeignet sind, scheinen einige andere Sprachen für diese Aufgabe ebenfalls hervorragend geeignet zu sein.
Ein bisschen hängt jedoch von der Sprache ab, die Sie kompilieren. Für kleine, einfache Sprachen funktionieren C und Pascal ganz gut. Wenn Sie etwas Großes und Komplexes kompilieren, wird Ihr Compiler auch groß und komplex - in diesem Fall sind die zusätzlichen Funktionen von C ++ zum Organisieren und Arbeiten mit größeren Programmen offensichtlich nützlich. Das ist jedoch nicht sehr spezifisch für das Kompilieren, sondern bietet nur nützliche Funktionen für größere Programme im Allgemeinen.
Ich denke, es lohnt sich auch, einen weiteren Punkt zu erwähnen. Anfänger (scheinen) denken, dass Compiler hauptsächlich Textmanipulationen ausführen. Sie denken also, dass Perl eine große Hilfe beim Schreiben von Compilern sein wird. In Wirklichkeit beginnen die meisten interessanten Teile der Kompilierung erst, nachdem Sie Ihren AST erstellt haben. Obwohl ich sicher bin, dass Perl die Aufgabe perfekt erledigen kann, bringt seine Textmanipulationsfähigkeit auch keinen großen Vorteil (die Textmanipulation liegt hauptsächlich im Lexer, und Lexer-Generatoren für Dinge wie C unterstützen sowieso alle REs).
quelle
Compiler können in jeder modernen Sprache implementiert werden. Eine der wichtigsten Anforderungen an einen Compiler ist jedoch, schnell zu sein.
C ++ hat hier einen klaren Vorteil. Optimierung in C ++ ist nicht billig. Aufgrund der niedrigen Ebene dieser Sprache ist es jedoch möglich, C ++ - Code mehr manuell zu optimieren als in jeder anderen Sprache (mit Ausnahme von Assembly, die nicht portierbar ist).
quelle
Ich vermute, dass der Hauptgrund für ihre Verwendung darin besteht, dass die Lex / Yacc / Bison-Ausgabe (hauptsächlich) in C liegt. Da dies seit so langer Zeit der Standard ist, hat sie Schwung.
Nicht, dass das besonders gute Gründe wären ...
quelle