¿Cuál es la diferencia entre compilación e interpretación justo a tiempo?

Toda esta compilación de “interpretar” o “JIT” / “AOT” es un poco gris. Hay muy pocos escenarios de “solo el uno y no el otro”, y mucha superposición. Y dependiendo de cuán “correcto” desee ser, incluso la CPU “interpreta” el ejecutable binario compilado a través de GCC a partir del código fuente escrito en C De manera similar, cuando la mayoría de los intérpretes leen el archivo de texto, tienden a analizarlo en otra forma y lo almacenan en la RAM que luego “interpretan”; este paso en sí mismo podría clasificarse igualmente como “compilación”, ya que se traduce de un idioma a otro . Por lo tanto, hablar sobre estas ideas X vs Y vs Z puede tener poco significado, dependiendo de su punto de vista o requisitos.

Suponiendo que desea la diferencia entre un intérprete de script (como el corredor de script de archivo BAT en DOS / Windows) y un JIT (como en JVM en el entorno Java Runtime):

Teóricamente es solo una situación de JIT “cambiando” la fuente en instrucciones de CPU nativas cuando se ejecuta e interpreta usando la fuente para llamar a porciones de instrucciones ya nativas. En ambos casos, la fuente se lee y analiza para que el intérprete la “comprenda”, al menos una vez. Sin embargo, JIT puede renunciar a esta etapa de análisis una segunda o tercera vez y luego no necesita llamar a otras partes precompiladas, sino que simplemente envía la parte del código en RAM directamente a la CPU.

Sin embargo, la compilación (es decir, traducir de una fuente a otra, por ejemplo, códigos de bytes JVM en códigos de bits de CPU) lleva tiempo además de la fase de análisis. Entonces, para la primera ejecución, un intérprete tiene la capacidad de ejecutar el código más rápido. Pero en la próxima llamada de esa misma porción, el JIT tiene la ventaja, ya que luego omite tanto el análisis como la compilación: simplemente ejecuta el código como si normalmente se compilara antes de tiempo.

Nota al margen 1: La mayoría de los intérpretes “traducen” (sinónimo de compilación) la fuente en una fase de lectura / análisis en alguna estructura de memoria (generalmente algo así como un AST – Árbol de sintaxis abstracta). Esto es para que no necesite volver a leer el código cada vez que ejecuta una línea en particular. En efecto, este es un lenguaje intermedio, por lo que podría verse como un “JIT” en el sentido de que “compila” todo el código fuente cuando lo analiza, justo antes de que realmente lo ejecute. Hay algunos intérpretes que no hacen esto, por ejemplo, un intérprete de archivos BAT simplemente lee el archivo BAT y luego envía esos comandos (uno a la vez) a la consola para llamar a esos programas, la consola los interpreta desde cero cada vez, incluso cuando llamando al mismo programa una y otra vez. Es decir, está más cerca de ser un archivo que contiene las pulsaciones de teclas que el usuario habría escrito en la línea de comandos de la consola.

Nota al margen 2: JIT es un poco inapropiado. La mayoría (si no todos) los compiladores “JIT” son de hecho ODC (compiladores bajo demanda). No leen previamente la fuente y la compilan antes de que se ejecute. Eso sería demasiado derrochador y causaría un gran retraso antes de la primera carrera. Por lo tanto, la mayoría comenzaría a ejecutar el código como lo hacen los intérpretes normales, luego lo pasaría al compilador ya que “posiblemente sea necesario compilarlo”. El compilador luego (en su propio tiempo) compilará el código y alterará la versión en memoria de la fuente para que apunte al código compilado. La próxima vez que el intérprete quiera llamar a esa misma sección, verá: “Ah, esto ya está compilado, así que puedo usarlo directamente en lugar de llamar a varias cosas prefabricadas como se especifica en la fuente”. De esta manera, la primera carrera está muy cerca de la misma velocidad que un intérprete normal, por lo que se minimiza el retraso teórico.

