2009-08-22 11 views
5

bitte ich brauche einige Ressourcen zu beginnen (ich bin ein cs Schüler)Was ist die beste Programmiersprache zum Schreiben von Parsern und Compilern?

+1

Dupe von http://stackoverflow.com/questions/1669/learning-to-write-a-compiler unter vielen, viele andere –

+0

Wenn dies eine offene Anfrage für Ressourcen ist, haben sie Neil Recht. Wenn es um Vergleich und Kontrast geht, dann grenzt es an "subjektiv und argumentativ" – dmckee

+0

Siehe [was ist die beste Sprache zum Schreiben-ein-Compiler-in] (http://stackoverflow.com/) questions/809710/Was ist die beste Sprache, um einen Compiler zu schreiben? – nawfal

Antwort

9

Die Antwort kann hier sehr subjektiv sein. Aber ich würde empfehlen, ANTLR zu verwenden, wenn Sie einen Parser schreiben möchten. Derzeit unterstützt ANTLR C-, C# -, ActionScript-, JavaScript- und Java-Ziele. Aus meiner Erfahrung ist die Java-Version wirklich stabil zu verwenden und wurde in vielen leistungsstarken Opensource-Projekten verwendet, nämlich Drools und Hibernate.

2

Lisp/Scheme war, was wir mit der Verwendung von zurück in uni beauftragt wurden.

Sie lehnten sich ziemlich gut an die Aufgabe.

Dan

2

Während ich einmal ein Textbuch hatte den Titel ‚moderne Compiler-Implementierung in Java‘ Ich denke, die Profis C. Andere verwenden nach wie vor als zu beweisen, dass ihre Sprache selbst zusammenstellen kann.

6

Muss es in einer Programmiersprache geschrieben werden? Oder können Sie Flex und Bison verwenden?

+1

Ich wollte Flex und Bison vorschlagen. :-) –

+4

Parser Generatoren entfernen nicht die Notwendigkeit für eine Programmiersprache. Sie erzeugen einen Parser in einer bestimmten Sprache. Die traditionelle Flex/Bison (LEX/YACC) Sprache ist C. – Brannon

+0

@ Brannon +1 für Ihren Kommentar; Du brauchst noch eine Programmiersprache. Ich möchte jedoch hinzufügen, dass Flex/Bison oder Lex/Yacc ziemlich veraltet sind. Wenn du etwas wie Coco/R benutzt hast und zu Lex/Yacc gehst, wirst du dich verzweifelt nach Features sehnen, von denen nicht zuletzt Lookaheads größer als eins sind. – Imagist

0

Möchten Sie einen Parser für eine allgemeine Sprache schreiben? In diesem Fall wird das Schreiben (und Bootstrapping) in der Zielsprache empfohlen. Sie sollten Ihr eigenes Hundefutter essen.

+1

Ich würde sagen, "in vielen Fällen empfohlen", nicht "eindeutig empfohlen". "Allzwecksprache" ist eine Art Fehlbezeichnung, da es keine Sprache gibt, die für * alle * Aufgaben geeignet ist. Ich würde keine Webanwendung in C schreiben und würde kein Betriebssystem in Python schreiben. Es ist nicht so, dass du keines dieser Dinge tun kannst; Es ist einfach so, dass es nicht angebracht wäre. Wenn Sie diese Logik akzeptieren, ist es sinnvoll, dass Sie eine allgemeine Sprache schreiben, die nicht zum Parsen geeignet ist und daher nicht zum Parsen verwendet werden sollte. – Imagist

+1

Hier ist ein schönes Beispiel: Der * gesamte * JavaScript-Interpreter des STEPS-Projekts besteht aus nur 170 Zeilen OMeta-Quellcode, und eine Person brauchte einen Nachmittag, um zu schreiben. Im Narcissus-JavaScript-Interpreter umfasst der Parser * alone * mehr als 1000 JavaScript-Zeilen und weitere 1000 Zeilen für den AST-Besucher. Daher ist die Verwendung von JavaScript zur Implementierung von JavaScript 10-mal ausführlicher als die Verwendung von OMeta. –

+0

