java - ejemplos - ¿Cuáles son las diferencias entre un compilador Just-in-Time y un intérprete?
bytecode java ejemplos (8)
Cuando compila un lenguaje Microsoft.NET, el compilador genera un código escrito en el lenguaje intermedio de Microsoft (MSIL). MSIL es un conjunto de instrucciones que se pueden traducir rápidamente a código nativo.
Una aplicación Microsoft.NET solo se puede ejecutar después de que el código MSIL se traduzca en código de máquina nativo. En .NET Framework, el lenguaje intermedio se cumple "justo a tiempo" (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.
¿Cuáles son las diferencias entre un compilador Just-in-Time y un intérprete, y existen diferencias entre el compilador .NET y el JIT de Java?
El compilador JIT produce códigos de máquina binarios que traducen el código fuente del bloque. Intérprete traduce línea por línea.
La pregunta de si un motor de ejecución es un compilador o un intérprete puede responderse de manera muy simple considerando qué sucede si una rutina se ejecuta 1,000 veces. Si el código dentro del motor de ejecución tendrá que examinar una 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 (normalmente, 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 a otra forma que pueda examinarse más fácilmente. Dicho motor de ejecución combinaría un compilador o traductor de la forma anterior con un intérprete de la forma anterior.
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á un código de máquina es cuando 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á esa operación almacenando D3 64 C9 (OUT 64h / RET) en tres bytes consecutivos en alguna dirección fija, cargando A con 5, y llamando a esa dirección. El intérprete puede técnicamente generar un código de máquina, pero si uno fuera a realizar la misma instrucción de SALIDA 500 veces, el intérprete tendría que volver a generar el código de la máquina cada vez.
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 de Java que contiene el conjunto de instrucciones JVM a los binarios que contienen el conjunto de instrucciones del sistema HOST. JIT almacena y reutiliza los binarios compilados de la memoria en el futuro, reduciendo el tiempo de interpretación y los beneficios de la ejecución del código nativo.
Por otro lado, un intérprete java antiguo interpreta una instrucción JVM de un archivo de clase a la vez y llama a un procedimiento en su contra.
Encuentre una comparación detallada aquí http://bitshub.blogspot.com/2010/01/Flavors-of-JVM.html
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 de origen ) Por supuesto, primero deberá traducirlo al español (el idioma nativo del país). Esa traducción sería "Hola. Como estas?"
Si sabe español, no sería necesario que traduzca ( código nativo / ensamblador ). Solo preguntas "Hola. ¿Cómo estas?"
Si no sabes español, hay 3 maneras de lidiar con eso.
Lo primero 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 usa eso en su lugar. Esto es compilación de lenguaje ; Usted está convirtiendo la información al idioma nativo de antemano.
El segundo es donde busca las palabras en el Diccionario en español mientras se encuentra frente a la primera persona y luego almacena el resultado (mirando las palabras justo a tiempo ). La ventaja aquí es que usted podría obtener un diccionario mandarín y luego hacer el mismo experimento en China sin tener que guardar diez notas adhesivas ( binarios para diferentes plataformas ) de frases traducidas.
El tercero es donde miras las palabras mientras estás parado frente a cada persona. En esencia, interpretas las palabras para cada persona por separado (actúas como intérprete ). La ventaja aquí es que cualquier cambio se refleja instantáneamente con la siguiente persona (podría cambiar a preguntar "Hola. ¿De qué color es su perro?" Sin tener que volar a casa y reiniciar, no necesita volver a compilar las frases).
- Traducir de antemano significa que puedes preguntar a las personas más rápido ( precompilación ); ni siquiera necesitas llevar el diccionario contigo.
- La traducción cuando se ve a la primera persona en cada país es casi tan rápida como la traducción previa, pero aún le permite viajar a varios países sin tener que ir a casa para obtener un diccionario, pero significa que necesita traer varios diccionarios ( una plataforma independiente tiempo de ejecución ).
- La traducción a pedido es mucho más lenta, pero le permite cambiar las palabras sin tener que viajar a casa ( idioma distribuido de origen ).
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 al código de la máquina, y reutiliza las instrucciones del código de la máquina nativa, lo que ahorra tiempo y recursos al no tener que reinterpretar las declaraciones que ya se han interpretado.
tl; dr
Intérprete : toma solo una instrucción a la vez para su ejecución
Just-in-time : toma un bloque de código a la vez y lo compila antes de ejecutarlo. Así que tiene mucho espacio para la optimización.
La compilación justo a tiempo es la conversión de código no nativo, por ejemplo, bytecode, en código nativo justo antes de que se ejecute.
De Wikipedia:
JIT se basa en dos ideas anteriores en entornos de ejecución: compilación de bytecode y compilación dinámica. Convierte el código en tiempo de ejecución antes de ejecutarlo de forma nativa, por ejemplo, bytecode en código de máquina nativo.
Un interpreter ejecuta un programa. Puede o no tener un jitter.
De nuevo, desde Wikipedia:
Un intérprete puede ser un programa que
- ejecuta el código fuente directamente
- traduce el código fuente en una representación intermedia eficiente (código) y lo ejecuta inmediatamente
- ejecuta explícitamente el código precompilado almacenado creado por un compilador que forma parte del sistema de intérprete
Tanto la distribución estándar de Java como la de .NET tienen compilación JIT, pero los estándares no lo requieren. El compilador JIT en .NET y C # son diferentes, por supuesto, porque el bytecode intermedio es diferente. Aunque el principio es el mismo.