2012-01-01 13 views
6

¿Por qué las máquinas virtuales basadas en registro son mejores que las basadas en la pila?¿Por qué las máquinas virtuales basadas en registro son mejores que las basadas en la pila?

En concreto, en the Parrot VM's document, el diseñador explica las ventajas de las máquinas de registro:

[...] muchos programas en lenguajes de alto nivel consisten en funciones y métodos llamadas anidadas, a veces con las variables léxicas para sostener resultados intermedios Bajo configuraciones que no son JIT, una máquina virtual basada en pila aparecerá y luego empujará los mismos operandos muchas veces, mientras que una máquina virtual basada en registro simplemente asignará la cantidad correcta de registros y operará sobre ellos, lo que puede reducir significativamente la cantidad de operaciones y tiempo de CPU.

pero ¿por qué los mismos operandos son empujados muchas veces?

+0

posible duplicado de registros [vs pilas] (http://stackoverflow.com/questions/164143/registers- vs-stacks) –

Respuesta

7

Parece que describen una VM que ejecuta el código como se describe en el diseño del lenguaje, bytecode-by-bytecode sin compilación ni optimización. En ese caso, es verdad. Piense sobre el código haciendo algo como esto, por ejemplo:

x = first(a,b,c) 
y = second(a,b,c) 
third(y,x) 

Con un sistema basado en el registro, es posible que pueda poner simplemente los argumentos en cualquier posición que se espera (si los registros se pueden utilizar para pasar argumentos). Si todos los registros son "globales", no por función (o al menos restaurados al abrir la pila de llamadas), es posible que no necesite hacer nada entre la llamada a first y second.

Si usted tiene una máquina virtual basado en pila, que iba a terminar con algo como (esperemos que tienes swap):

push a 
push b 
push c 
call first 
push a # pushing same arguments again 
push b 
push c 
call second 
swap 
call third 

también si se calcula una expresión matemática, que vuelve a utilizar las mismas variables, podría tener que hacer algo como esto:

push a 
push b 
add 
push a 
push c 
add 
add 

en lugar de (suponiendo que hay registros a, b, c y se puede destruir el contenido de B y C):

add b, a 
add c, a 
add b, C# result in b 

esto evita la restauración de a, que se debe hacer en un empuje separado en el primer caso.

Por otra parte, sólo estoy adivinando los ejemplos, tal vez se referían a algún otro caso ...

Cuestiones relacionadas