Nota al margen 3: Algunos JIT requieren un paso de compilación AOT (Ahead of Time) a un idioma intermedio (generalmente el mencionado en la Nota al margen 1 anterior). Por ejemplo, la fuente Java debe compilarse en códigos de bytes JVM antes de que la JVM pueda “interpretarla”. Esos bytecodes son algo en lo que la etapa de lectura y análisis habría resultado si la JVM fuera un intérprete directo de Java, es decir, lo que almacenaría en su memoria una vez que leyera la fuente. Entonces, en estos, incluso la primera lectura / análisis se minimiza al extremo de simplemente cargarlo en la RAM en lugar de esta traducción en algo “significativo”. Otros (aquellos que pueden cargar directamente el archivo fuente de texto) pueden guardar este “nuevo lenguaje intermedio” analizado en un nuevo archivo para que no sea necesario rehacerlo cuando el programa se ejecuta por segunda vez. Por ejemplo, algunos de los intérpretes de Python guardan esto en un archivo PYC para que pueda cargarlo en lugar de volver a leer y analizar el archivo PY la próxima vez.

En primer lugar, háganos saber la diferencia entre el lenguaje compilado e interpretado.

Lenguaje interpretado
Ejemplo: JavaScript
Considere que estamos ejecutando un archivo con el nombre “add.js”. Para ejecutar este archivo. Este archivo se entrega a un software llamado Intérprete.
El intérprete hace lo siguiente.

  • Lea la primera línea de add.js.
  • Convierta la primera línea de add.js a binario. Ahora ejecuta este binario.
  • Lea la segunda línea de add.js.
  • Convierta la segunda línea de add.js a binario. Ahora ejecuta este binario.
  • Igualmente, haga lo mismo hasta la última línea del programa.

Entonces lea una línea del programa. Convierte la línea a binario.
Luego, sin almacenar el binario en algún lugar, ejecute el binario inmediatamente.
El lenguaje de programación que requiere un intérprete para ejecutarse. Ese lenguaje de programación se llama lenguaje interpretado.

Lenguaje compilado
Ejemplo: C, C ++.
Considere que estamos ejecutando un archivo con el nombre “add.c”. Para ejecutar este archivo. Este archivo se entrega a un software llamado Compilador.
El compilador hace lo siguiente.

  • Cree un archivo con el nombre “add.o”.
  • Lea la primera línea de “add.c” y convierta esta línea a binario. Almacene este binario en “add.o”.
  • Lea la segunda línea de “add.c” y convierta esta línea a binario. Almacene este binario en “add.o”.
  • Igualmente, haga lo mismo hasta la última línea del programa.
  • Este “add.o” se llama el archivo objeto. Contiene el código binario de cada línea en “add.c”.
  • Ahora se ejecuta la primera línea de “add.o”.
  • Luego se ejecuta la segunda línea de “add.o”.
  • Igualmente, se ejecutará la última línea de “add.o”.

Entonces lea una línea del programa. Convierte la línea a binario. Almacene el binario en algún lugar. Continúe este proceso hasta la última línea del programa. Luego ejecute cada línea binaria línea por línea.
El lenguaje de programación que requiere un compilador para ejecutarse. Ese lenguaje de programación se llama lenguaje compilado.

Java es lenguaje compilado e interpretado
Considere que estamos ejecutando un archivo con el nombre “add.java”. Para ejecutar este archivo. Este archivo se entrega a un software llamado javac. javac es un compilador.
javac hace lo siguiente.

  • Cree un archivo llamado “add.class”.
  • Lea la primera línea de “add.java”. Convierta esta línea en código de bytes. Almacene este código de byte en “add.class”.
  • Lea la segunda línea de “add.java”. Convierta esta línea en código de bytes. Almacene este código de byte en “add.class”.
  • Igualmente, haga lo mismo hasta la última línea del programa.

