Pregunta

Tengo curiosidad, ¿por qué Sun deciden hacer el basado en la pila JVM y Google deciden hacer el registro basado DalvikVM-?

supongo que la JVM en realidad no puede asumir que un cierto número de registros están disponibles en la plataforma de destino, ya que se supone que es independiente de la plataforma. Para ello sólo se pospone el registro de asignación de etc, para el compilador JIT. (Corríjanme si me equivoco).

Así que los chicos de Android pensaron: "bueno, eso es poco eficiente, vamos a por una máquina virtual basada en el registro de inmediato ..."? Pero espere, hay varios dispositivos android diferentes, ¿qué número de registros se dirigió el Dalvik? Son los códigos de operación Dalvik codificados por un cierto número de registros?

No todos los dispositivos Android actuales en el mercado tienen aproximadamente el mismo número de registros? O, ¿hay un registro de reasignación realizada durante dex-carga? ¿Cómo encaja todo esto junto?

¿Fue útil?

Solución

Existen algunos atributos de una máquina virtual basada en la pila que ajuste bien con los objetivos de diseño de Java:

  1. Un diseño basado en la pila hace muy pocos suposiciones sobre el objetivo hardware (registros, funciones de la CPU), por lo que es fácil de implementar una máquina virtual en una amplia variedad de hardware.

  2. Desde los operandos para instrucciones son en gran parte implícita, el objeto código tenderá a ser menor. Esta es importante si va a estar descargando el código a través de un lento red de enlace.

Ir con un esquema basado en registros probablemente significa que el generador de código de Dalvik no tiene que trabajar tan duro para producir código performant. Que se ejecuta en un extremadamente rica en registros o registro pobre en la arquitectura sería probablemente la desventaja Dalvik, pero ese no es el objetivo de costumbre -. ARM es una arquitectura muy medio-de-la-carretera


También había olvidado que la versión inicial de Dalvik no incluye un JIT en absoluto. Si usted va a interpretar las instrucciones directamente, a continuación, un esquema basado en el registro es probablemente un ganador para un rendimiento interpretación.

Otros consejos

No se puede encontrar una referencia, pero creo que Sun decidió por el enfoque basado en la pila de código de bytes, ya que hace que sea fácil para ejecutar la JVM en una arquitectura con unos registros (por ejemplo, IA32).

Dalvik VM Internos de Google I / O 2008, el Dalvik creador Dan Bornstein da los siguientes argumentos para la elección de una máquina virtual basada en el registro de la diapositiva 35 de la diapositivas de la presentación :

  

Registro máquina

     

¿Por qué?

     
      
  • entrega de instrucciones evitar
  •   
  • evitar el acceso a la memoria innecesaria
  •   
  • consumir flujo de instrucciones de manera eficiente (mayor densidad semántica por instrucción)
  •   

y en la diapositiva 36:

  

Registro máquina

     

Las estadísticas

     
      
  • 30% menos instrucciones
  •   
  • 35% menos de unidades de código
  •   
  • 35% más bytes en el flujo de instrucciones      
        
    • pero se llega a consumir de dos a la vez
    •   
  •   

De acuerdo con Bornstein se trata de "una expectativa general de lo que podría encontrar al convertir un conjunto de archivos de clase a los archivos DEX".

La parte pertinente de los inicia vídeo presentación en 25:00 .

También hay un papel perspicaz titulado "Virtual Machine Showdown: Pila Versus Registros" por Shi et al. (2005) , que explora las diferencias entre las máquinas virtuales y stack- basado en registros.

No sé qué Sun decidió hacer a base de pila de JVM. Erlangs máquina virtual, haz se basa registro por razones de rendimiento. Y Dalvik también parece estar en el registro basado debido a razones de rendimiento.

Pro Android 2 :

  

Dalvik utiliza registros como principalmente unidades de almacenamiento de datos en lugar de la pila. Google es la esperanza de lograr un 30 por ciento menos instrucciones como resultado.

Y respecto al tamaño del código:

  

La máquina virtual Dalvik toma los archivos de clases Java generadas y las combina en una o más Dalvik ejecutables (.dex) archivos. Se vuelve a utilizar la información duplicada desde múltiples archivos de clase, reduciendo efectivamente la necesidad de espacio (sin comprimir) por medio de un archivo .jar tradicional. Por ejemplo, el archivo de la aplicación .dex navegador web en Android es de aproximadamente 200 mil, mientras que la versión sin comprimir .jar equivalente es de aproximadamente 500 k. El archivo .dex de la alarma del reloj es de aproximadamente 50 mil, y aproximadamente el doble de ese tamaño en su versión .jar.

Y como recuerdo Computer Architecture: A Quantitative Approach también la conclusión de que una registrar máquinas funcionan mejor que una máquina basada en pila.

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