Ich bin gespannt, warum Sun beschlossen hat, die JVM stapelbasiert zu machen, und Google beschlossen hat, die DalvikVM registrierungsbasiert zu machen.
Ich nehme an, die JVM kann nicht wirklich davon ausgehen, dass eine bestimmte Anzahl von Registern auf der Zielplattform verfügbar ist, da sie plattformunabhängig sein soll. Daher verschiebt es einfach die Registerzuordnung usw. an den JIT-Compiler. (Korrigieren Sie mich, wenn ich falsch liege.)
Also dachten die Android-Leute: "Hey, das ist ineffizient, lass uns gleich eine registrierungsbasierte VM wählen ..."? Aber warten Sie, es gibt mehrere verschiedene Android-Geräte. Auf wie viele Register hat der Dalvik abgezielt? Sind die Dalvik-Opcodes für eine bestimmte Anzahl von Registern fest codiert?
Haben alle aktuellen Android-Geräte auf dem Markt ungefähr die gleiche Anzahl von Registern? Oder wird während des Dex-Ladens eine Neuzuweisung des Registers durchgeführt? Wie passt das alles zusammen?
Antworten:
Es gibt einige Attribute einer stapelbasierten VM, die gut zu den Entwurfszielen von Java passen:
Ein stapelbasiertes Design macht nur sehr wenige Annahmen über die Zielhardware (Register, CPU-Funktionen), sodass es einfach ist, eine VM auf einer Vielzahl von Hardware zu implementieren.
Da die Operanden für Anweisungen weitgehend implizit sind, ist der Objektcode tendenziell kleiner. Dies ist wichtig, wenn Sie den Code über eine langsame Netzwerkverbindung herunterladen möchten.
Die Verwendung eines registergestützten Schemas bedeutet wahrscheinlich, dass der Codegenerator von Dalvik nicht so hart arbeiten muss, um performanten Code zu erzeugen. Das Laufen auf einer extrem registerreichen oder registerarmen Architektur würde Dalvik wahrscheinlich behindern, aber das ist nicht das übliche Ziel - ARM ist eine Architektur mitten auf der Straße.
Ich hatte auch vergessen, dass die ursprüngliche Version von Dalvik überhaupt keine JIT enthielt. Wenn Sie die Anweisungen direkt interpretieren möchten, ist ein registergestütztes Schema wahrscheinlich ein Gewinner für die Interpretationsleistung.
quelle
Ich kann keine Referenz finden, aber ich denke, Sun hat sich für den stapelbasierten Bytecode-Ansatz entschieden, da es einfach ist, die JVM auf einer Architektur mit wenigen Registern (z. B. IA32) auszuführen.
In Dalvik VM Internals von Google I / O 2008 gibt der Dalvik-Ersteller Dan Bornstein die folgenden Argumente für die Auswahl einer registergestützten VM auf Folie 35 der Präsentationsfolien an :
und auf Folie 36:
Laut Bornstein ist dies "eine allgemeine Erwartung, die Sie finden könnten, wenn Sie eine Reihe von Klassendateien in Dex-Dateien konvertieren".
Der relevante Teil des Präsentationsvideos beginnt um 25:00 Uhr .
Es gibt auch ein aufschlussreiches Papier mit dem Titel "Virtual Machine Showdown: Stapel versus Register" von Shi et al. (2005) , in dem die Unterschiede zwischen stapel- und registergestützten virtuellen Maschinen untersucht werden.
quelle
Ich weiß nicht, warum Sun beschlossen hat, JVM-Stack-basiert zu machen. BEANGs virtuelle Maschine, BEAM ist aus Leistungsgründen registrierungsbasiert. Und Dalvik scheint auch aus Leistungsgründen registrierungsbasiert zu sein.
Von Pro Android 2 :
Und zur Codegröße:
Und wie ich mich erinnere Computer-Architektur: Ein quantitativer Ansatz kommt auch zu dem Schluss, dass eine Registermaschine eine bessere Leistung als eine stapelbasierte Maschine aufweist.
quelle