¿Cuál es la diferencia entre lenguaje compilado, interpretado y JIT (Just in Time)?

Ronaldo B.27 de julio de 20225 min de lectura

En este artículo

Cuando estamos aprendiendo programación, es muy común escuchar las expresiones “Lenguaje compilado” y “Lenguaje interpretado”. Es común incluso presenciar algunas conversaciones sobre cuál de estas opciones es la mejor y más ventajosa.

Pero quizás nos preguntemos: “¿Cuál es la diferencia entre estas estructuras, al final?” En este artículo vamos a explicar esta diferencia y también a mostrar las ventajas de cada una.

Para empezar, necesitamos recordar cuál es nuestro objetivo al crear un programa. Nuestro objetivo es que el código que desarrollamos sea ejecutado por la computadora y así podamos ver un resultado en la pantalla, no importa qué lenguaje de programación hayamos usado.

Para que el programa sea ejecutado por la computadora, necesita estar en un lenguaje que la CPU pueda entender. Y sabemos que la computadora no comprende los lenguajes de programación. Por ejemplo, no podemos decir que una computadora pueda leer PHP, JavaScript, Python o C++. La computadora entiende el lenguaje de máquina, basado en el sistema binario (0 y 1). Así, necesitamos transformar nuestro código en binario para que sea ejecutado. Para llegar a este objetivo, tenemos diferentes “estrategias” o arquitecturas. Podemos hacerlo 1) compilando nuestro código o 2) interpretándolo. Vamos a hablar sobre cada uno de ellos ahora.

Código Compilado

La primera opción que tenemos es compilar nuestro código. El verbo “compilar” puede dar la idea de convertir un objeto en otro. Así, podemos decir que el proceso de compilación implica convertir nuestro código a lenguaje de máquina a través de un programa llamado compilador.

El verbo “compilar” también puede significar condensar un vasto objeto en un resultado final. Esto nos ayuda a entender otro proceso que realiza el compilador. Convierte todo nuestro código de una vez. Es decir, selecciona nuestro código entero, lo convierte a binario y guarda el resultado en un único “paquete”, como si fuera un “archivo comprimido”, que se envía a nuestro cliente final ya listo para ser ejecutado. Un resumen de este proceso puede verse en la imagen a continuación:

Resumen de cómo funciona un código compilado

El proceso de compilación trae muchas ventajas. En primer lugar, el cliente final no tiene acceso al código fuente de nuestro proyecto, ya que solo recibe el código binario para ser ejecutado. Otra ventaja es el rendimiento. Como compilamos todo el código, no necesitamos repetir este proceso innecesariamente. Además, ya tendremos a mano todo lo que es necesario para la ejecución, lo que aumenta mucho la velocidad de este proceso.

Algunos ejemplos de lenguajes de programación que son compilados son C++ y Objective-C.

Código Interpretado

Otro tipo de código que tenemos es el código interpretado. Cuando pensamos en interpretar, puede que pensemos en alguien que trabaje como intérprete. Esto implica recibir una información de un lenguaje fuente y transmitirla de manera traducida a un lenguaje objetivo.

Un lenguaje interpretado ejecuta un proceso similar. Será interpretado a través de un programa llamado intérprete, que convertirá nuestro código a lenguaje de máquina. Sin embargo, este proceso ocurrirá poco a poco, ya que el intérprete realizará la conversión analizando línea por línea, y no el programa entero, a diferencia de lo que ocurre con el compilador.

La imagen a continuación trae un resumen del proceso de interpretación:

Resumen de cómo funciona un código interpretado

Podemos notar que el proceso de interpretación será más lento, ya que se ejecutará de manera repetida, y esto disminuye el rendimiento. Sabemos que nuestro usuario final probablemente no perciba esta diferencia de velocidad, ya que ocurre “debajo del capó”. Sin embargo, sabemos que este es un factor muy importante en cualquier programa.

Aún teniendo la desventaja del rendimiento, los lenguajes interpretados tienen la ventaja de ser más simples de “depurar”. Como la interpretación ocurre poco a poco, podemos visualizar más fácilmente los errores que pueden aparecer, y si constatamos algún problema, podemos resolverlo de inmediato. Esto es una ventaja del código interpretado en relación al compilado, que es más difícil de depurar, dado que el código se ejecuta todo de una vez.

Algunos ejemplos de lenguajes de programación que son interpretados son PHP, JavaScript y Python.

Después de este análisis, podemos estudiar los pros y contras de programas compilados e interpretados. Sin embargo, aún existe una tercera alternativa, que logra mezclar ambos conceptos y puede traernos muchos beneficios.

JIT - La unión de los dos conceptos

La próxima arquitectura que analizaremos es el JIT, que significa “Just in Time”. No confundas este término con el sistema de producción de Toyota, que popularizó el término ?. Aunque sea un término diferente, este concepto de programación tiene un objetivo similar al implementado por la automotriz japonesa. Este objetivo es optimizar la producción.

Cuando hablamos de JIT en programación, nos referimos a una técnica que implica mezclar conceptos de códigos compilados e interpretados. Con el JIT, seguimos interpretando los códigos. Sin embargo, también los compilaremos, pero solo la parte del código que utilizaremos en el momento de la ejecución. Esto representa un aumento muy grande en el rendimiento. Pues usaremos el proceso de compilación, que ya es rápido, y se ejecutará en partes aisladas del código, solo en el momento adecuado (“just in time”).

Así, tenemos a nuestra disposición “lo mejor de los dos mundos”. Tenemos la velocidad de la compilación junto con la simplicidad de depurar nuestro código.

Los lenguajes que implementaron la técnica del JIT notaron grandes cambios en el rendimiento de su código. Entre estos ejemplos están JavaScript y PHP a partir de la versión 8.

Conclusión

En este artículo aprendimos la diferencia entre lenguajes compilados e interpretados. Y también aprendimos sobre una técnica que aprovecha lo mejor de cada una de estas arquitecturas, el JIT. Esperamos que esta explicación haya podido ayudarnos a entender un poco mejor el proceso necesario para que un programa sea ejecutado. Con estos conceptos en mente, también estamos más preparados para decidir qué lenguajes utilizar, teniendo en cuenta sus arquitecturas y también las circunstancias y requisitos de cada proyecto en el que vayamos a trabajar.

Hasta el próximo artículo ?.

Sigue aprendiendo con Hcode

Regístrate en la plataforma de cursos y sigue las próximas guías del blog.