Ist ein Parse-Baum dasselbe wie Bytecode?

8

Was genau ist der Unterschied zwischen Bytecode und einem Parsebaum, insbesondere der von Perl? Beziehen sie sich tatsächlich auf dasselbe Konzept oder gibt es einen Unterschied?

Ich kenne das Konzept von Bytecode aus Python und Java, aber wenn ich über Perl lese, habe ich gelernt, dass es angeblich einen Syntaxbaum (statt Bytecode) in seinem Interpreter ausführt.

Wenn es tatsächlich eine Unterscheidung gibt, aus welchen Gründen verwendet Perl keinen Bytecode (oder Python verwendet keine Syntaxbäume)? Ist es hauptsächlich historisch oder gibt es Unterschiede zwischen den Sprachen, die ein anderes Kompilierungs- / Ausführungsmodell erfordern? Könnte Perl (mit vertretbarem Aufwand und Ausführungsleistung) mit einem Bytecode-Interpreter implementiert werden?

    
lxgr 02.05.2012, 15:21
quelle

2 Antworten

9

Was Perl verwendet, ist kein Parse-Tree , zumindest nicht wie Wikipedia es definiert. Es ist ein Opcode-Baum.

%Vor%

Außer, obwohl es ein Baum ist, ist es nicht wirklich ein Baum. Beachte die Pfeile? Es ist, weil es eigentlich ein listenartiger Graph von Opcodes ist (wie jede andere ausführbare Datei).

%Vor%

Der Unterschied zwischen den Opcodes von Perl und den Bytecodes von Java besteht darin, dass Javas Bytecodes serialisiert werden können (gespeichert in einer Datei).

    
ikegami 02.05.2012, 15:35
quelle
7

Parse tree ist das Token eines Programms, das in einer Struktur gespeichert ist, die ihre Verschachtelung anzeigt (welche Argumente zu welchen Funktionsaufrufen gehören, welche Anweisungen innerhalb welcher Schleifen usw. stehen), während Bytecode der in eine binäre Notation umgesetzte Programmcode ist schnellere Ausführung in einer virtuellen Maschine. Zum Beispiel, wenn Sie den folgenden Code in einer imaginären Sprache hätten:

%Vor%

Der Parse-Baum sieht beispielsweise wie folgt aus:

%Vor%

Der Bytecode in roher und symbolischer Form, der für eine stack-orientierte virtuelle Maschine kompiliert wurde, könnte so aussehen:

%Vor%

Wenn Sie ein Programm kompilieren, müssen Sie zuerst den Quellcode analysieren (in der Regel einen Syntaxbaum erzeugen) und ihn dann in Bytecode umwandeln. Es kann einfacher sein, den zweiten Schritt zu überspringen und direkt vom Parserbaum auszuführen. Auch wenn die Sprachsyntax sehr haarig ist (zum Beispiel erlaubt es das Ändern des Codes), wird das Erzeugen des Bytecodes komplizierter. Wenn es eine Eval-Typ-Funktion gibt, um irgendeinen Code auszuführen, muss der gesamte Compiler mit der Anwendung verteilt werden, um die virtuelle Maschine für diesen Code zu verwenden. Es ist einfacher, nur einen Parser einzubinden.

In Perl 6, der nächsten Perl-Version, soll der Code in Bytecode kompiliert und auf der Parrot Virtual Machine ausgeführt werden. Es wird erwartet, dass die Leistung verbessert wird. Bytecode lässt sich relativ einfach zu den nativen Anweisungen des Prozessors kompilieren (dies wird als JIT-Compiler bezeichnet), um die Geschwindigkeit kompilierter Sprachen wie C zu erreichen.

    
jjrv 02.05.2012 15:25
quelle

Tags und Links