Ten artykuł jest bardzo pouczające, a także: http://www.codeproject.com/Articles/461052/Stack-based-vs-Register-based-Virtual-Machine-Arch
"Maszyny wirtualne oparte na stosach" Maszyna wirtualna na stosie implementuje ogólne cechy opisane jako wymagane przez maszynę wirtualną w powyższych punktach, ale struktura pamięci, w której przechowywane są operandy, jest strukturą danych stosu. Operacje są wykonywane przez wyskakiwanie danych ze stosu, przetwarzanie ich i przekazywanie wyników w stylu LIFO (Last in First Out). W maszynie wirtualnej stos oparciu operacja dodawania dwóch liczb zazwyczaj przeprowadza się w następujący sposób (w którym 20, 7, i „Wynik” są to argumenty):
stackAdd
POP 20 POP 7 ADD 20, 7, wynik Wynik PUSH Z powodu operacji PUSH i POP, do wykonania operacji dodawania potrzebne są cztery linie instrukcji. Zaletą modelu opartego na stosie jest to, że operandy są adresowane niejawnie za pomocą wskaźnika stosu (SP na powyższym obrazku). Oznacza to, że maszyna wirtualna nie musi jawnie znać adresów argumentów operacji, ponieważ wywołanie wskaźnika stosu spowoduje (Pop) następny operand. W maszynach wirtualnych opartych na stosie, wszystkie operacje arytmetyczne i logiczne są przeprowadzane za pomocą Pushing i Popping operandów i wyników w stosie.
Wirtualne maszyny oparte na rejestrze W opartej na rejestrze implementacji maszyny wirtualnej struktura danych, w której przechowywane są operandy, opiera się na rejestrach procesora. Nie ma tu operacji PUSH ani POP, ale instrukcje muszą zawierać adresy (rejestry) operandów. Oznacza to, że operandy instrukcji są jawnie adresowane w instrukcji, w przeciwieństwie do modelu opartego na stosie, w którym mamy wskaźnik stosu wskazujący na operand. Na przykład, operacja dodawania jest przeprowadzane w oparciu o maszynie wirtualnej rejestru, instrukcja będzie mniej lub bardziej w następujący sposób:
registerAdd
ADD R1, R2, R3; # Dodaj zawartość R1 i R2, zapisz wynik w R3 Jak już wcześniej wspomniałem, nie ma operacji POP ani PUSH, więc instrukcja dodawania to tylko jedna linia. Ale w przeciwieństwie do stosu, musimy wyraźnie wymienić adresy operandów jako R1, R2 i R3. Zaletą jest to, że nie ma konieczności napinania i wychodzenia ze stosu, a instrukcje w VM opartej na rejestrze wykonują się szybciej w pętli dyspozytorskiej instrukcji.
Kolejną zaletą modelu opartego na rejestrze jest to, że pozwala na pewne optymalizacje, których nie można wykonać w podejściu opartym na stosie. Jedną z takich sytuacji jest sytuacja, gdy w kodzie występują wspólne podwyrażenia, model rejestru może go obliczyć raz i zapisać wynik w rejestrze do wykorzystania w przyszłości, gdy ponownie pojawia się podekspresja, co zmniejsza koszt ponownego obliczenia wyrażenia.
Problem z modelem opartym na rejestrze polega na tym, że średnia instrukcja rejestru jest większa niż średnia instrukcja stosu, ponieważ musimy jawnie określić adresy argumentów. Podczas gdy instrukcje dla maszyny stosu są krótkie ze względu na wskaźnik stosu, odpowiednie instrukcje maszyny rejestrującej muszą zawierać lokalizacje argumentów i skutkują większym kodem rejestru w porównaniu do kodu stosu.
Świetny artykuł na blogu, na który natknąłem się (pod tym linkiem), zawiera objaśniającą i prostą implementację maszyny wirtualnej opartej na rejestrze. Jeśli twoim głównym zainteresowaniem cieszą się wdrożenia maszyn wirtualnych i interpretatorów, może się przydać książka autorstwa Terrence Parr z ANTLR zatytułowana "Wzorce implementacji języka: twórz własne, specyficzne dla domeny i ogólne języki programowania".
Ze źródła Java poziom nie ma różnicy pojęciowej Różnica polega na bajtodach (tworzonych przez javac), gdzie kody bajtowe oparte na stosie są pisane w kategoriach stosu, natomiast (niespodzianka!) dla modelu opartego na rejestrze, kody bajtowe są pisane w terminach rejestrów: –
(JIT-skompilowana Java, nawet w architekturze opartej na stosie, jest oparta na rejestrze). –
ten link pomoże ci uzyskać więcej wyjaśnień http://markfaction.wordpress.com/2012/07/ 15/architektura oparta na stosie w stosunku do rejestrów-maszyna wirtualna-architektura-i-dalvik-vm/ – LeoMobDev