Frage

Was genau sind die Vorteile und Nachteile der Verwendung einer registerbasierten virtuelle Maschine im Vergleich zu einer Stack-basierten virtuellen Maschine?

Für mich scheint es, als ob ein Register-basierte Maschine mehr sein würde, geradlinig zu programmieren und effizienter zu gestalten. Also warum ist es, dass der JVM, die CLR und der Python-VM sind all Stack-basierte?

War es hilfreich?

Lösung

Dies wird bereits beantwortet wurde, auf ein bestimmtes Niveau, in dem FAQ Parrot VM und zugehörigen Dokumenten: A Parrot Übersicht Der entsprechende Text aus diesem Dokument ist folgende:

  

Die Parrot VM eine Registerarchitektur haben, anstatt eine Stack-Architektur. Es wird auch mit extrem niedrigem Niveau Operationen ähnliche Java als die mittleren Ebene ops von Perl und Python und dergleichen hat.

     

Die Begründung für diese Entscheidung ist in erster Linie, dass die zugrunde liegende Hardware zu einem gewissen Grad von ähneln, ist es möglich Parrot Bytecode effiziente nativen Maschinensprache zu kompilieren nach unten.

     

Darüber hinaus sind viele Programme in Hochsprachen bestehen aus verschachtelten Funktion und Methodenaufrufe, manchmal mit lexikalischen Variablen Zwischenergebnissen zu halten. Unter nicht-JIT-Einstellungen, ein Stack-basierter VM wird und dann taucht die gleichen Operanden oft drücken, während eine registerbasierte VM einfach die richtige Menge von Registern zuweisen und arbeitet auf sie, was signifikant die Menge an Operationen reduzieren und CPU-Zeit.

Sie können auch diese lesen: Register vs Stacks für Dolmetscher Design Zitiert es ein bisschen:

  

Es gibt keinen wirklichen Zweifel, es ist einfacher, Code für eine Stapelmaschine zu erzeugen. Die meisten Erstsemester Compiler Studenten kann das tun. Generieren von Code für eine Registermaschine ist ein bisschen härter, wenn Sie es als Stapelmaschine mit einem Speicher sind zu behandeln. (Was ist machbar, wenn auch etwas weniger als ideal aus anwendungstechnischer Sicht) Einfachheit der Ausrichtung ist nicht so große Sache, zumindest für mich nicht teilweise, weil so wenige Menschen tatsächlich gehen direkt darauf zielen - ich meine, komm, wie viele Menschen kennen Sie, die tatsächlich versuchen, einen Compiler für etwas jemand schreiben würde über jemals kümmern? Die Zahlen sind klein. Das andere Problem ist, dass viele der Leute mit Compiler Wissen bereits komfortable Targeting-Register Maschinen sind, wie das ist, was alle Hardware-CPUs gemeinsam verwendet werden.

Andere Tipps

in Hardware implementiert, eine registerbasierte Maschine effizienter sein wird, nur weil es weniger Zugriffe auf den langsameren RAM sind. In der Software wird jedoch auch ein Register basierte Architektur höchstwahrscheinlich die „Register“ im RAM. Ein Stapel basierte Maschine wird ebenso effizient in diesem Fall sein.

Zusätzlich wird ein Stack-basierten VM wird es viel einfacher machen Compiler zu schreiben. Sie müssen nicht mit Register Allocation-Strategien befassen. Sie haben im Wesentlichen eine unbegrenzte Anzahl von Registern mit zu arbeiten.

Update: Ich schrieb diese Antwort eine interpretierte VM angenommen. Es kann nicht für einen JIT kompilierten VM wahr halten. Ich lief über dieses Papier die, dass ein JIT, um anzuzeigen, scheint zusammengestellt VM kann effizienter mit einer Registerarchitektur sein.

Traditionell Implementierer haben virtuelle Maschine begünstigt Stack-basierten Architekturen über registerbasierte aufgrund Einfachheit der VM Implementierung 'Leichtigkeit eines Compilers Back-End zu schreiben - die meisten VMs sind ursprünglich eine einzige Sprache und Codedichte und ausführbare Dateien hosten für Stack-Architektur sind immer kleiner als ausführbare Dateien für die Registerarchitekturen. Die Einfachheit und die Codedichte sind eine Kosten der Leistung.

Studien haben gezeigt, dass eine registrierte basierte Architektur durchschnittlich 47% weniger ausgeführt VM-Anweisungen als Stack-basierte Architektur erfordert, und der Register-Code ist 25% größer als Stack-Code entspricht, aber dieser Anstieg Kosten von mehr VM Abrufen von Befehlen durch zu größeren Codegröße handelt sich nur um 1,07% zusätzliche reale Maschine Lasten pro VM-Instruktion, die vernachlässigbar ist. Die Gesamtleistung des registerbasierte VM ist, dass es dauert im Durchschnitt 32,3% weniger Zeit Standard-Benchmarks auszuführen.

Ein Grund für den Aufbau von Stack-basierten VMs besteht darin, dass, dass die tatsächliche VM Opcodes kleine und einfacher sein kann (keine Notwendigkeit zu kodieren / dekodieren Operanden). Dies macht den generierten Code kleiner und macht auch die VM-Code einfacher.

Wie viele Register brauchen Sie?

Ich werde wahrscheinlich brauchen mindestens eine mehr als das.

Es ist mir nicht klar, dass eine „Register-basierte“ virtuelle Maschine „mehr geradlinig zu programmieren“ oder „effiziente“ sein würde. Vielleicht denken Sie, dass die virtuellen Register einen Kurzschnitt während der JIT-Kompilierung Phase bieten würde? Dies wäre sicherlich nicht der Fall sein, da der eigentliche Prozessor mehr oder weniger Register als die VM kann, und diese Register können auf verschiedene Weise verwendet werden. (Beispiel: Werte, die dekrementiert werden in den ECX bestplatzierten registrieren auf x86-Prozessoren.) Wenn die reale Maschine mehr Register als die VM hat, dann sind Sie verschwenden Ressourcen, weniger, und Sie haben nichts gewonnen „Register mit -basierte“Programmierung.

Stack-basierte VMs sind einfacher und der Code ist viel kompakter. Als Beispiel aus der Praxis, baute ein Freund (vor etwa 30 Jahren) mit einem Datenerfassungssystem mit einem Homebrew Forth VM auf einem Cosmac. Die Forth VM betrug 30 Bytes von Code auf einer Maschine mit 2k ROM und 256 Byte RAM.

Stapel basierte VMs sind leichter zu generieren Code für.

Register basierte VMs einfacher ist für schnelle Implementierungen zu schaffen und einfacher für hochoptimierten Code zu generieren.

Für Ihren ersten Versuch, empfehle ich mit einem Stapel ausgehend auf Basis VM.

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