Register-, Stack- und Speichertransfermaschinen sind theoretisch äquivalent. Bytecodeinterpreter für reine Stackmaschinen sind einfach und effizient in Software umzusetzen, Implementationen von Register- oder Speichertransfermaschinen sind aber leichter um einen Compiler in nativen Code erweiterbar, weil man weniger Aufwand bei der Transformation des Bytecodes in eine passende Form für den Registerallokator treiben muss.
In Hardware sind Registermaschinen bei weitem am effizientesten implementierbar, weshalb auch sämtliche modernen Prozessoren diesem Prinzip folgen.
Die Tatsache, dass viele andere bekannte virtuelle Maschinen, wie zum Beispiel die von
Python, die
JVM oder die
CLR, Stackmaschinen sind, hat hauptsächlich den historischen Grund, dass sie bereits vor der Verbreitung von Just in Time Compilern als reine Interpreter entwickelt wurden.
Da moderne Rechner aber genug Leistung für eine Übersetzung des Bytecodes in Maschinencode zur Laufzeit bieten, setzen praktisch alle neueren virtuellen Maschinen wie
Dalvik,
Dis,
LLVM oder eben auch
Parrot ausnahmslos
nicht auf Stackmaschinen sondern auf andere Konzepte. Während Dalvik und Parrot sich ein wenig an das Design einer Hardware CPU anlehnen ist Dis als Speichertransfermaschine konzipiert und die LLVM, die ja als Basis komplexer Compilersysteme mit diversen Optimierungsschritten gedacht ist, verwendet eine Single Static Assignment Form des Codes, welche auch Transformationen des Bytecodes erleichtert.
Langer Rede kurzer Sinn: Erstens ist es unsachlich eine Sache nur deswegen zu kritisieren, weil sie anders als Gewohntes ist; zweitens gibt es einfach gute Gründe eine virtuelle Maschine registerbasierend zu gestalten, die sich nicht von der Hand weisen lassen.
When C++ is your hammer, every problem looks like your thumb.