top of page
Foto del escritorBraulio Madrid

Diferencias entre lenguajes interpretados y compilados.



Hace poco al pasarme a #ZorínOS, no pude volver a instalar Unity, quizás si, pero ya no tenía ganas, el caso es que te encuentras en un limbo de querer aprender nuevas cosas, pero no sabes para donde tirar, entre todo eso está escoger el siguiente lenguaje que puedas aprender y que no vaya a estar en desuso en un futuro y luego también está que dicho lenguaje pueda servir al propósito para el que lo necesitas y aunque hay varios aspectos como la legibilidad del código, curva de aprendizaje, si es fuertemente tipado, si pertenece a un ecosistema cerrado o abierto etc. en este blog hablaré de la diferencia que hay entre interpretados y compilados.


Cualquiera que sea actualmente usuario de Linux, se habrá dado cuenta de que tiene al menos 2 o tres lenguajes con los que puede programar algo, además de blocs de notas que resaltan el código e incluso algunos #IDE básicos y con todas esas opciones empiezas a explorar los formatos que puede leer los lectores de textos y ves que hay un montón de opciones, solo pude entender la diferencia cuando me tocó manualmente compilar un lenguaje en C, se trata de una herramienta llamada #ecm o #unemc, que lo que hacen es tomar una imagen #ISO y transformarla a ecm a modo de compresión y al revés. En ese momento fue la primera vez que tenía un programa que funcionaba en Windows, pero no en Linux, tuve la suerte que el programa incluía el código fuente y pude crear un ejecutable funcional en Linux.


Este es un tema que quizás algunos programadores autodidactas lo han escuchado mencionar, mas o menos sabe de qué trata, pero tal vez no a profundidad. A continuación vamos a ver algo de historia, la diferencia de estos, y en que punto estamos actualmente.


Algo de historia.


Resulta que los circuitos integrados solo entienden en términos de voltajes, siendo cero iguales a no tener voltaje y uno como la presencia de voltaje, de igual manera para los procesadores, de ahí viene el concepto de bits, nosotros los humanos para poder entendernos con los microprocesadores y microcontroladores, creamos un lenguaje de bajo nivel llamado #Assembler, dicho lenguaje usa algunos alias como instrucciones, pero dichas instrucciones son bytes reservados con la que se hace operaciones de suma, resta, lectura y escritura de memoria etc.


Siendo el lenguaje mas simple en cantidad de instrucciones, pero al tiempo el mas engorroso de aprender y entender, porque debes decirle a la computadora paso a paso que hacer con cada dato. Hasta que la señora Grace Hooper en los años 50 dijo:

ya basta de programar con instrucciones, se deberia programar en ingles.

Se burlaron de ella, pero aun así se empeñó en crear en el año 1951 y 1952 y el primer compilador de la historia el sistema A-0 para la computadora UNIVAC I, que luego paso a ser B-0, los primeros lenguajes en usar estos compiladores fue Fortran y COBOL, convirtiéndose así en los primeros lenguajes de alto nivel y en los primeros lenguajes compilados.


¿Qué es un compilador?


Un compilador es un programa que toma el código fuente y lo traduce a lenguaje de máquina sin pasar por ensamblador, sino que es un ejecutable que puede leer directamente el procesador y ejecutarlo.


En este grupo están lenguajes como: C, C++, COBOL, Fortran, GO, Rust, Genie, Vala, D.


Con el tiempo resultó la necesidad de poder ver en tiempo de ejecución lo que hacen las instrucciones, sobre todo para el mundo web, siendo PHP y JavaScript los primeros lenguajes interpretados.


¿Qué es un lenguaje interpretado?


En lugar que haya un programa en medio que toma el código fuente y lo transforma en un binario, hay es un programa que escucha cada instrucción y la convierte en código binario y luego lo envía al procesador y este ejecuta la orden.


