2009-03-06 10 views
3

Ok Leute, ich dachte, ich würde meine alten CS-Notizen nehmen und Compiler-Theorie ein wenig mehr durchsehen. Ich muss sagen, ich kann mich nicht für das Leben in mir erinnern, wie all das funktioniert, aber ich habe eine schöne Beispielanwendung aus meiner Collegezeit, die mir hilft, ein paar Dinge zu verstehen.Kompilieren Interpreter tatsächlich im Speicher?

Diese Beispielanwendung verwendet die erstellte Sprache und kompiliert sie zu einem Zwischenbaugruppencode wie Sprache. Es gibt dann eine einfache VM-Implementierung, die diese Zwischensprache verwendet und die Anweisungen ausführt.

Die Sache, die ich nicht verstehen kann, ist, wenn ich dies ein Straight-up-Interpreter und kein Compiler wäre, würde es immer noch diese Zwischenmitteilungen im Speicher aufbauen, um am Ende ausgeführt zu werden. Oder "führt" ein Interpreter tatsächlich dezente Abschnitte der Code-Chunks gleichzeitig aus?

+0

Sie meinen "Interpreter" anstelle von "Parsern" "Im Titel, richtig? –

+0

Danke dafür :-). – Owen

Antwort

1

Parser kompilieren nicht. Beim Übersetzen eines Programms (von einer Hochsprache wie C++ in Maschinencode) sind tatsächlich einige Schritte erforderlich. Es hängt vom Design ab, ob es in einem Durchgang oder nach mehreren Durchläufen über die Eingabe ausgeführt wird. Können Sie Ihre Frage etwas genauer formulieren? In der Zwischenzeit, wie sehr Sie es auch hassen, schauen Sie sich here an - speziell das Frontend und Backend.

+0

Danke für Ihre Hilfe, kennen Sie einen einfachen C#/Java-Interpreter, den ich mir ansehen könnte? – Owen

+0

Sie haben einige sehr komplexe Sprachen ausgewählt. Fang mit etwas Einfachem an. Darf ich eine stapelbasierte Sprache wie PostScript oder Factor vorschlagen? – dirkgently

+0

Zumindest ein Schreibtischrechner. – dirkgently

4

Es hängt von der Sprache ab. Die meisten modernen interpretierten Sprachen (Perl, Python und Ruby, um nur einige zu nennen) kompilieren den Quellcode in ein Zwischenformular, das am Ende ausgeführt wird (citation).

+0

Gibt es eine Alternative? Mein Ziel ist es, einen sehr, sehr einfachen Sprachparser zu schreiben und der Gedanke, mit IL zu kompilieren, scheint irgendwie übertrieben zu sein. – Owen

+0

Das Problem ist, dass Sie * etwas * brauchen, um Ihre geparsten Befehle auszuführen. Dies ist, was Perl, Python und Java für Sie tun. Die einzigen Alternativen, die ich kenne, sind das Kompilieren, um Code zu bearbeiten oder einen vorhandenen "Interpreter" (wie die JVM) zu targetieren. –

+0

Nicht sicher, ob ich dir folge. Was ich meine, ist, dass Java-VMs Javas IL intervenieren. Aber wenn Ihre Kernsprache bereits sehr einfach ist, warum sollte dann ein IL überhaupt benötigt werden? – Owen

1

Die meisten modernen Interpreter analysieren Programm auf Zwischencode, der später interpretiert wird. Einige speichern diesen Zwischencode explizit (z. B. Pythons .pyc). Es gibt zum Beispiel Ausnahmen, Shell-Skripte werden direkt interpretiert und nicht im Zwischenformat geparst.

Einige fortgeschrittenere "Interpreter" interpretieren tatsächlich nicht, sondern JIT (Just-in-Time) Compiling (zB Java oder .NET).

3

Ich habe geschrieben oder mit Interpretern gearbeitet, die direkt auf Parsing-Token in der Eingabe wirken, die direkt auf einen vom Parser erstellten Abstract-Syntax-Tree (AST) wirken und den AST in ein für eine effiziente Ausführung entworfenes Formular übersetzen . Also die Antwort ist, es hängt.

  • Wenn Ihre Zielmaschine 8K RAM hat, wäre ein direkter Parsing-Interpreter eine vernünftige Wahl (denke FORTH).
  • Wenn Sie Interpreter verwenden, um etwas über die Struktur und Semantik von Programmiersprachen zu lernen oder zu lernen, ist der Aufbau und die Interpretation eines AST eine gute Wahl.
  • Wenn Sie einen Interpreter für die Portabilität verwenden und eine schnelle Ausführung wünschen, ist das Kompilieren zu einer registerbasierten virtuellen Maschine eine gute Wahl. (David Gregg und andere haben gezeigt, dass es in einer registerbasierten VM wie der Lua VM weniger interpretativen Overhead gibt als in einer stackbasierten VM wie der Java VM.)
  • +0

    Darf ich hinzufügen, dass Parrot irgendwie populär und neu und glänzend zu sein scheint und auch eine registerbasierte VM ist? Eine gute Idee für eine VM, um sie vielleicht zu erreichen. –