2011-10-06 23 views
59

Tengo una pregunta muy básica sobre JVM: ¿es un compilador o un intérprete?¿Es la JVM un compilador o un intérprete?

Si es un intérprete, ¿qué pasa con el compilador JIT que existe dentro de la JVM?
En caso negativo, ¿qué es exactamente la JVM? (No quiero la definición básica de jVM de convertir código de bytes a código específico de la máquina, etc.)

+13

La JVM es una máquina virtual. Bytcode entra, los efectos observables del programa suceden. Todo lo demás es un detalle de implementación. – delnan

+1

Sí, no existe la "JVM", existen múltiples implementaciones de la especificación. – paxdiablo

+0

@delnan, por favor, escríbalo como respuesta. Realmente quisiera volver a votar tal respuesta. – aioobe

Respuesta

112

En primer lugar, vamos a tener una idea clara de los siguientes términos

Javac es el compilador Java - Compila el código Java en bytecode

JVM es Java Virtual Machine - Se ejecuta/Interpreta/traduce Bytecode en código máquina nativo

JIT es justo a tiempo compilador - compila la secuencia de instrucciones de código de bytes dado al código de máquina en el runtime antes de ejecutarlo de forma nativa. Su objetivo principal es hacer grandes optimizaciones en el rendimiento.

Así que ahora, vamos a encontrar las respuestas a sus preguntas.

1) JVM: is it a compiler or an interpreter? - Respuesta: intérprete

2) what about JIT compiler that exist inside the JVM? - Respuesta: Si usted lee esta respuesta completamente, probablemente lo saben ahora

3) what exactly is the JVM? - Resp .:

  • JVM es una plataforma virtual que reside en su RAM
  • Su componente, clase Loader carga el archivo en la memoria RAM .class
  • El componente Byte código verificador en JVM comprueba si hay violaciónes de restricción de acceso en su código. (Esta es una de las razones principales por qué Java es seguro)
  • A continuación, el motor de ejecución componente convierte el bytecode en código máquina ejecutable

Hope esto le ayudó ..

+1

¡Explicación muy clara! Gracias:) – Mrigank

+0

Usted dice que JVM traduce Bytecode en Native Machine Code. No estoy seguro si el término "traducción" es correcto aquí. –

+0

Muy apreciado. casi ha aclarado mi duda sobre la diferencia entre la compilación y la interpretación, el código de bytes y el código m/c. su respuesta me dijo que un intérprete convierte el código de bytes en código máquina y el compilador convierte el código fuente en bytecode. – Simer

4

Ambos son. Comienza interpretando bytecode y puede (en caso de que decida que lo vale) luego compilar ese bytecode para el código máquina nativo.

3

Ambos. Puede interpretar bytecode y compilarlo en código nativo.

28

Es un poco de ambos, pero ninguno en el sentido tradicional.

Las JVM modernas toman código de bytes y lo compilan en código nativo cuando lo necesita. "JIT" en este contexto significa "justo a tiempo". Actúa como un intérprete desde el exterior, pero realmente detrás de escena se está compilando en código máquina.

La JVM no se debe confundir con el compilador de Java, que compila el código fuente en bytecode. Por lo tanto, no es útil considerarlo como "un compilador", sino más bien para saber que en el fondo hace una compilación.

+7

@NaeemShah: Me halaga que le haya gustado esta respuesta lo suficiente como para copiarla casi palabra por palabra en una publicación de blog bajo su propio nombre. Y usted tiene el derecho de hacerlo, pero bajo el esquema de licencia de StackOverflow, está legalmente obligado a devolver la atribución aquí, y debe licenciar su publicación de blog bajo la misma licencia. Vea el pie de página de este sitio web, que enlaza a la siguiente licencia: http://creativecommons.org/licenses/by-sa/3.0/. Consulte también esta publicación en el blog: http://blog.stackoverflow.com/2009/06/attribution-required/ –

1

¡Como otros han dicho que es ambos! Si desea remitirlo con todo lujo de detalles, puede ver: This IBM Description

-2

JVM tiene compilador e intérprete. Porque el compilador compila el código y genera bytecode. Después de eso, el intérprete convierte el bytecode en un código comprensible por la máquina.

Ejemplo: escribir y compilar un programa y se ejecuta en Windows. Lleve el archivo .class a otro SO (Unix) y se ejecutará debido a un intérprete que convierte el bytecode en un código comprensible para la máquina.

+0

Olvidó desactivar Caps :) –

+4

Incorrecto, primero compila el código fuente en bytecode (no tiene nada que ver con hacer con JVM), entonces la JVM interpreta el bytecode y lo compila en código nativo (pero tal vez no en todas las partes). –

2

Como ya @delnan declarado en la sección de comentarios, es ni.

JVM es una máquina abstracta que ejecuta Java bytecode.

JVM tiene varias implementaciones:

  • HotSpot (intérprete + JIT compilador)
  • Dalvik (intérprete + compilador JIT)
  • ART (AOT compilador + compilador JIT)
  • GCJ (compilador AOT)
  • JamVM (intérprete)

... y many others.

La mayoría de las otras respuestas cuando se habla de JVM se refieren a HotSpot o alguna mezcla de los enfoques anteriores para implementar la JVM.

Cuestiones relacionadas