Frage

Ich habe darüber nachdachte, wie Programmiersprachen arbeiten, und einige von ihnen haben einen so genannten virtuellen Maschinen. Ich verstehe, dass diese in einer anderen Programmiersprache irgendeine Form der Emulation der Programmiersprache ist, und dass es funktioniert, wie, wie eine kompilierte Sprache ausgeführt werden würde, mit einem Stapel. Habe ich das richtig zu machen?

Mit der Maßgabe, dass ich es tue, was mir bamboozles ist, dass viele nicht-kompilierten Sprachen Variablen mit „liberal“ Typ-Systemen ermöglichen. In Python zum Beispiel kann ich dies schreibe:

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

Strings und große ganze Zahlen sind völlig unabhängig und unterschiedlich viele Platz im Speicher belegt, so wie kann dieser Code auch in einer Stack-basierten Umgebung dargestellt werden? Was genau geschieht hier? Ist x an einen neuen Ort auf dem Stapel und die alten Kettendaten links unreferenced spitz? Haben diese Sprachen nicht einen Stapel verwenden? Wenn nicht, wie Sie repräsentieren sie Variablen intern?

War es hilfreich?

Lösung

Wahrscheinlich sollte Ihre Frage so betitelt werden „Wie dynamische Sprachen Arbeit ?.“

Das ist ganz einfach, sie speichern den Variablentyp Informationen zusammen mit ihm in Erinnerung. Und dies nicht nur in interpretiert oder JIT kompilierten Sprachen durchgeführt, sondern auch nativ kompilierten Sprachen wie Objective-C.

Andere Tipps

In den meisten VM Sprachen können Variablen als Zeiger (oder Referenzen) werden konzipiert, um Speicher im Heap, auch wenn die Variable selbst auf dem Stapel ist. Für Sprachen, die primitiven Typen (int und bool in Java, zum Beispiel) haben diese ebenfalls auf dem Stapel gespeichert werden kann, aber sie können keine neue Typen dynamisch zugewiesen werden.

Das Ignorieren primitive Typen, alle Variablen, die auf dem Stack vorhanden sind ihre tatsächlichen Werte in dem Heap gespeichert. Wenn Sie also dynamisch ihnen ein Wert zuweisen, wird der ursprüngliche Wert aufgegeben (und der Speicher über einige Garbage Collection Algorithmus bereinigt) und der neue Wert wird in einem neuen Bit Speicher zugeordnet.

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

Eine VM ermöglicht eine andere Art von „Assemblersprache“ ausgeführt werden, eine, die auf die Anpassung eines Compilers, um mehr geeignet ist. Alles, was in einer VM getan konnte in einer CPU durchgeführt werden, so denken Sie an die VM wie eine CPU. (Einige sind tatsächlich in Hardware implementiert).

Es ist extrem niedriges Niveau, und in vielen Fällen stark basierend stapeln - anstelle von Registern, maschinennahen Mathematik ist alles relativ zu Positionen in Bezug auf die aktuellen Stapelzeiger

.

Bei normalen kompilierten Sprachen, viele Anweisungen für einen einzigen Schritt erforderlich. a + wie „Greifen Sie das Objekt von einem Punkt relativ aussehen könnte auf den Stapelzeiger in reg a, greifen andere in reg b. hinzuzufügen reg a und b. legt eine reg in einen Ort relativ zu dem Stapelzeiger.

Die VM tut dies alles mit einer einzigen, kurzen Instruktion, möglicherweise einem oder zwei Bytes anstelle von 4 oder 8 Bytes pro Anweisung in Maschinensprache (in Abhängigkeit von 32- oder 64-Bit-Architektur), die (erraten) sollten bedeuten, etwa 16 oder 32 x86-Bytes für 1-2 Bytes Maschinencode. (Ich könnte falsch sein, meine letzte x86-Codierung war in der 80286-Ära.)

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

Das Verfahren des VM-Code für die Erstellung der gleiche wie die Schaffung Maschinensprache ist, nur ein anderer Prozessortyp im Wesentlichen.

VMs können auch ihre eigene Sicherheit, Fehlerbehebungs und Speichermechanismen implementieren, die auf die Sprache sehr eng verwandt sind.

Einige meiner Beschreibung ist hier Zusammenfassung und aus dem Speicher. 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

Der Schlüssel zu vielen der ‚wie VMs Variablen wie damit umgehen oder dass‘ kommt wirklich auf Metadaten ... Die Meta-Informationen gespeichert und dann aktualisiert gibt die VM eine viel besser in den Griff, wie zuweisen und dann tun die richtige mit Variablen.

In vielen Fällen ist dies die Art von Overhead, der in der Art der Leistung wirklich bekommen. Doch moderne Implementierungen, etc. haben einen langen Weg, um das Richtige zu tun.

Wie für Ihre speziellen Fragen - Variablen wie Vanille Objekte Behandlung / etc ... kommt auf die Neuzuweisung / reevaluating Meta-Informationen über neue Aufgaben - das ist, warum x einen Weg suchen und dann die nächste.

einen Teil Ihrer Fragen zu beantworten, würde ich ein google TechTalk über Python , wobei einige Ihrer Fragen zur dynamischen Sprachen beantwortet werden; zum Beispiel, was eine Variable ist (es ist kein Zeiger, noch ein Hinweis, aber im Fall von Python eines Etikett).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top