compiler-construction zweck Ist es hilfreich für einen Programmierer zu lernen, wie man einen Compiler erstellt?




welche programmiersprache für welchen zweck (14)

Es gibt eine große Vielfalt, wenn es um die verschiedenen Arten von Programmierern geht. Im Allgemeinen ist es nützlich für einen Programmierer zu lernen, wie man einen Compiler erstellt? In welchen Fällen wird eine Compiler-Programmierung benötigt oder nicht?



Compiler-Programmierung ist ein interessantes Thema und es gibt einen großen Wert für sie. Am College war ich ein Wahlfach, Sprachdesign und Implementierung. Ich bin persönlich dankbar, dass ich es genommen habe. Wir lernten die verschiedenen Möglichkeiten, Lexer, Parser und Bytecode-Emitter zu implementieren.

Der wirkliche Wert, den ich gesehen habe, ist, dass es die Black Box beleuchtet hat, auf die ich angewiesen bin, um mein Programm zum Laufen zu bringen. Es gab mir einen besseren Einblick in die Funktionsweise des Compilers und half mir, Compilerfehler besser zu verstehen.

Der Prozess des Kompilierens von Source in Code ist tatsächlich in einer allgemeinen Weise, was die meisten Programme tun, nehmen einige Eingaben vor, führen einen Prozess durch und geben das Ergebnis aus. Ein Compiler hat einige sehr gut definierte Ideen, wie dies am besten zu machen ist.

Ich denke alles in allem war es vorteilhaft für mich, und derzeit arbeite ich an Java-basierten Web-Anwendungen.


Ich bin ein Webentwickler; Ich verbringe die meiste Zeit in PHP und MySQL. Ich denke nicht, dass es einen großen Nutzen hätte, einen Compiler zu bauen.

Verschiedene Arten von Programmierern erhalten unterschiedliche Beträge von Nutzen.

Etwas von einer Nicht-Antwort, ich weiß ...


Ja, es ist eine gute Idee. Zu lernen, wie all diese Dinge funktionieren, kann nur dem Programmierer nützen. Ich habe einen BASIC-Compiler in SX ASM geschrieben und eine Menge daraus gelernt.

Wie jemand anders erwähnt hat, gibt es viele Grade von Programmierern und Wissen. Ein Webentwickler, der hauptsächlich in Markup- und Skriptsprachen arbeitet, würde wahrscheinlich nicht so viel davon profitieren wie ein Hardcore-C- oder ASM-Programmierer, der eingebettete Systemsoftware schreibt - das heißt nicht, dass es kein nützliches Wissen wäre.

Neu erfinderische Räder sind immer nützlich für den Bildungswert.


Ich habe die meisten dieser Antworten gewählt.

Ich denke, Compiler-Arbeit gibt Ihnen wichtige Denkweisen über das Programmieren im Allgemeinen.

Wenn Sie ein Programm schreiben, definieren Sie in gewisser Weise eine Sprache, und jedes Programm ist auf einer bestimmten Ebene ein Sprachprozessor.

Es macht Sie über die beste Möglichkeit zur Darstellung von Informationen nachdenken und verstehen, dass Informationen auf viele verschiedene Arten codiert werden können, nicht nur als Datenstruktur und viele Klassen.

Sobald Sie wissen, dass jedes Problem mehrere gültige Lösungen mit Vor-und Nachteile hat, können Sie in der Regel eine viel bessere Lösung wählen als mit dem alten datenzentrierten One-Size-Fits-All-Paradigma.


Ich bin gerade dabei, das Drachenbuch (Compiler) durchzulesen und zu Beginn des Buches werden Sie wie folgt begrüßt:

Obwohl nur wenige Leute wahrscheinlich einen Compiler für eine große Programmiersprache erstellen oder sogar beibehalten, kann der Leser die in diesem Buch besprochenen Ideen und Techniken für das allgemeine Software-Design gewinnbringend anwenden. Zum Beispiel wurden die String-Matching-Techniken zum Erstellen von lexikalischen Analysatoren auch in Texteditoren, Informationsabrufsystemen und Mustererkennungsprogrammen verwendet. Kontextfreie Grammatiken und Syntax-orientierte Definitionen wurden verwendet, um viele kleine Sprachen zu erstellen, wie die Satz- und Zeichenzeichensysteme, die dieses Buch hervorgebracht haben. Die Techniken der Codeoptimierung wurden in Programmverifizierern und in Programmen verwendet, die "strukturierte" Programme aus unstrukturiertem Code erzeugen.

Kurz gesagt, lernen Sie nicht nur, wie man einen Compiler erstellt. Sie werden auf dem Weg viele verschiedene untergeordnete Techniken lernen, um Sie bei der täglichen Programmierung zu unterstützen. Obwohl einige sagen, dass es ein veraltetes Buch ist, genieße ich es immer noch und ich würde es empfehlen, auch wenn das Lesen ein bisschen schwer werden kann. Wenn Sie es bekommen, lassen Sie eine Menge Zeit, um es zu lesen und zu verstehen.


