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.
- Compilar el código a un Intermediate Language (IL) o Bytecode
- 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.