2016-05-19 19 views
1

Wie ich untersuchte, gibt es 2 große Möglichkeiten Prozess VM zu implementieren:Warum stackbasierte VM? Warum nicht eine queue-basierte VM?

  • Stack-basierte, wie JVM, CLR usw.
  • oder registerbasierte, wie Lua, Dalvik, usw.

Registerbasierter Ansatz imitiert die Architektur physikalischer Prozessoren. Aber für den Stack-basierten Ansatz gibt es viele andere Datenstrukturen.

Ich denke, welcher Ansatz zu wählen, hängt hauptsächlich davon ab, wie wir Operanden speichern/holen wollen. Warum also Stapel wählen? Wie steht es mit einer warteschlangenbasierten VM? Oder andere Optionen wie die verknüpfte Liste?

+0

Eine warteschlangenbasierte VM klingt interessant. Ich denke, das Problem ist; Wie würde das überhaupt funktionieren? Ich denke, wenn Sie sich setzen und über die Implementierungsdetails nachdenken, werden Sie schnell herausfinden, warum andere Strukturen nicht funktionieren würden, obwohl ich mich irren könnte. In diesem Fall hätten Sie vielleicht eine neue Art der Verarbeitung erfunden. –

Antwort

2

StackOverflow ist wirklich nicht für meinungsbasierte Vermessung; es ist wahrscheinlich geschlossen.

Es ist jedoch wichtig zu erkennen, dass prozessorspezifische Architekturen im Allgemeinen Register verwenden, da dies der Funktionsweise der Prozessoren entspricht. Jeder Befehlssatz hat einen festen Satz von Registern verfügbar, und unterschiedliche Architekturen haben unterschiedliche Beträge. Darüber hinaus haben einige Register spezifische Bedeutungen basierend auf der Plattform oder ABI.

Eine generische Assemblydatei ist dann schwierig zwischen Plattformen zu portieren; oder, wenn Sie können, Sie enden mit dem Minimum, das möglich ist, und deshalb Optimierungen auslassen, die auf breitere Anweisungen anwendbar sein können. Einer der Vorteile von 64-Bit-Prozessoren ist nicht so sehr die zusätzliche Breite, sondern die erhöhte Anzahl von Registern, die in der ISA verfügbar sind.

Es gibt zwei Möglichkeiten, dies zu lösen; entweder eine unendliche Registersatzmenge annehmen und dann eine Registerzuordnung bereitstellen, wenn sie für eine spezifische Architektur übersetzt wird (z. B. verwendet LLVM einen unendlichen Registersatz in seiner ISA, der dann auf spezifische Register auf der realen ISA abgebildet wird) oder einen Stapel verwendet. Ein Vorteil der Verwendung eines Stapels besteht darin, dass Sie sich nicht mit dem speziellen Fall befassen müssen, dass die Register verschüttet werden, wenn Sie leer sind (z. B. haben Sie eine Funktion, die 10 Register haben soll, Ihre ISA aber nur 5). Stacks sind sehr gut bei der Darstellung von unendlichen Einträgen (modulo die Menge an verfügbarem Speicher, natürlich.)

Das heißt, (echte) Stapel sind langsamer - effektiv ignorieren Sie echte Register, wenn Sie das verwenden. Daher werden normalerweise Register für die Geschwindigkeit verwendet, und Stapel werden für Dinge verwendet, die nicht in die Register passen.

Wie auch immer - die VM-Codes verwenden einen Stack, weil Anweisungen wie push und pop nur einzelne Werte behandeln, während registerbasierte Befehle typischerweise Bitflags in der Opcode-Codierung verwenden, um anzugeben, welches der N-Register verwendet werden soll. Wenn Sie also eine stack-basierte ISA definieren, erhalten Sie eine unbegrenzt flexible Menge von Datenpunkten, und der Interpreter/JIT kann diese dann bei Bedarf in bestimmte Register übersetzen - was LLVM während der Kompilierung zu Laufzeitoptimierungen macht. Dadurch können Java-Programme, die auf 64-Bit-Systemen laufen, automatisch den größeren Registersatz aufnehmen, ohne dass eine Neukompilierung von 32 Bit ausgeführt werden muss - und Sie erhalten die breiteren Register, die automatisch gesetzt werden.

Der "Stack" ist hier eher ein logisches Konzept als eine bestimmte Datenstruktur. Es wäre nicht wirklich sinnvoll, nicht zusammenhängende nicht wachsende Datenstrukturen zu verwenden. Stacks werden speziell verwendet, weil das Aufrufen einer neuen Subroutine/function/Methode normalerweise einen neuen 'stack' Space erzeugt. Daher kehren Sie immer von dieser Subroutine zurück, bevor Sie von der umschließenden Methode zurückkehren Warteschlange ist hier nicht relevant). Aus diesem Grund erhalten Sie StackOverflow-Ausnahmen und warum diese Site als StackOverflow und nicht als QueueOverflow bezeichnet wird.

+0

Der * First Call Last Return Natur * von aufrufenden Unterprogrammen * natürlich * passt in eine logische FILO Struktur wie Stack. – smwikipedia