2012-10-12 69 views
9

Hoy estaba leyendo some slides about Andoird basics y la frase apareció:¿Cuáles son las principales diferencias entre una VM basada en registro y una basada en la pila?

máquina virtual Dalvik es registrarse con base en lugar de pila basada.

Entonces, ¿Cuáles son las principales diferencias entre una VM basada en registro y una basada en la pila?


El segundo enlace respondidos suficiente mi pregunta:

http://markfaction.wordpress.com/2012/07/15/stack-based-vs-register-based-virtual-machine-architecture-and-the-dalvik-vm/

Otro enlace:

http://androidjayavelu.blogspot.co.at/2011/06/dalvik-virtual-machine-vs-java-virtual.html

+1

de la fuente Java nivel no hay diferencia conceptual. La diferencia está en los códigos de bytes (que produce javac), donde los códigos de bytes basados ​​en la pila se escriben en términos de una pila, mientras que (¡sorpresa!) para el modelo basado en registro, los códigos de bytes se escriben en términos de registros. –

+3

(Java compilado por JIT, incluso en una arquitectura "basada en pila", está basado en registros.) –

+0

este enlace lo ayudará a obtener más explicaciones http://markfaction.wordpress.com/2012/07/ 15/stack-based-vs-register-based-virtual-machine-architecture-and-the-dalvik-vm/ – LeoMobDev

Respuesta

2

Este artículo es bastante informativo, así: http://www.codeproject.com/Articles/461052/Stack-based-vs-Register-based-Virtual-Machine-Arch

"Máquinas virtuales basadas en pila Una máquina virtual basada en pila implementa las características generales descritas como necesarias por una máquina virtual en los puntos anteriores, pero la estructura de memoria donde se almacenan los operandos es una estructura de datos de pila. Las operaciones se llevan a cabo sacando datos de la pila, procesándolos y devolviendo los resultados en forma de LIFO (último en entrar, primero en salir). En una máquina virtual basado en pila, la operación de suma de dos números normalmente se llevaría a cabo de la siguiente manera (en el que 20, 7, y 'resultado' son los operandos):

stackAdd

POP 20 POP 7 ADD 20, 7, resultado resultado PUSH Debido a las operaciones PUSH y POP, se necesitan cuatro líneas de instrucciones para llevar a cabo una operación adicional. Una ventaja del modelo basado en pila es que los operandos son direccionados implícitamente por el puntero de pila (SP en la imagen de arriba). Esto significa que la máquina virtual no necesita conocer las direcciones del operando explícitamente, ya que al llamar al puntero de la pila se le asignará (Pop) al siguiente operando. En las máquinas virtuales basadas en pila, todas las operaciones aritméticas y lógicas se llevan a cabo mediante Empujar y Hacer estallar los operandos y los resultados en la pila.

Máquinas virtuales basadas en registro En la implementación basada en registro de una máquina virtual, la estructura de datos donde se almacenan los operandos se basa en los registros de la CPU. Aquí no hay operaciones PUSH o POP, pero las instrucciones deben contener las direcciones (los registros) de los operandos. Es decir, los operandos para las instrucciones se abordan explícitamente en la instrucción, a diferencia del modelo basado en pila donde teníamos un puntero de pila para apuntar al operando. Por ejemplo, si una operación de suma se debe llevar a cabo en una máquina virtual basado registro, la instrucción sería más o menos el siguiente:

registerAdd

ADD R1, R2, R3; # Agregar contenido de R1 y R2, almacenar el resultado en R3 Como mencioné anteriormente, no hay operaciones POP o PUSH, por lo que las instrucciones para agregar son solo una línea. Pero a diferencia de la pila, necesitamos mencionar explícitamente las direcciones de los operandos como R1, R2 y R3. La ventaja aquí es que la sobrecarga de empujar ay hacer estallar desde una pila no existe, y las instrucciones en una máquina virtual basada en registros se ejecutan más rápido dentro del ciclo de despacho de instrucciones.

Otra ventaja del modelo basado en registro es que permite algunas optimizaciones que no se pueden realizar en el enfoque basado en la pila. Una de esas instancias es cuando hay sub expresiones comunes en el código, el modelo de registro puede calcularlo una vez y almacenar el resultado en un registro para uso futuro cuando la subexpresión vuelve a aparecer, lo que reduce el costo de recalcular la expresión.

El problema con un modelo basado en registro es que la instrucción de registro promedio es más grande que una instrucción de pila promedio, ya que necesitamos especificar explícitamente las direcciones del operando. Mientras que las instrucciones para una máquina de pila son cortas debido al puntero de la pila, las respectivas instrucciones de la máquina de registro deben contener ubicaciones de operando, y da como resultado un código de registro más grande en comparación con el código de la pila.

Un gran artículo de blog que encontré (en este enlace), contiene una implementación C explicativa y simple de una máquina virtual basada en registro. Si la implementación de máquinas virtuales e intérpretes es su principal interés, el libro del creador de ANTLR Terrence Parr titulado 'Patrones de implementación del lenguaje: cree sus propios lenguajes de programación específicos y específicos del dominio', podría ser muy útil. "

+0

Si esta es una respuesta, por favor pegue el código correspondiente aquí; los enlaces pueden cambiar y esta respuesta ya no sería relevante. – rfornal

Cuestiones relacionadas