Pregunta

¿Qué hace específicamente un compilador JIT a diferencia de un compilador que no es JIT?¿Alguien puede dar una descripción concisa y fácil de entender?

¿Fue útil?

Solución

Se ejecuta un compilador JIT después el programa se ha iniciado y compila el código (normalmente código de bytes o algún tipo de instrucciones de VM) sobre la marcha (o justo a tiempo, como se le llama) en una forma que suele ser más rápida, normalmente el conjunto de instrucciones nativas de la CPU del host.Un JIT tiene acceso a información dinámica de tiempo de ejecución, mientras que un compilador estándar no lo tiene y puede realizar mejores optimizaciones, como funciones integradas que se utilizan con frecuencia.

Esto contrasta con un compilador tradicional que compila todo el código al lenguaje de máquina antes el programa se ejecuta por primera vez.

Parafraseando, los compiladores convencionales crean todo el programa como un archivo EXE ANTES de ejecutarlo por primera vez.Para programas de estilo más nuevos, se genera un ensamblado con pseudocódigo (código p).Solo DESPUÉS de ejecutar el programa en el sistema operativo (por ejemplo, al hacer doble clic en su icono), el compilador (JIT) se activará y generará código de máquina (código m) que el procesador basado en Intel o lo que sea entenderá.

Otros consejos

Al principio, un compilador era responsable de convertir un lenguaje de alto nivel (definido como de nivel superior al ensamblador) en código objeto (instrucciones de máquina), que luego se vincularía (mediante un vinculador) a un ejecutable.

En un momento de la evolución de los lenguajes, los compiladores compilarían un lenguaje de alto nivel en pseudocódigo, que luego sería interpretado (por un intérprete) para ejecutar su programa.Esto eliminó el código objeto y los ejecutables, y permitió que estos lenguajes fueran portátiles a múltiples sistemas operativos y plataformas de hardware.Pascal (que compiló en P-Code) fue uno de los primeros;Java y C# son ejemplos más recientes.Finalmente, el término código P fue reemplazado por código de bytes, ya que la mayoría de las pseudooperaciones tienen una longitud de un byte.

Un compilador Just-In-Time (JIT) es una característica del intérprete en tiempo de ejecución, que en lugar de interpretar el código de bytes cada vez que se invoca un método, compilará el código de bytes en las instrucciones del código de máquina de la máquina en ejecución y luego lo invocará. código objeto en su lugar.Idealmente, la eficiencia de ejecutar código objeto superará la ineficiencia de recompilar el programa cada vez que se ejecuta.

JIT-solo con el tiempo, la palabra en sí misma dice cuándo es necesario (bajo demanda)

Escenario típico:

El código fuente se convierte completamente en código de máquina.

Escenario JIT:

