Las diferencias entre un lenguaje compilado e interpretado en 10 minutos

No te ha pasado que vas camninando por la calle y te preguntas. –¿Cúal será la diferencia entre un lenguaje compilado y uno interpretado?– De seguro te ha pasado, es un problema muy común. Y si no pues…¿qué haces por aquí? Ve a a vivir la vida que ya la tienes resuelta.


Es importante que sepas que a pesar de que comúnmente se habla de que un lenguaje de programación es interpretado o compilado en realidad los lenguajes pueden comportarse de cualquiera de las 2 maneras. A ellos les da igual. Lo que pasa es que muchos de ellos se usan más comunmente de una manera específica y por eso a la gente se le olvida que lo podrían hacer de la otra forma.

Pero bueno realmente la mayoría de las veces no importa. Cuando uno programa se apega al comportamiento de las herramientas y rara vez necesita salirse del estándar.

Dicho esto es importante que entiendas la diferencia porque eso te hará mejor desarrollador.

Compilado

Un lenguaje compilado transforma tu código fuente a código binario. El propósito de ese código binario es ser ejecutado directamente por una plataforma en específico.

  • Código fuente a código binario
  • Se lee y ejecutan las instrucciones del código binario

Pros

1. Es más rápido

Al menos en comparación que un lenguaje interpretado.

Esto se debe a que el lenguaje binario es el favorito de las computadoras y si le das un montón de binario la computadora solo ejecuta todo lo que diga ese archivo…sin pensar ni nada…como un dron en esta sociedad. 🙁

2. El código fuente es privado

Esto es porque el código que se le da a la computadora es el binario. Entonces pues solo un robot podría leerlo. Un humano no podría comprender un archivo binario… ¿O si?

Contras

1. Requiere recompilaciones por cada plataforma

Se tiene que recompilar el programa para cada plataforma en la que se quiera correr. Por lo general cada combinación de Sistema Operativo-CPU.

Si vas a lanzar tu app para PC y para telefonos y para refrigeradores. Tienes que recompilar todo muchas veces y ser muy organizado para no mezclarlos. Y pues eso no suena dificíl, pero es laborioso y a los desarrolladores no nos gusta eso.

2. Es mas lento de debuggear

Para probar que todo funcione tienes que recompilar todo el código cada vez que se haga un cambio. Los programadores solemos, hacer muchos cambios así que esto en concepto esta de flojera.

Interpretado

Un lenguaje interpretado no transforma nada en un inicio. Espera que el código fuente se le pase a las plataformas que lo van a ejecutar y que estas misma plataformas “interpreten” el código, transformandolo a código binario conforme lo van procesando.

  • Se lee el código fuente, se interpreta y ejecuta
  • En cada paso de lectura se va creando el código binario, el cúal se usa para ejecutar las instrucciones

Pros

1. Fácil de desplegar

No se tiene que recompilar una versión específica para cada plataforma.

Lo único que tienes que hacer es darle tu código fuente a todas las plataformas y ya. No necesitas prepara uno para el refri y otro para el smartwatch. Correría igual en todos lados.

2. Fácil de debuggear

Como no tienes que recompilar el código completo para poder correrlo, el proceso para debuggear es mucho más rapido en comparación con un lenguaje compilado.

Contras

1. Es más lento

Es mas lento de ejectuar en comparación con un lenguaje compilado.

Esto debido a que las plataformas donde corren tienen que convertir el código fuente a código binario a medida que lo van ejecutando.

Esto a lo mejor no le queda claro a algunos PMs (Project Managers). Pero básicamente es el concepto de que pues si le das más trabajo a alguien pues se tarda más en terminarlo.

2. El código fuente es público

Obvio si le pasas el código fuente a cada plataforma, entonces todo mundo tiene acceso al mismo.

Esto es sumamente importante de recordar. Por eso luego uno encuentra chistes o nombres de variables con nombres…inapropiados en páginas públicas.


BONUS

Intermediate Language y JiT

Si estas de humor, si todavía te cabe un poquito más de información…pues sigue leyendo.

Sería bueno que sepas que se han creado soluciones para optimizar los lenguajes interpretados, las cuáles de manera muy general consisten en agregar un paso antes de generar el código binario.

  1. Compilar el código a un Intermediate Language (IL) o Bytecode
  2. Compilar el IL o Bytecode a código binario. Esto puede ser con una máquina virtual como JVM, un compilador JiT (Just in Time), etc.
  • Se compila el código al IL o Bytecode
  • Se lee el archivo generado se compila de nuevo y se ejecuta
  • En cada paso de lectura se va creando el código binario, el cúal se usa para ejecutar las instrucciones

No voy a ahondar más en este tema, porque no es la duda que te surgió en la calle. Pero es bueno que sepas que exista. Y quién sabe…tal vez algún día el universo te inspiré a aprender más sobre él.