Esto lleva consigo un problema y es que penaliza el rendimiento y el consumo de memoria porque en lugar de mandar todo el programa en binario, para cargarse todo en memoria, este manda instrucción por instrucción, el intérprete está siempre alerta a escuchar la orden para traducirla.


Algunos lenguajes interpretados PHP anterior a la versión 8, JavaScript anterior al motor V8, Python, Ruby, etc.


En medio de estos dos conceptos, interpretado y compilado, nació el término de lenguajes intermedios.


¿Qué es un lenguaje intermedio?


Viendo que compilar hace programas mas rápidos, pero algo incómodo la depuración, porque para encontrar los errores siempre debes compilar y a medida que el programa crece, la compilación tarda mucho mas.


Al tiempo viendo que los intérpretes consumen algo de memoria, siempre están activos y los programas son mas lentos, pero con la ventaja de que se puede depurar el programa mas fácilmente y no tienes que esperar un montón cuando el programa crece (Runtime). Surgió el término #JIT (Just In Time) que es un híbrido de ambos conceptos.


Este toma el código y lo transforma en un archivo de lenguaje intermedio pero sin ser un binario, que luego es enviado a un intérprete que toma bloques de código y los compila en el momento. Esto no resulta en un programa que se ejecute mas rápido que en un lenguaje compilado, pero al tiempo puedes ver los cambios casi en tiempo real. Esto viene siendo tomar parte de las ventajas de ambos, tanto compilados como interpretados, con la ventaja que los bloques de código ya compilados, no necesitan ser recompilados de nuevo.


Algunos de los lenguajes intermedios son: Java, C#, JavaScript V8, PHP 8, Kotlin, Scala, etc.


Estudiando el caso de Java, este compila un lenguaje intermedio llamado #ByteCode (no bits sino Bytes) y luego este es enviado a la #JVM (máquina virtual de Java) y luego este es enviado al procesador.


En el caso de C#, el código se compila al #MSIL (lenguaje intermedio de Microsoft) y luego es enviado al .NET(máquina virtual de Microsoft) y luego al procesador.


AOT vs JIT.


#AOT (Ahead Of Time) se refiere a los lenguajes compilados de toda la vida y como lo mencionamos arriba JIT (Just In Time) se refiere a los lenguajes interpretados e intermedios.


Resulta que Oracle demando a Google por usar la máquina virtual de java (JVM) en el sistema operativo Android, con lo que Google respondió creando su propia máquina virtual llamada #Dalvik, todas las aplicaciones para Android en ese momento eran JIT, pero con las nuevas versiones de Android, ya cuenta con su propio compilador #ART(Android Runtime) que viene siendo un AOT, entonces es curioso que las aplicaciones cuando están en la tienda son un código intermedio, pero apenas se instalan, se compilan y se convierten en aplicaciones nativas.


Ejemplos #Flutter crea aplicaciones nativas de Android AOT y #ReactNative es casi nativo, pero no del todo, es un JIT.


Conclusiones:


Actualmente me encuentro investigando y clasificando varios de los lenguajes que usa #Geany y #Gedit, quiero intentar hacer un cuadro que explique mejor a modo de mapa y que ayude a escoger mas fácilmente un lenguaje adecuado para el proyecto que tengas pensado en mente.


Yo ya he hecho mis elecciones a aprender en el blog de los 8 lenguajes que recomiendo sin importar la época, también puedes ver el índice TYOBE o las encuestas de GitHub, pero prometo que en próximos blogs te mostraré algunos lenguajes que incluso nunca has escuchado mencionar.


Como puedes ver, todo esto son términos enrevesados para explicar que el código se transforma en algo que un procesador pueda entender, ya sea algo completo o por porciones, este es sin duda el blog con mas acrónimos que he escrito, acrónimos que a los norteamericanos les encante, pero que lo único que hace es volver complejo algo que es fácil de explicar, todo esto para evitar peleas legales por derechos de autor o por mantener el misterio y que los demás no aprendan.


En fin no siendo mas, dale al like, comenta y nos vemos en un próximo blog.

コメント


bottom of page