compiler-construction jit

compiler construction - ¿Qué hace un compilador JIT?



compiler-construction (9)

Entonces, ¿cuál es el deber de un compilador JIT?

Como otros mencionaron, es la abreviatura de "Just In Time", que en este sentido significa "Justo a tiempo para la ejecución".

Cuando compila programas para código de máquina, a menudo se dirigen a una plataforma determinada.

Por lo tanto, JIT fue "Inventado", quiere compilar los últimos fragmentos de su código para la plataforma de ejecución, por lo tanto, vea esto como un "compilador / optimizador de antes de la ejecución".

JIT hace que nuestras vidas sean más fáciles y hace (con suerte) que nuestras aplicaciones se ejecuten más rápido.

Por supuesto, hay otros propósitos de compilación JIT , lo anterior es solo uno de ellos.

Solo estaba viendo los videos de Google IO y hablaron sobre el compilador JIT que incluyeron en el Android. Mostraron una demostración de mejoras de rendimiento gracias al compilador JIT. Me preguntaba qué hace exactamente un compilador JIT y quería escuchar de diferentes personas.

Entonces, ¿cuál es el deber de un compilador JIT?


Duda Sir si javac es un compilador de Java, su función es convertir el código fuente a código de bytes significa que .Class y luego .class (código de bytes) es interpretado por el intérprete de Java (Java) significa por JVM y JIT es la parte de JVM, entonces lo que es su trabajo real


El código Java se distribuye normalmente como bytecode, que es un pseudocódigo independiente de la máquina . (La misma idea se utilizó anteriormente en el sistema UCSD-p desarrollado en los años 70). La ventaja de esto es que la misma aplicación se puede ejecutar en diferentes procesadores y sistemas operativos. Además, el bytecode es a menudo más pequeño que la aplicación compilada.

La desventaja es que la interpretación del código es lenta en comparación con la ejecución del código compilado. Para resolver este problema, se desarrolló el compilador JIT . El compilador JIT compila el código en código máquina justo antes de que se ejecute el código. Esto acelera la ejecución en comparación con el intérprete, pero se gasta tiempo adicional para compilar cada vez que se ejecuta el programa. Además, como el compilador JIT debe compilar rápidamente, no puede usar técnicas de optimización complejas que se usan en compiladores estáticos.

Otro enfoque es la compilación de HotSpot . Inicialmente se ejecuta como intérprete, pero luego detecta qué rutinas se usan con más frecuencia y las compila solo. La ventaja es que no hay un retraso inicial debido a la compilación. Además, el compilador HotSpot puede hacer perfiles durante la ejecución y luego emitir una optimización más fuerte para las rutinas más importantes. Incluso puede recopilar información para que cuando ejecute la misma aplicación una y otra vez, se ejecute cada vez más rápido. Se puede encontrar más información sobre la compilación de HotSpot a partir de este artículo (txx Pangea para el enlace).

Por supuesto, en lugar de usar el compilador JIT, puede usar un compilador estático para compilar el bytecode de su máquina. Esto permite una optimización completa y luego no necesita compilar de nuevo cada vez que ejecuta la aplicación. Sin embargo, en teléfonos y páginas web, a menudo solo ejecuta el código (o applet) una vez, por lo que el compilador JIT puede ser una mejor opción.

Actualizar

Los archivos de código de bytes Python tienen la extensión .py. Cuando ejecuta el archivo de código de bytes, el compilador Python JIT produce el archivo compilado .pyc. La próxima vez que ejecute el mismo programa, si el archivo .py no ha cambiado, no hay necesidad de compilarlo nuevamente, sino que Python ejecuta el archivo .pyc previamente compilado. Esto acelera el inicio del programa.


El compilador Just-In-Time (JIT) es un componente de Java ™ Runtime Environment que mejora el rendimiento de las aplicaciones Java en tiempo de ejecución.

Consulte la documentación de IBM here .

El intérprete básicamente hace esto:

  1. Lea el siguiente bytecode para ser ejecutado
  2. Mire qué es el bytecode y encuentre la (s) instrucción (es) de máquina nativa que le corresponden
  3. Ejecute las instrucciones de máquina nativa (s)
  4. Ir al paso 1

Eso es simple, funciona bien y ejecutará su programa Java. Pero también es ineficaz, ya que al buscar las instrucciones nativas para cada bytecode que se va a ejecutar, se procesa el tiempo de procesamiento. Entonces, la JVM contiene un segundo mecanismo, el compilador Just-In-Time, que básicamente hace esto:

  1. Lea todos los códigos de bytes para el método que debe ejecutarse
  2. Convierta todos los bytecodes en instrucciones nativas de la máquina
  3. Ejecute las instrucciones de la máquina nativa generadas

Después de convertir los códigos de bytes de un método en instrucciones nativas de máquina, la JVM recuerda ese código nativo, de modo que la próxima vez que se ejecute el método, simplemente puede ejecutar las instrucciones nativas, no necesita convertir los códigos de bytes. cada vez que se ejecuta el método. Esto hace que el programa se ejecute mucho más rápido.