El código fuente se convertirá a una estructura similar a un lenguaje ensamblador [por ejemplo, IL (lenguaje intermedio) para C#, ByteCode para Java].

El código intermedio se convierte a lenguaje de máquina solo cuando la aplicación lo necesita. Los códigos requeridos solo se convierten a código de máquina.

Comparación entre JIT y no JIT:

  • En JIT, no todo el código se convierte en el código de la máquina primero, una parte del código que es necesario se convertirá en código de máquina, entonces si un método o funcionalidad llamado no está en la máquina, entonces se convertirá en el código de la máquina ...Reduce la carga sobre la CPU.

  • Como el código de la máquina se generará en el tiempo de ejecución ... el compilador JIT producirá un código de máquina que está optimizado para ejecutar la arquitectura CPU de la máquina.

Ejemplos JIT:

  1. En Java JIT está en JVM (Java Virtual Machine)
  2. En C# está en CLR (Common Language Runtime)
  3. En Android está en DVM (Dalvik Virtual Machine) o ART (Android RunTime) en versiones más nuevas.

Como otros han mencionado

JIT significa Justo a tiempo, lo que significa que el código se compila cuando es necesario, no antes del tiempo de ejecución.

Solo para agregar un punto a la discusión anterior, JVM mantiene un recuento de cuántas veces se ejecuta una función.Si este recuento excede un límite predefinido, JIT compila el código en lenguaje de máquina que puede ser ejecutado directamente por el procesador (a diferencia del caso normal en el que javac compila el código en código de bytes y luego java: el intérprete interpreta este código de bytes línea por línea y lo convierte en código de máquina y se ejecuta).

Además, la próxima vez que se calcula esta función, el mismo código compilado se ejecuta nuevamente, a diferencia de la interpretación normal en la que el código se interpreta nuevamente línea por línea.Esto hace que la ejecución sea más rápida.

El compilador JIT solo compila el código de bytes en código nativo equivalente en la primera ejecución.En cada ejecución sucesiva, la JVM simplemente utiliza el código nativo ya compilado para optimizar el rendimiento.

enter image description here

Sin el compilador JIT, el intérprete JVM traduce el código de bytes línea por línea para que parezca como si se estuviera ejecutando una aplicación nativa.

enter image description here

Fuente

JIT significa Justo a tiempo, lo que significa que el código se compila cuando es necesario, no antes del tiempo de ejecución.

Esto es beneficioso porque el compilador puede generar código optimizado para su máquina en particular.Un compilador estático, como el compilador de C promedio, compilará todo el código en código ejecutable en la máquina del desarrollador.Por lo tanto, el compilador realizará optimizaciones basadas en algunas suposiciones.Puede compilar más lentamente y realizar más optimizaciones porque no ralentiza la ejecución del programa para el usuario.

Una vez que el compilador de Java haya generado el código de bytes (que es de arquitectura neutral), la ejecución será manejada por la JVM (en Java).El cargador cargará el código de bytes en la JVM y luego se interpretará cada instrucción de byte.

Cuando necesitamos llamar a un método varias veces, necesitamos interpretar el mismo código muchas veces y esto puede llevar más tiempo del necesario.Entonces tenemos los compiladores JIT (justo a tiempo).Cuando el byte se haya cargado en la JVM (su tiempo de ejecución), todo el código se compilará en lugar de interpretarse, lo que ahorrará tiempo.

Los compiladores JIT funcionan sólo durante el tiempo de ejecución, por lo que no tenemos ninguna salida binaria.

Compilador justo a tiempo (JIT):
Compila los códigos de bytes de Java en instrucciones de máquina de esa CPU específica.

Por ejemplo, si tenemos una declaración de bucle en nuestro código Java:

while(i<10){
    // ...
    a=a+i;
    // ...
 }

El código de bucle anterior se ejecuta 10 veces si el valor de i es 0.

No es necesario compilar el código de bytes 10 veces una y otra vez, ya que la misma instrucción se ejecutará 10 veces.En ese caso, es necesario compilar ese código solo una vez y el valor se puede cambiar la cantidad de veces requerida.Por lo tanto, el compilador Just In Time (JIT) realiza un seguimiento de dichas declaraciones y métodos (como se dijo anteriormente) y compila dichos fragmentos de código de bytes en código de máquina para un mejor rendimiento.

Otro ejemplo similar es la búsqueda de un patrón utilizando "Expresión regular" en una lista de cadenas/oraciones.

JIT Compiler no compila todo el código en código de máquina.Compila código que tiene un patrón similar en tiempo de ejecución.

Mira esto Documentación de Oracle sobre cómo comprender JIT para leer más.

Tiene un código compilado en algún IL (lenguaje intermedio).Cuando ejecuta su programa, la computadora no comprende este código.Sólo entiende código nativo.Entonces, el compilador JIT compila su IL en código nativo sobre la marcha.Lo hace a nivel de método.

Sé que este es un hilo antiguo, pero la optimización del tiempo de ejecución es otra parte importante de la compilación JIT que no parece tratarse aquí.Básicamente, el compilador JIT puede monitorear el programa mientras se ejecuta para determinar formas de mejorar la ejecución.Luego, puede realizar esos cambios sobre la marcha, durante el tiempo de ejecución.Optimización JIT de Google (javaworld tiene una bonita buen artículo al respecto.)

JIT representa justo en el tiempo, el compilador JIT es un programa que convierte el código de byte Java en instrucciones que se pueden enviar directamente al procesador.

El uso del compilador justo a tiempo de Java (en realidad, un segundo compilador) en la plataforma del sistema particular convierte el código de bytes en un código de sistema particular, una vez que el compilador jit ha vuelto a compilar el código, generalmente se ejecutará más rápidamente en la computadora.

El compilador justo a tiempo viene con la máquina virtual y se utiliza de forma opcional.Compila el código de bytes en un código ejecutable específico de la plataforma que se ejecuta inmediatamente.

Un compilador justo a tiempo (JIT) es una pieza de software que recibe una entrada no ejecutable y devuelve el código de máquina apropiado para ejecutar.Por ejemplo:

Intermediate representation    JIT    Native machine code for the current CPU architecture

     Java bytecode            --->        machine code
     Javascript (run with V8) --->        machine code

La consecuencia de esto es que para una determinada arquitectura de CPU debe instalarse el compilador JIT adecuado.

Compilador, intérprete y JIT de diferencias

Aunque puede haber excepciones en general cuando queremos transformar código fuente en código máquina podemos utilizar:

  1. Compilador:Toma el código fuente y devuelve un ejecutable.
  2. Intérprete:Ejecuta el programa instrucción por instrucción.Toma un segmento ejecutable del código fuente y convierte ese segmento en instrucciones de máquina.Este proceso se repite hasta que todo el código fuente se transforma en instrucciones de máquina y se ejecuta.
  3. JIT:Son posibles muchas implementaciones diferentes de un JIT; sin embargo, un JIT suele ser una combinación de un compilador y un intérprete.El JIT primero gira los datos intermediarios (p. ej.Código de bytes de Java) que recibe en lenguaje de máquina mediante interpretación.Un JIT a menudo puede detectar cuándo una determinada parte del código se ejecuta con frecuencia y compilará esta parte para una ejecución más rápida.

Un compilador que no es JIT toma el código fuente y lo transforma en código de bytes específico de la máquina en el momento de la compilación.Un compilador JIT toma el código de bytes independiente de la máquina que se generó en el tiempo de compilación y lo transforma en código de bytes específico de la máquina en tiempo de ejecución.El compilador JIT que utiliza Java es lo que permite que un único binario se ejecute en multitud de plataformas sin modificaciones.

La compilación justo a tiempo (JIT), (también traducción dinámica o compilación en tiempo de ejecución), es una forma de ejecutar código informático eso implica compilación durante la ejecución de un programa – en tiempo de ejecución – en lugar de antes de la ejecución.

La compilación de TI es una combinación de Los dos enfoques tradicionales para la traducción a código de máquina: compilación anticipada (AOT), y interpretación – y combina algunas ventajas y desventajas de ambos. La compilación JIT combina la velocidad del código compilado con la flexibilidad de interpretación..

Consideremos JIT utilizado en JVM,

Por ejemplo, los compiladores JVM JIT de HotSpot generan optimizaciones dinámicas.En otras palabras, Toman decisiones de optimización mientras la aplicación Java se está ejecutando y generan instrucciones de máquina nativas de alto rendimiento. dirigido a la arquitectura del sistema subyacente.

Cuando se elige un método para la compilación, la JVM envía su código de bytes al compilador Just-In-Time (JIT).El JIT necesita comprender la semántica y la sintaxis del código de bytes antes de poder compilar el método correctamente.Para ayudar al compilador JIT a analizar el método, primero se reformula su código de bytes en una representación interna llamada árboles de seguimiento, que se parece más al código de máquina que al código de bytes.Luego se realizan análisis y optimizaciones en los árboles del método.Al final, los árboles se traducen a código nativo.

Un árbol de seguimiento es una estructura de datos que se utiliza en la compilación en tiempo de ejecución del código de programación.Los árboles de seguimiento se utilizan en un tipo de 'compilador justo a tiempo' que rastrea el código que se ejecuta durante los puntos de acceso y lo compila.Referirse este.

Referirse :

El 20% del código de bytes se utiliza el 80% del tiempo.El compilador JIT obtiene estas estadísticas y optimiza este 20% del código de bytes para que se ejecute más rápido agregando métodos en línea, eliminando bloqueos no utilizados, etc. y también creando el código de bytes específico para esa máquina.Cito este artículo, me resultó útil. http://java.dzone.com/articles/just-time-compiler-jit-hotspot

JIT se refiere al motor de ejecución en algunas implementaciones de JVM, uno que es más rápido pero requiere más memoria, es un compilador justo a tiempo.En este esquema, los códigos de bytes de un método se compilan en código de máquina nativo la primera vez que se invoca el método.Luego, el código de máquina nativo del método se almacena en caché, de modo que pueda reutilizarse la próxima vez que se invoque el mismo método.

En realidad, JVM realiza pasos de compilación durante el tiempo de ejecución por motivos de rendimiento.Esto significa que Java no tiene una separación clara entre compilación y ejecución.Primero realiza la llamada compilación estática del código fuente de Java al código de bytes.Luego, este código de bytes se pasa a la JVM para su ejecución.Pero la ejecución del código de bytes es lenta, por lo que la JVM mide la frecuencia con la que se ejecuta el código de bytes y cuando detecta un "punto de acceso" de código que se ejecuta con mucha frecuencia, realiza una compilación dinámica del código de bytes al código de máquina del código de "punto de acceso" (perfilador de punto de acceso).De manera tan efectiva, hoy en día los programas Java se ejecutan mediante la ejecución de código de máquina.

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