Entonces lea una línea del programa. Convierta la línea a código de byte. Almacene el código de bytes en alguna parte. Continúe este proceso hasta la última línea del programa. Esto no es más que compilación.

  • El archivo “add.class” contiene el código de bytes de cada línea en “add.java”.
  • El archivo “add.class” se entrega a un software llamado JVM. JVM es un intérprete.
  • JVM lee la primera línea de “add.class”. Convierta esta línea a binario. Luego ejecuta esta línea.
  • JVM lee la segunda línea de “add.class”. Convierta esta línea a binario. Luego ejecuta esta línea.
  • Igualmente, haga lo mismo hasta la última línea del programa.

El código de byte no es el código binario. No es un código java. Es un código intermedio. Java requiere un compilador (javac) para convertir el código de Java en código de bytes.
Java requiere un intérprete (JVM) para ejecutar el código de bytes. Dado que Java requiere tanto el compilador (javac) como el intérprete (JVM) para su ejecución, Java se llama lenguaje compilado e interpretado

Esta respuesta está tomada de 1. ¿Es Java un lenguaje compilado o interpretado?

JIT vs. Intérprete

La compilación Just In Time (también conocida como traducción dinámica o JIT) es una técnica utilizada en la informática para mejorar la calidad del rendimiento en tiempo de ejecución de un programa de computadora. Es la amalgama de dos ideas encontradas en entornos de tiempo de ejecución: compilación de Bytecode y compilación dinámica (que es un proceso que utilizan algunas implementaciones de lenguaje de programación para obtener rendimiento mientras un sistema ejecuta una acción).

Un intérprete describe con mayor precisión la ejecución de una acción a través de un programa informático. Hay algunas variaciones en el tipo de acciones que un intérprete ejecuta realmente: ejecuta directamente el código fuente de un programa; traduce el código fuente en una representación que es una representación intermedia eficiente, y luego ejecuta dicho código; ejecuta código precompilado que ha sido almacenado y creado por un compilador que forma parte del sistema de intérprete.

JIT tiene la capacidad de combinar las ventajas que se encuentran tanto en la interpretación como en la compilación estática (es decir, con anticipación). Como intérprete, JIT puede mejorar el rendimiento mediante el almacenamiento en caché de los resultados de bloques de código que se han traducido, en comparación con simplemente reevaluar cada línea u operando en el código cada vez que ocurre (como en el lenguaje interpretado). Al igual que el código de compilación estático en el momento del desarrollo, JIT puede recompilar el código si se considera que este es el plan de acción más ventajoso. Además, en la misma línea que la compilación estática, JIT es capaz de aplicar garantías de seguridad.

Al igual que los compiladores, los intérpretes tienen la capacidad de traducir código. Ambos son los métodos principales para implementar lenguajes de programación; sin embargo, las categorías de ‘compilador’ o ‘intérprete’ no son distintas (por sus roles duales como traductores de código). La desventaja más obvia de usar un intérprete es que una vez que se interpreta el código, el programa inevitablemente se ejecutará más lentamente que cuando simplemente compila el código; sin embargo, lleva mucho menos tiempo interpretar la codificación que compilarla y ejecutarla (especialmente pertinente al crear prototipos y probar el código).

En términos generales, JIT ofrece un rendimiento mucho mejor que los intérpretes y, en muchos casos, proporciona un rendimiento mucho mejor que los compiladores estáticos. Sin embargo, su superioridad sobre JIT no le impide tener algunas desventajas importantes: hay un ligero retraso al ejecutar inicialmente una aplicación (un efecto secundario de tomarse el tiempo para cargar y compilar el código de bytes). Eventualmente generará una mejor codificación; sin embargo, el retraso inicial inherente al hacerlo aumentará con la calidad de la codificación.

Resumen:

1. JIT es una técnica utilizada para mejorar la calidad del rendimiento del tiempo de ejecución en un entorno de tiempo de ejecución; Un intérprete define la ejecución de una acción a través de un programa informático.

2. JIT combina las ventajas de la interpretación y la compilación estática; Un intérprete puede traducir el código como un compilador, pero en detrimento de la velocidad del programa.

Hola,

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.

  • JIT se basa en dos ideas anteriores en entornos de tiempo 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, el código de bytes en código máquina nativo.

Un intérprete ejecuta un programa. Puede o no tener una inquietud.