Das ist wie die Frage "Ist es für einen Programmierer von Vorteil, mehr Programmierkenntnisse zu haben?". Das Einfache ist, dass ja, es ist vorteilhaft. Wie viel wird es von Tag zu Tag profitieren non-compiler-building Programmierung Angelegenheiten ist schwer zu erraten. Aber es wird Ihnen definitiv beibringen, wie die Interna von dem, was Sie tun, funktionieren, wie Sie Strings manipulieren, um Logik zu diktieren und Ihnen möglicherweise helfen, besser zu debuggen, egal was Sie verwenden.


Ich denke, es ist besser, aus Sicht des Wissens zu lernen. Zumindest können Sie in den vorhandenen Compiler-Quellcode schauen und die typischen Kompilierungsschritte und die Komplexität verstehen, die in jeder Phase der Kompilierung involviert sind.


In der heutigen Industrie, wenn du einen Compiler machen kannst, dann magst du ein 3-jähriges Kind, das lernt zu zählen (das ist die obere Grenze meiner Intelligenz, gibt mir einen IQ von 18, was das Feld angeht ); und es ist ebenso wichtig: Wie im Drachenbuch zitiert, definiert jede Anwendung mit einer Benutzerschnittstelle eine Programmiersprache.

Darüber hinaus verwenden neue Programmiersprachen wie zonnon und composita Syntax- gesteuerte Protokolle für die Kommunikation zwischen Live-Objekten. Sie definieren Protokolltypen, die die Schnittstelle zu einem Server-Thread als EBNF-Grammatik angeben. Das macht es unmöglich, die Message-Handler zu programmieren, wenn Sie keinen Compiler geschrieben haben!

Syntaxgesteuerte Protokolle sind der beste Weg, um mit Dingen wie Webservern umzugehen, die textbasierte Protokolle verwenden; so ist es sehr möglich, dass dies die Methode der Wahl wird. Allerdings beschränken beide Sprachen die Protokolle auf LL (1) Grammatiken (aus sehr offensichtlichen Gründen), und dies kann sich als zu restriktiv erweisen.

Während die aktuelle Implementierung von Zonnon noch ein bisschen auf der Glitch-Seite ist; und die Sprachdefinition scheint auch noch nicht abgeschlossen zu sein; Ich werde dennoch so kühn sein, dass zonnon (oder etwas Ähnliches) C # in den Mülleimer bringt, wo es hingehört, wenn sie diese Probleme ausbügeln können.

Composita ist eine faszinierende Sprache; aber in der realen Welt ist es sehr unerwünscht, dass jedes Objekt ein Live-Thread und jeder Funktionsaufruf eine Nachricht sein muss, da die Designer von Composita das Betriebssystem überschreiben mussten, um es schnell genug laufen zu lassen.

Das, was gesagt wurde, fällt mir schwer, indem ich mich wiederhole: Wenn das Programmieren von Serveranwendungen den Weg der EBNF-Protokolltypen einschlägt, dann sollten Sie am besten lernen, wie man einen Compiler schreibt.


Das Verständnis des Kompilierungsprozesses ist ein allgemeiner Ansatz, um zu verstehen, wie der Computer funktioniert, und bietet daher einen breiten Bereich des Verständnisses. Viele moderne Programmierer arbeiten in komplexen Umgebungen, die zumindest auf grundlegenden Ebenen wenig von diesem Verständnis erfordern. Ein Beispiel ist Java, das den Verknüpfungsschritt der Kompilierung vom Entwickler ausblendet.

Wissen ist Wissen, es ist fast immer nützlich. In meinem Fall fand ich den verständnisvollen Kompilierungsprozess außerordentlich nützlich, wenn es um Leistungsverbesserung ging, was meine Aufgabe ist. (Ich arbeite in einer Umgebung mit extrem niedriger Latenz)

Wenn Sie all Ihre Arbeit in PHP mySQL tun, ist das großartig. Denken Sie daran, dass alle Technologien veraltet sind und Sie die nächste große Sache verstehen müssen. Das "allgemeine Wissen" zu haben, wie die Kompilation zu verstehen, stellt einen konzeptionellen Puffer zwischen dir und jenen Shmucks bereit, die sich nicht anpassen können.

Lerne zu lernen.


Die Compiler-Programmierung ist vielschichtig, da sie den Code in logische Bäume zerlegt und dann Code in eine andere Form von Code übersetzt. Und möglicherweise analysiert die Eingabe, sobald sie in Bäumen für Optimierungen ist.

In einem runden Weg wird es jedem Programmierer helfen, weil Sie wissen, wie Anweisungen schneller interpretiert werden können, oder wie Sie einen Precompiler schreiben, um Makros für Ihre Sprache zu erstellen. Oder einfach nur, wie man diese flache Datei besser analysiert als Ihr Kollege.

