2010-03-11 10 views
27

¿Cuáles son las diferencias entre un Compilador Just-in-Time y un Intérprete, y existen diferencias entre el compilador .NET y Java JIT?¿Cuáles son las diferencias entre un Compilador Just-in-Time y un Intérprete?

+2

El título de su pregunta realmente no coincide con el texto de la pregunta. Tanto Java como .NET están jodidos, ninguno de los dos se interpreta. – Aaronaught

+0

sirvió como una segunda pregunta – Rookian

+3

, entonces debería formularla como una segunda pregunta diferente. De esta manera solo estás confundiendo a la gente. – Oded

Respuesta

29

Just-in-time compilation es la conversión de código no nativo, por ejemplo bytecode, al código nativo justo antes de que se ejecute.

De Wikipedia:

JIT se basa en dos ideas anteriores en entornos de tiempo de ejecución: compilación de código de bytes y la compilación dinámica. Convierte código en tiempo de ejecución antes de ejecutarlo de forma nativa, por ejemplo bytecode en código máquina nativo.

Un interpreter ejecuta un programa. Puede o no tener un jitter.

Una vez más, de Wikipedia:

Un intérprete puede ser un programa que ya sea

  1. ejecuta el código fuente directamente
  2. traduce el código fuente en un poco de representación intermedia eficiente (código) e inmediatamente ejecuta esto
  3. ejecuta explícitamente el código precompilado almacenado realizado por un compilador que forma parte del sistema de intérprete

Tanto el estándar de Java y .NET distribuciones tienen la compilación JIT, pero no es requerido por las normas. El compilador JIT en .NET y C# son, por supuesto, diferentes porque el bytecode intermedio es diferente. El principio es el mismo sin embargo.

+0

¿El compilador JIT del CLR compila el código TODO una vez o no? – Rookian

+3

No, compila solo el código necesario. Esto le proporciona una ventaja para optimizar en tiempo de ejecución. – Kimi

+0

Pero el proceso de optimización por llamada ocurre solo una vez, ¿no es así (.NET JIT)? Debido a que el rojo .NET JIT compila una paz de código solo una vez. – Rookian

9

Un intérprete genera y ejecuta instrucciones de código de máquina sobre la marcha para cada instrucción, independientemente de si se ha ejecutado previamente.
Un JIT almacena en caché las instrucciones que se han interpretado previamente para código de máquina, y reutiliza las instrucciones del código de máquina nativo ahorrando así tiempo & recursos al no tener que volver a interpretar las instrucciones que ya se han interpretado.

+0

Su respuesta está relacionada con el compilador Java JIT, ¿no es así? – Rookian

+0

Sí, pero creo que la técnica JIT se desarrolló por primera vez en smalltalk. – crowne

+0

Entonces, ¿un JIT hace que un programa sea más rápido mientras se ejecuta? – Aerovistae

1

Cuando compila un lenguaje Microsoft.NET, el compilador genera código escrito en el Microsoft Intermediate Language (MSIL). MSIL es un conjunto de instrucciones que pueden traducirse rápidamente a código nativo.

Una aplicación de Microsoft.NET puede ejecutarse solo después de que el código MSIL se traduzca al código de máquina nativo. En .NET Framework, el lenguaje intermedio se cumple "just in time" (JIT) en el código nativo cuando se ejecuta la aplicación o el componente en lugar de compilar la aplicación en el momento del desarrollo.

more info

2

JIT compilador produce códigos de máquina binarios traducir el código fuente bloque. El intérprete traduce línea por línea.

6

La pregunta de si un motor de ejecución es un compilador o un intérprete se puede responder de manera muy simple considerando lo que sucede si una rutina se ejecuta 1,000 veces.Si el código dentro del motor de ejecución tendrá que examinar alguna representación particular del código 1,000 veces, el motor de ejecución es un intérprete de esa representación. Si el código dentro de la ejecución el motor de ejecución solo tendrá que examinar esa representación particular del código un número menor de veces (típicamente, aunque no necesariamente, una vez), es un compilador o traductor de esa representación. Tenga en cuenta que es muy común que un motor de ejecución tome el código de entrada y lo convierta en alguna otra forma que pueda examinarse más fácilmente. Tal motor de ejecución combinaría un compilador o traductor de la forma anterior con un intérprete de la última forma.