Un intérprete puede ser un programa que

  • Ejecuta el código fuente directamente
  • Traduce el código fuente en alguna representación intermedia eficiente (código) e inmediatamente ejecuta esto
  • Ejecuta explícitamente el código precompilado almacenado hecho por un compilador que es parte del sistema de intérprete

Las distribuciones estándar Java y .NET tienen compilación JIT, pero los estándares no lo requieren. El compilador JIT en .NET y C # es, por supuesto, diferente porque el bytecode intermedio es diferente. Sin embargo, el principio es el mismo.

La mayoría de los programas en estos días están escritos en idiomas de nivel superior que son más fáciles de leer, escribir y comprender para los humanos. Sin embargo, esto también significa que estos programas deben traducirse al lenguaje de máquina antes de que puedan ejecutarse. La idea principal aquí es que cada instrucción de lenguaje de nivel superior generalmente corresponde a un conjunto de varias instrucciones de lenguaje de máquina más.

Con la compilación (anticipada), la traducción se realiza una vez antes de ejecutar el programa por primera vez.

En el caso de la interpretación, la traducción se realiza repetidamente cada vez que se ejecuta el programa y cada vez que se encuentra esa instrucción mientras el programa se está ejecutando.

Sin embargo, si pocas de las partes “de uso frecuente” del programa se traducen una vez y se guardan (en la memoria o en algún archivo temporal) para referencia futura, diríamos que fue una compilación JIT.

Además, hay muchos lenguajes populares como Java que funcionan con un enfoque de dos pasos. Al principio, se realiza una compilación que traduce el lenguaje de alto nivel a un formato intermedio. Este formato intermedio se puede interpretar completamente o interpretar junto con la compilación JIT.

La compilación JIT, como su nombre indica, es una compilación sobre la marcha de programas, especialmente los grandes proyectos que tienen múltiples dependencias. Esto se originó por la necesidad de reducir el tiempo entre ejecuciones de programas y ahora ha mejorado enormemente, incluida la resolución inteligente y la compilación de solo archivos modificados y sus dependencias modificadas. Algunos IDE también usan esto como una forma de detectar errores en el código. Esto está destinado principalmente a lenguajes compilados como Java y .NET.

La interpretación, por otro lado, es la ejecución en tiempo de ejecución de un programa. Si hay algún error, se encuentra solo cuando ejecuta el programa. Los ejemplos son PHP, Ruby, Python, etc. Por lo tanto, los lenguajes interpretados tienden a ser más lentos en términos de velocidad de ejecución, ya que la resolución de las variables y la gestión de la memoria se deben realizar en tiempo de ejecución en lugar de optimizarlas antes como en los lenguajes compilados.

Los compiladores son herramientas que convierten texto legible por humanos en código de máquina. Los términos Ahead-of-Time (AOT) y Just-in-Time (JIT) se refieren cuando se realiza la compilación: el “tiempo” al que se hace referencia en esos términos es “tiempo de ejecución”, es decir, un compilador JIT compila el programa tal como está En ejecución, un compilador AOT compila el programa antes de que se ejecute.

¿Cómo puede el código JIT ser más rápido que el código compilado AOT?

Dell

Un intérprete genera y ejecuta las instrucciones del 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 en el código de máquina, y reutiliza esas instrucciones de código de máquina nativas, ahorrando así tiempo y recursos al no tener que volver a interpretar las declaraciones que ya se han interpretado.

Alcance de la optimización. Un intérprete generalmente trabaja al nivel de las declaraciones del lenguaje o menos; un compilador JIT generalmente funciona al nivel de un bloque de declaraciones o superior.

Persistencia. Un intérprete toma las mismas decisiones una y otra vez, cada vez que se ejecuta una declaración; un compilador JIT toma decisiones que persisten en múltiples ejecuciones de la declaración.