Für die meisten scriptbasierten Sprachen, die keinen Compiler haben, können Sie Ihren täglichen Arbeitsablauf nicht viel optimieren, indem Sie lernen, wie man einen Compiler erstellt. Aber Sie werden immer noch das Parsen verstehen.


In gewisser Weise ist diese Frage sehr ähnlich wie "Soll ich C lernen?"

Wie andere bereits erwähnt haben, können einige Elemente eines Compilers - lexikalische Analyse, Parsing - in vielen anderen Anwendungen verwendet werden. Sie werden einige nützliche Techniken lernen, auch wenn Sie nie einen Compiler implementieren müssen.

Darüber hinaus vermittelt Ihnen die Code-Generierungsphase ein besseres Verständnis für die Funktionsweise des Computers. Sie werden sehen, wie die Algorithmen und Datenstrukturen aus übergeordneten Sprachen tatsächlich verarbeitet werden, wenn sie zur CPU (oder zur VM) gelangen. Dies sollte Ihnen helfen, bessere Algorithmen in Ihrer täglichen Programmierung zu schreiben.

Wenn Sie auch Ihre eigene Sprache entwerfen, dann lernen Sie viel durch den Prozess des Nachdenkens durch die Details, wie es funktionieren sollte, welche Kontrollflusselemente Sie benötigen, wie Ausdrücke analysiert werden sollten, welche Parameter der Reihenfolgefunktion sein sollten Lesen, usw. Dies sollte Ihnen ein besseres Verständnis von Sprachen im Allgemeinen vermitteln, was Sie zu einem besseren Programmierer in der von Ihnen verwendeten Sprache machen sollte.

Schließlich besteht immer die Möglichkeit, dass Sie sich in einer alten Sprache, die nicht mehr unterstützt wird, mit einer Legacy-Anwendung festsetzen. Die einfachste Möglichkeit, neue Funktionen hinzuzufügen, besteht darin , einen eigenen Compiler zu erstellen, um die Sprache zu erweitern.


Ich habe zwei Compiler-Kurse an der Universität gemacht und fand sie nützlich, weil:

  • Das Schreiben eines Compilers erfordert Kenntnisse in vielen Bereichen der Informatik - reguläre Ausdrücke, kontextfreie Grammatiken, Syntaxbäume, Graphen usw. Es kann Ihnen helfen zu sehen, wie man die Theorie der Informatik auf reale Probleme anwendet.
  • Wenn Sie verstehen, wie ein Compiler Code generiert und optimiert, werden Sie weniger Zeit damit verschwenden, selbst törichte "Optimierungen" vorzunehmen.
  • Der Prozess des Scannens / Lexings einer Datei und des Aufbaus eines Syntaxbaums ist auf eine viel größere Anzahl von Problemen anwendbar, als nur einen Compiler zu erstellen.
  • Hilft Programmiersprachen zu "verallgemeinern" - sobald Sie sehen, dass jede Programmiersprache am Ende als Maschinencode endet, erleichtert es das Erlernen neuer Sprachen, weil Sie sehen, dass jede Sprache nur eine andere Art ist, die gleichen Grundideen auszudrücken.

Einige Leute würden dem entgegenhalten, dass es nützlichere Dinge gibt, die du mit deiner Zeit machen könntest, wie zum Beispiel eine populäre Programmiersprache oder Bibliothek zu lernen, die dir helfen könnte, einen Job zu bekommen (dieses Argument wird oft als Grund dafür benutzt, Assemblersprache nicht zu lernen). Wenn man jedoch weiß, wie Compiler funktionieren, wird es wahrscheinlich leichter sein, neue Programmiersprachen zu lernen (siehe Punkt 4).


Ich habe kürzlich eine unabhängige Studie über das, was wir Language Processing nannten, gemacht (mein letztes Projekt war nicht so sehr ein Compiler wie ein C ++ - Dateiparser / Interpreter mit compilerähnlichen Features). Ich wurde gebeten, das oben erwähnte Buch "Dragon" zu verwenden. Ich dachte, dass dies als Softwareentwickler eines der wichtigeren Dinge war, die ich in meiner College-Karriere gemacht habe. Ich fand es nicht nur interessant und lohnend für meinen eigenen persönlichen Nutzen, sondern es ermöglichte mir auch, tiefer in die Sprache zu schauen. Da das Dragon-Buch nicht sprachspezifisch ist, hat es mir geholfen, die Gemeinsamkeiten und vor allem die Gründe für die Unterschiede in den verschiedenen Sprachen zu verstehen. Ich stimme jedoch der Tatsache zu, dass nicht alle Programmierer es für notwendig halten. Aber im Bereich der Softwareentwicklung denke ich, dass es sehr hilfreich sein kann, Compiler anzusehen, wenn Sie ein Interesse daran haben, Ihr Verständnis von Sprachdesign zu erweitern.





compiler-construction