language-agnostic vm-implementation stack-based

language agnostic - registros vs stacks



language-agnostic vm-implementation (8)

¿Cuáles son exactamente las ventajas y desventajas del uso de una máquina virtual basada en registro versus el uso de una máquina virtual basada en pila?

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


¿Cuántos registros necesitas?

Probablemente necesitaré al menos uno más.


Esto ya ha sido respondido, hasta cierto nivel, en las preguntas frecuentes y los documentos asociados de la Parrot VM: Una descripción de loros 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 muy bajo nivel, más similares a las de Java que las operaciones de nivel medio de Perl y Python y similares.

El razonamiento para esta decisión es principalmente que al parecer el hardware subyacente en cierta medida, es posible compilar el bytecode de Parrot en 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 mantener los 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.

También puede leer esto: Registros vs pilas para el diseño del intérprete 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 compilación de primer año pueden hacer eso. Generar código para una máquina de registro es un poco más difícil, a menos que lo esté tratando 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 tan importante, al menos no para mí, en parte porque muy pocas personas van a apuntar directamente a ella, quiero decir, vamos, ¿cuántas personas conoces que realmente intenten 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 del compilador ya se sienten cómodas al apuntar a las máquinas de registro, ya que eso es lo que todas las CPU de hardware de uso común son.


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

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

Para su primer intento, recomiendo comenzar con una máquina virtual basada en pila.


No es obvio para mí que una máquina virtual "basada en registros" sería "más sencilla de programar" o "más eficiente". ¿Quizás piensas que los registros virtuales proporcionarían un atajo durante la fase de compilación de JIT? Esto ciertamente no sería el caso, ya que el procesador real puede tener más o menos registros que la VM, y esos registros se pueden usar de diferentes maneras. (Ejemplo: los valores que se van a disminuir se colocan mejor en el registro ECX de los procesadores x86.) Si la máquina real tiene más registros que la máquina virtual, entonces está desperdiciando recursos, menos y no ha ganado nada con "registrarse "a base de" programación.


Una razón para construir máquinas virtuales basadas en pila es que los códigos de operación de VM 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 de VM.


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


Tradicionalmente, los implementadores de máquinas virtuales han favorecido las arquitecturas basadas en registros sobre las basadas en registros debido a la simplicidad de la implementación de VM. La mayoría de las máquinas virtuales están diseñadas originalmente para alojar un solo idioma y densidad de códigos y ejecutables para la arquitectura de pila. son invariablemente más pequeños que los ejecutables para las 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 registro requiere un promedio de 47% menos de instrucciones VM ejecutadas que arquitectura basada en pila, y el código de registro es 25% más grande que el código de pila correspondiente pero aumenta el costo de obtener más instrucciones VM debido a código más grande el tamaño implica solo un 1.07% de cargas de máquina reales extra por instrucción de máquina virtual, lo cual es insignificante. El rendimiento general de la máquina virtual basada en registros es que, en promedio, lleva un 32,3% menos de tiempo para ejecutar puntos de referencia estándar.


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

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

Actualización: escribí esta respuesta asumiendo una máquina virtual interpretada. Puede no ser cierto para una VM compilada JIT. Me encontré con este documento que parece indicar que una máquina virtual compilada JIT puede ser más eficiente utilizando una arquitectura de registro.