Java Compiler (javac) compila el archivo .java y lo convierte en bytecode que es un archivo .class
Este bytecode es recibido por el motor de ejecución de la JVM
El intérprete dentro del motor de ejecución lee, interpreta y ejecuta el código, ya que cada código Java debe interpretarse una vez
Si el método se ejecuta solo una vez, es mejor interpretar y ejecutar porque la interpretación es rápida, pero la ejecución del código interpretado es lenta
Pero si el método se ejecuta repetidamente (verificado por el generador de perfiles en JVM dentro del compilador JIT), compile el código y ejecútelo porque la compilación es lenta, pero la ejecución del código nativo compilado es más rápida, por lo que el código nativo se puede ejecutar repetidamente
El compilador JIT convierte el código de bytes en código intermedio y, después de la optimización del código, lo convierte en código de máquina nativo

En interpretación , su intérprete ejecuta y ejecuta el programa paso a paso, que contiene toda la funcionalidad del lenguaje. Por ejemplo, si tiene un comando de impresión en su programa, el intérprete contiene el código para la funcionalidad de impresión dentro de él y lo utiliza para ejecutar su declaración de impresión .

En la compilación justo a tiempo , su programa se traduce en código de máquina. Es lo mismo que la compilación, excepto que ocurre justo cuando se ejecuta el programa, no cuando se escribe el programa. En este caso, su declaración de impresión se traducirá al código para imprimir cosas o a una instrucción de llamada que ejecute ese código desde una biblioteca.

La compilación JIT convierte el código de bytes en código de máquina y se ejecuta para que el código de máquina sea adecuado para cualquier arquitectura. Forma parte de JVM
La interpretación está ejecutando el código línea por línea, necesita un motor, su máquina depende y es lento.

Siempre me siento obligado a señalar que lo que los sistemas como la JVM llaman compilación “justo a tiempo” no lo es. Es una compilación a pedido. Si fuera justo a tiempo, el código compilado estaría allí listo para ejecutarse justo antes de que llegara la ejecución. Naturalmente, eso no se puede hacer.

La verdadera noción de justo a tiempo proviene de la fabricación de la logística de la cadena de suministro, donde se desea evitar tener grandes inventarios y, en cambio, tener solo suficientes materiales y piezas a mano para mantener su fábrica en funcionamiento durante el próximo corto tiempo.

Piense en cómo podría implementar esto, podría leer una instrucción, realizar alguna lógica para ejecutar la lógica, esto sería interpretación, o podría leer una instrucción, traducirla en algún código que pueda interpretarse más rápidamente o incluso en código de máquina y luego ejecutar ese código a partir de ese momento, ese JIT.

More Interesting

Si menciona en su currículum que tiene un nivel principiante de competencia en un lenguaje de programación en particular, ¿cuánto se espera que sepa?

Cómo lidiar con las preguntas cuando se hacen en entrevistas de programación pero no es posible resolverlas en una hora

¿Puedes sintaxis de Google durante una entrevista telefónica de codificación?

Cómo superar mi miedo al rechazo al asistir a entrevistas técnicas de codificación

¿Qué tan común es que se le pida que implemente la correspondencia de expresiones regulares en la entrevista?

¿Qué tipos de preguntas se hacen en la entrevista de IAS relacionadas con nuestro propio distrito?

¿Cómo se estructura una típica entrevista SDE2 en Amazon India o Microsoft India para un candidato experimentado de 9 años?

¿Cuál es la explicación y la prueba de la codiciosa solución en esta pregunta?

Cómo prepararse para las preguntas de la entrevista técnica de TCS

¿Cuáles son las preguntas sobre estructuras de datos formuladas en la entrevista?

Dada una matriz ordenada, ¿cómo encontrarías dos números cuya suma es igual a un número dado en O (n)?

¿Cuáles son los tipos de preguntas basadas en MapReduce que se hacen durante las entrevistas en Google?

¿Cómo debo prepararme para una entrevista de pasantía de ingeniero de software (o desarrollador) en IBM?

Siendo un estudiante de ingeniería mecánica, ¿cómo me preparo para la entrevista TCS?

¿Cuáles son algunas preguntas que un empleador podría hacer sobre Swift durante una entrevista de trabajo para desarrolladores de iOS? ¿Qué tipo de respuestas esperaría él o ella?