Pregunta

¿Cuáles son exactamente las ventajas y desventajas de usar una máquina virtual basada en registros en comparación con una máquina virtual basada en pila?

Para mí, parecería que una máquina basada en registros sería más sencilla de programar y más eficiente. Entonces, ¿por qué JVM, CLR y Python VM están todos basados ??en pila?

¿Fue útil?

Solución

Esto ya se ha respondido, hasta cierto nivel, en las preguntas frecuentes de Parrot VM y en los documentos asociados: Una descripción general de Parrot El texto relevante de ese documento es este:

  

Parrot VM tendrá una arquitectura de registro, en lugar de una arquitectura de pila. También tendrá operaciones de nivel extremadamente bajo, más similares a las de Java que las operaciones de nivel medio de Perl y Python y similares.

     

El razonamiento de esta decisión es principalmente que, al parecerse al hardware subyacente hasta cierto punto, es posible compilar el código de bytes de Parrot para un lenguaje de máquina nativo eficiente.

     

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

También puede leer esto: Registros vs pilas para el diseño de intérpretes Citando un poco:

  

No hay duda real, es más fácil generar código para una máquina de pila. La mayoría de los estudiantes de primer año del compilador pueden hacer eso. Generar código para una máquina de registro es un poco más difícil, a menos que lo trate como una máquina de pila con un acumulador. (Lo cual es factible, aunque algo menos que ideal desde el punto de vista del rendimiento) La simplicidad de la focalización no es un gran problema, al menos no para mí, en parte porque muy pocas personas realmente van a apuntarlo directamente, quiero decir, vamos, ¿cuántas personas conoces que realmente intentan escribir un compilador para algo que a alguien le interese? Los números son pequeños. El otro problema es que muchas de las personas con conocimiento de compiladores ya se sienten cómodos apuntando a las máquinas de registro, ya que eso es lo que son todas las CPU de hardware de uso común.

Otros consejos

Implementado en hardware, una máquina basada en registros será más eficiente simplemente porque hay menos accesos a la RAM más lenta. En software, sin embargo, incluso una arquitectura basada en registros probablemente tendrá los "registros". en RAM Una máquina basada en pila será igual de eficiente en ese caso.

Además, una máquina virtual basada en pila hará que sea mucho más fácil escribir compiladores. No tiene que lidiar con estrategias de asignación de registros. Básicamente, tiene un número ilimitado de registros para trabajar.

Actualización: escribí esta respuesta suponiendo una VM interpretada. Es posible que no sea cierto para una VM compilada JIT. Me encontré con este documento que parece indicar que se compiló un JIT VM puede ser más eficiente usando una arquitectura de registro.

Tradicionalmente, los implementadores de máquinas virtuales han favorecido las arquitecturas basadas en pila en lugar de las basadas en registros debido a la 'simplicidad de la implementación de VM', la facilidad de escribir un back-end del compilador: la mayoría de las VM están diseñadas originalmente para alojar un solo idioma y densidad de código y ejecutables para la arquitectura de pila son invariablemente más pequeños que los ejecutables para arquitecturas de registro. La simplicidad y la densidad del código son un costo de rendimiento.

Los estudios han demostrado que una arquitectura basada en el registro requiere un promedio de 47% menos de instrucciones de VM ejecutadas que la arquitectura basada en la pila, y el código de registro es un 25% más grande que el código de pila correspondiente, pero esto aumenta el costo de obtener más instrucciones de VM debido un tamaño de código más grande implica solo 1.07% de cargas reales adicionales de máquina por instrucción VM, lo cual es insignificante. El rendimiento general de la VM basada en el registro es que lleva, en promedio, un 32,3% menos de tiempo para ejecutar puntos de referencia estándar.

Una razón para construir máquinas virtuales basadas en pila es que los códigos de operación de máquinas virtuales reales pueden ser más pequeños y simples (no es necesario codificar / decodificar operandos). Esto hace que el código generado sea más pequeño y también simplifica el código VM.

¿Cuántos registros necesitas?

Probablemente necesitaré al menos uno más que eso.

No es obvio para mí que un "basado en el registro" la máquina virtual sería "más fácil de programar" o "más eficiente". ¿Quizás esté pensando que los registros virtuales proporcionarían un atajo durante la fase de compilación JIT? Ciertamente, este no sería el caso, ya que el procesador real puede tener más o menos registros que la VM, y esos registros pueden usarse de diferentes maneras. (Ejemplo: los valores que se van a disminuir se colocarán mejor en el registro ECX en los procesadores x86). Si la máquina real tiene más registros que la VM, entonces está desperdiciando recursos, menos y no ha ganado nada usando " basado en el registro " programación.

Las máquinas virtuales basadas en pila son más simples y el código es mucho más compacto. Como ejemplo del mundo real, un amigo construyó (hace unos 30 años) un sistema de registro de datos con una Forth VM casera en un Cosmac. La Forth VM tenía 30 bytes de código en una máquina con 2k de ROM y 256 bytes de RAM.

Las máquinas virtuales basadas en pila son más fáciles de generar código.

Las máquinas virtuales basadas en el registro son más fáciles de crear implementaciones rápidas y más fáciles de generar código altamente optimizado para.

Para su primer intento, le recomiendo comenzar con una VM basada en pila.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top