¿Qué hace un compilador justo a tiempo (JIT)?
¿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?
Un compilador JIT se ejecuta después de que 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 la nativa de la CPU del host. conjunto de instrucciones. 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 en lenguaje de máquina antes de ejecutar el programa 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). Sólo 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á.
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: justo a tiempo, la palabra misma dice cuando 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 código de máquina, primero una parte del código que es necesario se convertirá en código de máquina, luego, si un método o funcionalidad llamada no está en la máquina, entonces se convertirá en código de máquina... reduce carga sobre la CPU.
Como el código de máquina se generará en tiempo de ejecución... el compilador JIT producirá código de máquina optimizado para ejecutar la arquitectura de CPU de la máquina.
Ejemplos JIT:
- En Java JIT está en JVM (Java Virtual Machine)
- En C# está en CLR (Common Language Runtime)
- En Android está en DVM (Dalvik Virtual Machine) o ART (Android RunTime) en versiones más nuevas.