Además, el JIT realiza muchas optimizaciones para generar código nativo que se ejecuta lo más rápido posible.


Es un compilador just-in-time, a mitad de camino entre un intérprete y un compilador (es decir, compila, pero justo antes de que se ejecute el código).

Esto permite la optimización de la compilación utilizando información dinámica solo conocida en el tiempo de ejecución (ya que los compiladores generalmente se ejecutan estáticamente y, por lo tanto, solo tienen acceso a la información en tiempo de compilación). Son mucho más difíciles de escribir, pero pueden proporcionar grandes mejoras de rendimiento.

Para obtener más información, como siempre, vea Wikipedia :

En informática, la compilación justo a tiempo (JIT), también conocida como traducción dinámica, es una técnica para mejorar el rendimiento en tiempo de ejecución de un programa informático. Tradicionalmente, los programas de computadora tenían dos modos de operación en tiempo de ejecución, compilación interpretada o estática (anticipada). El código interpretado se tradujo de un lenguaje de alto nivel a un código de máquina continuamente durante cada ejecución, mientras que la compilación estática traducía el código en el código de máquina antes de la ejecución, y solo requería esta traducción una vez.

Los compiladores JIT representaban un enfoque híbrido, con la traducción ocurriendo continuamente, como con los intérpretes, pero con el caché del código traducido para minimizar la degradación del rendimiento. También ofrece otras ventajas sobre el código compilado estáticamente en el momento del desarrollo, como el manejo de los tipos de datos enlazados tardíamente y la capacidad de hacer cumplir las garantías de seguridad.


JIT = Justo a tiempo. Es un proceso mediante el cual un programa que de otro modo sería interpretado (p. Ej., Bytecodes Java o código Javascript) se convierte en código máquina nativo sobre la marcha a medida que se ejecuta para mejorar el rendimiento.

Algunos de los beneficios son que el compilador JIT puede ver los puntos de acceso y aplicar optimizaciones más agresivas, también puede aprovechar cualquier extensión que el procesador actual tenga como SSE2.

Esta pregunta puede tener más información: ¿Cómo un compilador JIT ayuda al rendimiento de las aplicaciones?


JIT es la abreviatura de "justo a tiempo". Un compilador JIT compila código, que a menudo está en un lenguaje intermedio como bytecode de Java o Microsoft IL, en código ejecutable nativo, y lo hace en el momento en que se llama al código. Hasta que se invoca el código, existe solo en bytecode portátil o no específico de máquina o IL, y luego cuando se llama, se genera código nativo (que luego se vuelve a utilizar en llamadas posteriores).


Muy buena explicación:

"En la práctica, los métodos no se compilan la primera vez que se llaman. Para cada método, la JVM mantiene un recuento de llamadas, que se incrementa cada vez que se llama al método. La JVM interpreta un método hasta que supera el límite de compilación JIT Por lo tanto, los métodos de uso frecuente se compilan poco después de que la JVM se haya iniciado y los métodos menos utilizados se compilan mucho más tarde o no se compilan en absoluto. El umbral de compilación de JIT ayuda a la JVM a comenzar rápidamente y aún mejora el rendimiento. cuidadosamente seleccionado para obtener un equilibrio óptimo entre los tiempos de inicio y el rendimiento a largo plazo.

Después de compilar un método, su recuento de llamadas se restablece a cero y las llamadas posteriores al método continúan incrementando su recuento. Cuando el recuento de llamadas de un método alcanza un umbral de recompilación JIT, el compilador JIT lo compila por segunda vez, aplicando una selección de optimizaciones mayor que en la compilación anterior. Este proceso se repite hasta que se alcanza el nivel máximo de optimización. Los métodos más activos de un programa Java siempre se optimizan de forma más agresiva, maximizando los beneficios de rendimiento del uso del compilador JIT. El compilador JIT también puede medir datos operacionales en tiempo de ejecución y usar esos datos para mejorar la calidad de otras recompilaciones.

El compilador JIT se puede desactivar, en cuyo caso se interpretará todo el programa Java. No se recomienda deshabilitar el compilador JIT, excepto para diagnosticar o solucionar problemas de compilación JIT ".

Fuente: https://www-01.ibm.com/support/knowledgecenter/SSYKE2_7.0.0/com.ibm.java.aix.71.doc/diag/understanding/jit_overview.html


Un compilador JIT suele ser la última parte de la canalización de una VM y genera un código de máquina del lenguaje de intermediario de la VM.

Mejora la velocidad optimizando el código generado para el entorno en el que se ejecuta (instrucciones específicas de la CPU, tamaño de la memoria caché, ...).

Los compiladores tradicionales también optimizan el código máquina generado, pero tienen que hacerlo sin tener en cuenta los recursos específicos que estarán disponibles en tiempo de ejecución.