Aber Sie fluten eine Menge Bugs aus, wenn Sie Ihren Parser/Compiler wirklich benutzen. Und Sie verwenden es wirklich, indem Sie es in dieser Sprache selbst implementieren. – Mnementh

1

Wenn Sie einen Compiler von Grund auf implementieren, sind die meisten Programmiersprachen der Aufgabe gewachsen. (Ich kenne sogar Compiler/Parser, die in Fortran IV und COBOL geschrieben sind, obwohl ich das nicht empfehlen würde!)

Aber wenn die Sprache, die Sie implementieren möchten, sogar eine nicht-triviale Grammatik hat, würden Sie Verwenden Sie besser einen Lexer-Generator und/oder einen Parser-Generator, um das Frontend zu implementieren. Sie erhalten einen viel schnelleren und zuverlässigeren Parser.

Also, auf dieser Basis geeignete Programmiersprachen, für die ein anständiger Parsergenerator verfügbar ist. Es gibt eine Seite auf Wikipedia, die eine große Anzahl von Parser-Generatoren vergleicht. Ich wusste nicht, dass es so viele gibt!

1

Wenn Sie die Techniken erlernen möchten, die hinter Parsern (und Tokenizern) stehen, ist es vielleicht besser, eine selbst zu schreiben. Sie können dies in den meisten Programmiersprachen tun, so dass Sie sich für eine auswählen können, mit der Sie sich wohl fühlen.

Vor einiger Zeit habe ich eine Reihe von Blogposts geschrieben, die zeigen, wie einfach es ist, in C# einen Parser für eine kleine fiktionale BASIC-ähnliche Programmiersprache zu schreiben. Ich möchte hier nicht spammen, daher werde ich keinen direkten Link bereitstellen, aber wenn Sie einen Blog besuchen (siehe mein Profil) und ganz nach unten gehen, finden Sie in den "Meine Posts" einen Link "Einen Parser schreiben" "-Sektion.

3

Sie sollten in Parser-Generatoren suchen. Wenn Sie ein CS-Student sind, dann sollten Sie sich das Dragon Book ansehen: http://en.wikipedia.org/wiki/Compilers:_Principles,_Techniques,_and_Tools.

Es wäre wahrscheinlich am einfachsten, einen Parser mit C# oder Java zu erstellen, da Sie sich über Dinge wie Speicherverwaltung usw. keine Gedanken machen müssen und sich auf die Grammatik konzentrieren können. Ein guter C# Parser Generator ist GPPG: http://plas.fit.qut.edu.au/gppg/.

+0

Kann jemand erklären, warum dies abgelehnt wurde? Das Drachenbuch ist eine ausgezeichnete Quelle, und C#/java folgt zufällig dem Wort der Frage. Obwohl ich denke, die Frage selbst ist dumm. – gimpf

4

Parser und Compiler sind zwei getrennte Probleme. Zum Beispiel könnte ich einen Compiler in C schreiben, aber ich würde nie einen Parser in C schreiben (ich würde einen Parser-Generator verwenden).Bei sehr einfachen Parsern, bei denen die Geschwindigkeit keine hohe Priorität hat, kann ich den Parser in Perl oder Python, die über gute Möglichkeiten zur Textmanipulation verfügen, manuell codieren. Aber für alles, was über einen sehr einfachen Parser hinausgeht, würde ich eine Art von Parser-Generierungswerkzeugen verwenden. Die am häufigsten verwendeten sind ANTLR, Coco/R und Lex/Yacc und die GNU-Implementierung Flex/Bison. Meine persönliche Vorliebe ist Coco/R, aber ANTLR scheint heutzutage beliebter zu sein.

Wenn Sie eine universelle Programmiersprache schreiben, sollten Sie in Erwägung ziehen, sie selbst zu schreiben. Es gibt viele Vorteile, einschließlich Portabilität (die Leute müssen nur die erste Version der Sprache portieren) und Demonstration von Fähigkeiten (Parsing ist ein schweres Problem, wenn es also in Ihrer Sprache gemacht werden kann, ist ein Beweis für Ihre Sprache). Wenn Ihre Sprache interpretiert wird, ist dies aus Leistungsgründen möglicherweise nicht angemessen.

Verwandte Themen