2009-05-29 8 views
18

Ich habe untersucht, wie Programmiersprachen arbeiten, und einige von ihnen haben eine so genannte virtuelle Maschinen. Ich verstehe, dass dies eine Form der Emulation der Programmiersprache in einer anderen Programmiersprache ist, und dass es so funktioniert, wie eine kompilierte Sprache mit einem Stapel ausgeführt würde. Habe ich das richtig verstanden?Wie funktioniert eine virtuelle Maschine?

Mit dem Vorbehalt, dass ich tat, was mich verwirrt ist, dass viele nicht-kompilierte Sprachen Variablen mit "liberalen" Systemen erlauben. In Python zum Beispiel kann ich schreiben:

x = "Hello world!" 
x = 2**1000 

Strings und große ganze Zahlen völlig unabhängig sind und unterschiedliche Mengen an Speicherplatz im Speicher belegen, so wie kann dieser Code auch in einer Stack-basierten Umgebung dargestellt werden? Was genau passiert hier? Ist x auf einen neuen Platz auf dem Stack und die alten String-Daten nicht referenziert? Verwenden diese Sprachen keinen Stapel? Wenn nicht, wie repräsentieren sie intern Variablen?

+4

Große erste Frage! – samoz

+0

In Verbindung stehende Frage: http://stackoverflow.com/questions/688803/how-does-aregister-based-virtual-machine-work – lothar

Antwort

7

Wahrscheinlich sollte Ihre Frage als "Wie funktioniert dynamische Sprachen arbeiten?"

Das ist einfach, sie speichern die Informationen des variablen Typs zusammen mit ihm im Speicher. Und das nicht nur in interpretierten oder JIT-kompilierten Sprachen, sondern auch in nativ kompilierten Sprachen wie Objective-C.

+0

Aha, ich sehe. Aber was passiert bei der Neuzuweisung? Wenn die neuen Daten größer sind als die alten, wo werden sie platziert und was wird aus den alten Daten? – Martin

+2

Der tatsächliche Inhalt des Objekts könnte an anderer Stelle gespeichert werden und nur eine Referenz würde an Ort und Stelle gespeichert werden. Es gibt viele Techniken, um eine dynamische Sprache zu implementieren. Was wirklich passiert, hängt von der jeweiligen Implementierung Ihrer Sprache ab. –

+0

http://en.wikipedia.org/wiki/Dynamic_typing#Dynamic_typing –

2

In den meisten VM-Sprachen können Variablen als Zeiger (oder Referenzen) auf Speicher im Heap konzipiert werden, auch wenn die Variable selbst auf dem Stapel liegt. Für Sprachen mit primitiven Typen (z. B. int und bool in Java) können diese auch auf dem Stapel gespeichert werden, sie können jedoch nicht dynamisch neue Typen zugewiesen werden.

Beim Ignorieren primitiver Typen werden alle Variablen, die im Stapel vorhanden sind, mit ihren tatsächlichen Werten im Heap gespeichert. Wenn Sie ihnen einen Wert dynamisch zuweisen, wird der ursprüngliche Wert daher verworfen (und der Speicher wird über einen Garbage Collection-Algorithmus bereinigt), und der neue Wert wird in einem neuen Speicherbit zugewiesen.

+0

Warum wird der Stapel überhaupt verwendet, wenn er nur Zeiger auf den Heap enthält? Wäre es nicht schlauer, Zeiger intern zu speichern und den ganzen Stack-Ansatz zu überspringen? – Martin

+0

Der Stack wird für rekursive Aufrufe benötigt. Wenn eine Funktion sich selbst aufruft, benötigt sie eine neue Menge von Variablen, oder Sie überschreiben die Variablen des äußeren Aufrufs derselben Funktion. Sie benötigen eine Art Stack, damit Sie wissen, dass die letzten Variablen die aktuellen Operationen sind. Es ist auch nützlich als "Scratch Space", um temporäre Ergebnisse von Ausdrücken zu behalten. – uliwitness

1

Der Schlüssel zu vielen, wie VMs mit Variablen wie diesem oder diesem umgehen, liegt in den Metadaten ... Die Meta-Informationen, die gespeichert und dann aktualisiert werden, geben der VM einen besseren Überblick darüber, wie sie zugeordnet und dann ausgeführt werden das Richtige mit Variablen.

In vielen Fällen ist dies die Art von Overhead, die der Leistung wirklich im Weg stehen kann. Moderne Implementierungen usw. haben jedoch einen langen Weg zurückgelegt, um das Richtige zu tun.

Was Ihre spezifischen Fragen angeht - die Behandlung von Variablen als Vanilla-Objekte/etc ... läuft darauf hinaus, Meta-Informationen zu neuen Zuweisungen neu zuzuweisen/neu zu bewerten - deshalb kann x in eine Richtung und dann in die nächste schauen.

1

Um einen Teil Ihrer Fragen zu beantworten, würde ich eine google tech talk about python empfehlen, in der einige Ihrer Fragen zu dynamischen Sprachen beantwortet werden; zum Beispiel, was eine Variable ist (es ist kein Zeiger, noch eine Referenz, aber im Falle von Python ein Label).

2

Die VM hat nichts mit der Sprache zu tun. Jede Sprache kann auf einer VM ausgeführt werden (die Java VM hat bereits Hunderte von Sprachen).

Eine VM ermöglicht die Ausführung einer anderen Art von "Assemblersprache", die besser zur Anpassung eines Compilers geeignet ist. Alles, was in einer VM erledigt wird, könnte in einer CPU erledigt werden, also denke an die VM wie eine CPU. (Einige sind tatsächlich in Hardware implementiert).

Es ist extrem niedriges Niveau und in vielen Fällen stark stack-basiert - anstelle von Registern ist die Mathematik auf Maschinenebene relativ zu Positionen relativ zum aktuellen Stapelzeiger.

Bei normalen kompilierten Sprachen sind viele Anweisungen für einen einzigen Schritt erforderlich. a + könnte aussehen wie: "Nimm das Item von einem Punkt relativ zum Stack Pointer in reg a, schnapp dir ein anderes in reg b. füge reg a und b hinzu. setze reg a in eine Position relativ zum Stack Pointer.

VM tut dies alles mit einer einzigen, kurzen Anweisung, möglicherweise ein oder zwei Bytes anstelle von 4 oder 8 Bytes PER INSTRUCTION in Maschinensprache (abhängig von der 32- oder 64-Bit-Architektur), was ungefähr 16 oder 32 Bytes von x86 bedeuten sollte 1-2 Bytes von Maschinencode. (ich könnte falsch sein, mein letzten x86 Codierung war in der 80286-Ära.)

Microsoft verwendet (wahrscheinlich immer noch verwendet) VMs in ihren office-Produkten die Menge an Code zu reduzieren.

Das Verfahren für cr Das Essen des VM-Codes ist das Gleiche wie das Erstellen einer Maschinensprache, im Wesentlichen nur ein anderer Prozessortyp.

VMs können auch eigene Sicherheitsmechanismen, Fehlerbehebungs- und Speichermechanismen implementieren, die eng mit der Sprache verbunden sind.

Einige meiner Beschreibung hier ist Zusammenfassung und aus dem Gedächtnis. Wenn Sie die Bytecode-Definition selbst erkunden wollen, ist es ein bisschen Spaß:

http://java.sun.com/docs/books/jvms/second_edition/html/Instructions2.doc.html