2008-10-02 11 views
43

¿Cuáles son exactamente las ventajas y desventajas del uso de una máquina virtual basada en registro en comparación con el uso de una máquina virtual basada en pila?registros vs stacks

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é la JVM, la CLR y la VM de Python están basadas en la pila?

Respuesta

26

Esto ya ha recibido ninguna respuesta, a un cierto nivel, en FAQ del loro VM y asociados a los mismos: A Parrot Overview El texto pertinente de ese documento es la siguiente:

el 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 hasta cierto punto el hardware subyacente 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: Registers vs stacks for interpreter design Citando un poco:

No hay duda real, es más fácil de 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 alguna vez? 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.

7

¿Cuántos registros necesita?

Probablemente necesite al menos uno más.

+0

Puedo ver a qué te refieres, pero ¿cómo es eso diferente de una pila? Las pilas pueden hacerse demasiado pequeñas también. –

+1

Al ver que las máquinas virtuales están implementadas en el software, el tamaño de tu pila es virtualmente ilimitado. Los registros son finitos. Puedo tener r1-r32. Podría crear r33 en el software, pero ¿qué otras clases necesitarían saber? –

+17

Parrot tiene infinitamente muchos registros. ¿Estás seguro de que necesitas uno más que eso? –

34

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 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 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 this paper que parece indicar que una VM compilada JIT puede ser más eficiente usando una arquitectura de registro.

12

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

1

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 implementaciones rápidas y más fáciles de generar código altamente optimizado para.

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

+0

No entiendo exactamente lo que quiere decir cuando dice "Las máquinas virtuales basadas en registros son más fáciles de crear para implementaciones rápidas". ¿Puede dar un ejemplo? –

3

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.

2

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. El Forth VM tenía 30 bytes de código en una máquina con 2k de ROM y 256 bytes de RAM.

+2

Llamar a una implementación típica de Forth una VM es un poco exagerado. Forth es un lenguaje interpretado, lo que básicamente significa que el intérprete Forth recibe una lista de direcciones para ejecutar. En cada una de esas direcciones encontrará el código de la máquina, en cuyo caso simplemente ejecutará el código. O encontrará otra lista de direcciones y se aplicará recursivamente a esa lista. Esto es lo que hace que el código Forth sea tan compacto (y el "intérprete" Forth sea tan pequeño). Sin embargo, un programa Forth está vinculado a la arquitectura para la que se creó. – Ferruccio

+0

Forth se puede considerar una máquina virtual de doble pila. Tiene una pila de datos y una pila de retorno.Cuando Forth VM se transfiere a hardware, como en los chips Novix NC4016 o Harris RTX2000, obtiene Forth como idioma nativo incrustado. –

16

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 único idioma y densidad de código. los ejecutables para la arquitectura de la 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 de 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 de VM debido a un tamaño de código más grande, solo implica 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.

+6

Aquí hay una referencia para las cifras citadas en esta respuesta: http://db.usenix.org/events/vee05/full_papers/p153-yunhe.pdf - tenga en cuenta que la diferencia de velocidad es para un intérprete, no un compilador JIT. –

+0

+1 para números reales –

Cuestiones relacionadas