Tenga en cuenta que los intérpretes rara vez producen ningún tipo de código de máquina. Casi la única vez que un intérprete producirá código de máquina es cuando se supone que una declaración debe realizar alguna operación que realmente no se puede hacer de otra manera. Por ejemplo, si un intérprete BÁSICO que se ejecuta en el 8080 encuentra la instrucción "OUT 100.5", normalmente realizaría esa operación almacenando D3 64 C9 (OUT 64h/RET) en tres bytes consecutivos en una dirección fija, cargando A con 5, y LLAMANDO a esa dirección. El intérprete puede generar técnicamente código de máquina, pero si uno realizara la misma instrucción OUT 500 veces, el intérprete tendría que volver a generar el código de máquina cada vez.

1

Cuando la primera vez que se hace referencia a una clase el motor de ejecución JIT vuelve a compilar los archivos .class (Binarios primarios) generados por el compilador Java que contiene el conjunto de instrucciones JVM en binarios que contienen el conjunto de instrucciones del sistema HOST. JIT almacena y reutiliza los binarios recompilados de la memoria en el futuro, reduciendo el tiempo de interpretación y los beneficios de la ejecución de código nativo.

Por otro lado, un antiguo intérprete de Java simple interpreta una instrucción JVM del archivo de clase a la vez y llama a un procedimiento en su contra.

Encuentra una comparación detallada aquí http://bitshub.blogspot.com/2010/01/Flavors-of-JVM.html

22

Siempre he encontrado que una explicación más abstracta a veces ayuda. Digamos que estás tratando de preguntar a todos en México "Hola. ¿Cómo estás?" (su idioma fuente) Por supuesto, primero tendrá que traducirlo al español (idioma nativo del país). Esa traducción sería "Hola. Como estas?"

Si conoce español, no habría necesidad de traducir (código nativo/ensamblador). Solo pregunta "Hola. ¿Como estas?"

Si no sabes español, hay 3 formas de manejarlo.

La primera es obtener un diccionario en español (un compilador ) y buscar las palabras en español antes de ir. Tal vez te das cuenta de que "Hola, Que tal?" es una sílaba más corta (optimización del compilador) y la usa en su lugar. Esta es compilación de lenguaje; está convirtiendo la información al idioma nativo de antemano.

El segundo es cuando busca las palabras en el diccionario español mientras está delante de la primera persona y almacena el resultado (buscando las palabras just-in-time). La ventaja aquí es que puedes obtener un diccionario de mandarín y luego hacer el mismo experimento en China sin tener que guardar diez notas adhesivas (binarios para diferentes plataformas) de frases traducidas.

La tercera es donde busca las palabras mientras se para frente a cada persona.Básicamente, interpretas las palabras para cada persona por separado (actúas como un intérprete ). La ventaja aquí es que cualquier cambio se refleja instantáneamente con la siguiente persona (puede cambiar a preguntar "Hola, ¿de qué color es su perro?" Sin tener que volver a casa y reiniciar; no es necesario que recompile las frases) .

  • La traducción de antemano significa que se puede pedir a las personas de más rápido (pre-compiliation); no necesitas traer el diccionario contigo.
  • Traducir cuando ve la primera persona en cada país es casi tan rápido como traducir de antemano, pero aún le permite viajar a varios países sin necesidad de ir a su casa para obtener un diccionario, pero significa que debe traer consigo varios diccionarios (un tiempo de ejecución independiente de la plataforma).
  • La traducción bajo demanda es mucho más lenta pero le permite cambiar las palabras sin tener que desplazarse a su casa (fuente de lenguaje distribuido).
+1

Impresionante, me encanta esta respuesta. Todos los demás son demasiado técnicos y confundirían a los no programadores. –

0

tl; dr

intérprete: sólo se necesita una instrucción a la vez para la ejecución

justo a tiempo: toma un bloque de código a la vez y compilar antes de ejecutar . así que tiene mucho espacio para la optimización

Cuestiones relacionadas