Pregunta

  

"Un programa de código de bytes se ejecuta normalmente mediante el análisis de las instrucciones de uno a la vez. Este tipo de intérprete de código de bytes es muy portátil. Algunos sistemas, llamados traductores dinámicos, o 'compiladores (JIT) just-in-time', traducir el código de bytes en lenguaje de máquina, según sea necesario en tiempo de ejecución: esto hace que la máquina virtual no portables "

.

Una pregunta acerca de este párrafo es que: Después de que el código de bytes se procesa, ¿cuál es la diferencia entre una instrucción analizada y lenguaje de máquina (o código de máquina)?

¿Fue útil?

Solución

JIT es diferente a un intérprete de código de bytes.

Considere la siguiente función C:

int sum() {
   return 5 + 6;
}

Esto se ha compilado el código máquina. Las instrucciones exactas de procesadores x86 y ARM diga será diferente.

Si escribimos un intérprete de código de bytes básica que podría ser algo como esto:

for(;;) {
   switch(*currentInstruction++) {
   case OP_PUSHINT:
      *stack++ = nextInt(currentInstruction);
      break;
   case OP_ADD:
      --stack;
      stack[-1].add(*stack);
      break;
   case OP_RETURN:
      return stack[-1];
   }
}

Esto puede interpretar el siguiente conjunto de comandos:

OP_PUSHINT (5)
OP_PUSHINT (6)
OP_ADD
OP_RETURN

Si ha compilado el intérprete de código de bytes tanto en x86 o ARM, entonces sería capaz de ejecutar el mismo código de bytes sin hacer ninguna reescritura adicional de la intérprete.

Si usted escribió un compilador JIT que se necesita para emitir instrucciones específicas de procesador (código máquina) para cada procesador compatible, mientras que el intérprete de código de bytes se basa en el compilador de C ++ para emitir el procesador de instrucciones específicas.

Otros consejos

En un intérprete de código de bytes, el formato de la instrucción es generalmente diseñado para muy rápido "análisis" por medio de operadores de desplazamiento y la máscara. El intérprete, después de "análisis" (yo prefiero "decodificación") la instrucción, actualiza inmediatamente el estado de la máquina virtual y luego comienza la decodificación de la siguiente instrucción. Así que después de que el código de bytes se procesa en un intérprete , ningún remanente permanece.

En un compilador JIT, bytes se procesan en unidades mayores que una sola instrucción. La unidad mínima es el componente básico, pero los ECI modernos convierten caminos más grandes a código máquina. Se trata de un traducción paso, y la salida de la etapa de traducción es código máquina. El código de bytes original puede permanecer en la memoria, pero no se utiliza para la implementación a lo que no hay diferencia real. (Aunque todavía es típico que el código de máquina para una máquina virtual compilados JIT hace cosas diferentes del código de máquina emitido por un compilador de código nativo.)

No hay ninguna diferencia - compilador JIT se hace exactamente para eso -. Que produce código máquina que se ejecuta en el hardware

En última instancia, todo se reduce a instrucciones de la máquina.

  1. Nativo App - contiene instrucciones de máquina que se ejecutan directamente
  2. .
  3. JIT App -. Bytecode se compila en instrucciones de máquina y ejecutado
  4. Aplicación Traducción -. Bytecode se traduce por una máquina virtual que es una aplicación nativa

Como se puede decir, por el número 1, que tienen la menor sobrecarga, mientras que con # 3, que tiene la mayor parte de arriba. Por lo tanto, el rendimiento debe ser el más rápido en el # 1 y tan rápido en # 2 después de la sobrecarga inicial compilación.

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