Alguna vez te has preguntado, ¿por qué en lugar de existir miles de lenguajes de programación (sí, son miles, no decenas), no hay un solo lenguaje que haga el desarrollo de software más sencillo? Así no tendríamos que estresarnos con tantos lenguajes y habría menos errores y problemas de compatibilidad.
Sería un mundo ideal, por supuesto. Pero, ¿sería posible?.
Piensa que los lenguajes de programación son creaciones de seres humanos, no obras de la naturaleza, como las plantas o los animales. Por lo tanto, siempre puede existir una persona o empresa que diga: “voy a crear mi propio lenguaje”. Y luego otro y otro y otro. Hasta tener miles.
Pero, ¿cómo se crea un lenguaje de programación? ¿Existe un lenguaje para crear lenguajes? Y si así fuera, ¿cómo se creó el primer lenguaje?
Todas esas preguntas las vamos a responder en este blog, así que ponte cómodo para aprender alg nuevo, porque estás en EDteam y en español, #NadieTeExplicaMejor.
¿Por qué existen los lenguajes de programación?
Para entender por qué existen tantos lenguajes, lo primero que tenemos que entender es por qué existen los lenguajes de programación.
En un blog anterior, te expliqué que las computadoras solo entienden ceros y unos, los famosos bits. No voy a ahondar mucho en ese tema, así que si quieres una explicación detallada, lee nuestro blog.
El hecho es que, darle instrucciones a una computadora en ceros y unos, es enormemente lento y aburrido. Y como los humanos somos supercreativos y no nos gusta complicarnos, se crearon los lenguajes.
El primer lenguaje de programación es el Lenguaje ensamblador (o Assembly), creado a finales de la década del 1940 e inicios de 1950. Este lenguaje es un conjunto de abreviaturas para las instrucciones en binario que luego se convierten a ceros y unos con un programa llamado Ensamblador.
Recién en 1957 aparecieron los lenguajes de alto nivel, que son los que conocemos actualmente.
Los lenguajes de programación se pueden clasificar en alto y bajo nivel. Los de alto nivel son más cercanos al programador, es decir, son más fáciles de leer y de escribir, y abstraen muchas cosas de la computación. Eso significa que muchas cosas quedan ocultas al programador y se ejecutan por debajo, para simplificarle su trabajo. Los lenguajes que usas en el día a día son de alto nivel: JavaScript, Python, PHP, Java, etc.
Por otro lado, un lenguaje de bajo nivel es más cercano al procesador (a los fierros), lo que significa que no se abstraen conceptos, sino que se dan instrucciones detalladas, por lo que es más preciso pero más lento. El lenguaje de bajo nivel es ensamblador y hay un ensamblador diferente para cada tipo de computadora.
Esto explica por qué muchos programadores estaban aburridos de ensamblador y querían algo más sencillo que los hiciera más productivos. Así que en 1952, Grace Hopper y su equipo, desarrollaron el primer compilador: un software que era capaz de traducir instrucciones en un lenguaje parecido al inglés (y no tan complicado como ensamblador) en ceros y unos. Es decir, ella y su equipo trabajaron en el desarrollo del primer lenguaje de alto nivel: Flow Matic (aunque no tuvo un gran uso).
El primer lenguaje de alto nivel importante fue Fortran, lanzado en 1957, luego LISP en 1957 y Cobol en 1959.
En los años 70 y 80 se crearon los dos papás de casi todos los lenguajes modernos: C y C++. Con C se escribió el histórico sistema operativo UNIX (cuya historia conocer ver en este blog) y C++ fue una mejora a C, pues le agregaba programación orientada a objetos (que si no sabes qué es, puedes ver nuestra explicación aquí).
C y C++ fueron creados como lenguajes de alto nivel, pero en la actualidad, con tantos lenguajes más sencillos de entender (o sea de más alto nivel) se considera a C y C++ como lenguajes de medio nivel.
Desde ese entonces, hasta la actualidad, se han lanzado miles de lenguajes de programación, algunos que alcanzaron el Olimpo de la programación (C, C++, Python, Java, JavaScript, PHP, TypeScript, Kotlin, Swift, Go, etc.) y otros que se quedaron como meras curiosidades.
Compiladores e intérpretes
Recuerda que las computadoras no entienden los lenguajes de programación, solo ceros y unos. Entonces, estos lenguajes debe ser convertidos a ceros y unos. Esto se hace gracias a dos tipos de programas: los compiladores y los intérpretes.
Por ejemplo, ¿recuerdas el lenguaje ensamblador? Este debía ser ensamblado para convertirse a ceros y unos antes de ejecutarse. Es el mismo principio que usamos en todos los lenguajes.
Los compiladores se encargan de traducir el código a ceros y unos antes de ejecutarse. Si el código es muy grande, la compilación puede tomar un rato antes de poder probar el funcionamiento del código.
Mientras que los intérpretes se parecen más a un traductor en tiempo real, pues van traduciendo las instrucciones del lenguaje al mismo tiempo que este se ejecuta. No antes como los compilados. Con lo cual puedes probar el funcionamiento de tu código prácticamente al instante.
Viéndolo así, los lenguajes compilados son más veloces en su ejecución que los interpretados porque a la computadora se le entregan ceros y unos. Mientras que los interpretados deben ser traducidos en el momento.
Como curiosidad, lenguajes como Java, C# y sus derivados, se compilan pero no a binario, sino a un lenguaje intermedio que luego debe ser interpretado.
Mientras que lenguajes como C, C++ o Go, compilan directamente a binario. Eso hace a Go uno de los lenguajes modernos más poderosos y más demandados por las empresas. Y recuerda, lo puedes aprender en EDteam.
¿Cómo se crea un lenguaje de programación?
Ahora estás listo para entender cómo se crea un lenguaje de programación.
Simplificando mucho, el proceso consta de dos partes: el diseño del lenguaje (su sintaxis, tipos de datos, estructuras de control, etc.) y su implementación. Es decir, desarrollar el compilador o el intérprete.
La parte del diseño del lenguaje se enfoca en sus características a un nivel que podemos llamar teórico. Por ejemplo: ¿será compilado o interpretado? ¿qué tipos de datos aceptará? ¿cuáles serán sus estructuras de control y sus operadores? ¿cómo se gestionará la memoria? Todas estas interrogantes deben resolverse en la etapa de diseño.
Pero quizás la parte más importante son la gramática y sintaxis del lenguaje, porque es aquí donde se define qué símbolos se usarán (por ejemplo JavaScript usa llaves y puntos y comas, mientras que Python usa dos puntos e indentaciones). Además de cómo se combinarán estos símbolos y palabras clave para crear expresiones válidas en el lenguaje.
Así podemos decir que esta expresión es incorrecta en JavaScript porque los nombres de las variables no pueden comenzar en números.
let 1984 = "hola"
Al igual que esta otra que también es incorrecta porque function
es una palabra reservada del lenguaje que no se puede usar para nombrar variables.
let function = "hola"
La implementación, por su lado, consiste en desarrollar el compilador o el intérprete que traducirá este lenguaje en instrucciones para la computadora. La parte más importante de esta etapa es el análisis sintáctico o parsing (parseo para los amigos). El parsing se encarga de contrastar el código con las reglas de la gramática y sintaxis, ejecutar lo que cumpla las reglas y rechazar lo que no.
Es el análisis sintáctico (o parsing) lo que te hace mirar la pantalla por horas hasta encontrar el error.
¿Con qué lenguaje se programan los lenguajes de programación?
Como ya habrás notado, un lenguaje de programación, en teoría, puede desarrollarse con cualquier otro lenguaje. Aunque habrá lenguajes que te darán más herramientas y otros que no.
El primer lenguaje de alto nivel, Fortran, lanzado en 1957, fue implementado en lenguaje ensamblador porque no existían otros lenguajes en su tiempo.
El segundo lenguaje de alto nivel fue LISP, diseñado por John MacCarthy e implementado por Steve Russel en 1958. LISP fue diseñado para la inteligencia artificial y es el primer lenguaje interpretado de la historia. Su intérprete fue implementado en lenguaje máquina (binario)
El tercer lenguaje, Cobol, también fue implementado en ensamblador y se lanzó en 1959. Cobol es un lenguaje que sigue vigente y con varias ofertas laborales, porque es uno de los principales lenguajes del sistema financiero.
En 1972 se lanzó el histórico lenguaje C que se usó para el desarrollo del sistema operativo UNIX (como te contamos en este video). Antes de C los sistemas operativos no eran portables, sino específicos para cada arquitectura de computadora, puesto que se escribían en ensamblador. C lo cambió todo y fue implementado en ensamblador.
En 1985 se lanza C++, una evolución de C que incluye programación orientada a objetos (si no sabes qué es la programación orientada a objetos puedes aprenderlo en este video). Tanto C como C++ son los dos lenguajes más importantes para el desarrollo de software de sistema como sistemas operativos o controladores, y C++ se usa mucho en el desarrollo de software de escritorio. Obviamente, C++ fue implementado en C.
Python es un caso curioso que demuestra que crear un lenguaje de programación consiste en dos partes: el diseño del lenguaje, por un lado, y la implementación del compilador o intérprete, por otro. Ya que Python fue implementado en C, pero con los años han surgido muchas implementaciones del intérprete de Python en lenguajes como Java, C# e incluso el mismo Python.
JavaScript se lanzó en 1995 y es un lenguaje interpretado desarrollado en C. El caso de JavaScript es particular porque fue creado exclusivamente para el navegador. Su primer intérprete, llamado SpiderMonkey era parte del navegador Netscape. En el año 2008, Google lanzó su navegador Chrome con un motor (o intérprete) de JavaScript hasta 20 veces más veloz que Firefox. Lo llamó V8 y fue escrito en C++.
En 2009, Ryan Dahl, sacó V8 de Chrome y lo llevó al servidor en una implementación llamada Node.js, con lo cual JavaScript podía usarse en cualquier lugar, no solo en el navegador y nació la era dorada de JavaScript.
Otros lenguajes como PHP, Ruby o Go también fueron desarrollados con C. Aunque Go es un caso especial, pues partes del lenguaje fueron implementadas con el mismo Go, lo que demuestra su poder y robustez.
Por su lado, el poderoso Java fue implementado en C++ (como te contamos en este video) al igual que Rust. Mientras que TypeScript, al ser una evolución de JavaScript, fue implementado, como debes sospechar, con JavaScript.
Seguro te preguntas por qué la mayoría de lenguajes se implementan con C y C++. Aunque si estuviste atento a este blog, seguro ni te lo preguntas, porque que ya lo sabes. Pero igual te lo explico:
C y C++ son lenguajes de medio nivel, que permiten mayor control del sistema, pero a la vez no son tan complejos como ensamblador. Es el punto medio ideal entre alto y bajo nivel. Entre desarrollar de manera sencilla sin perder el control de los detalles del sistema.
Aunque, como ya sabes, podrías desarrollar un lenguaje en el lenguaje que te dé la gana. Incluso como un hobby. Por ejemplo, ¿sabías que existe un lenguaje llamado ArnoldC? Sí y usa frases de Arnold Schwarzenegger en Terminator.
¿Podemos tener un lenguaje único?
Como has visto, soñar con un lenguaje de programación único que nos evite la fatiga de aprender varios es solo una ilusión. Nada le impide a una persona o empresa crear un nuevo lenguaje. Y si lo hacen bien y en el momento correcto, este lenguaje puede llegar al Olimpo de la programación. Lenguajes como C, C++, Python, PHP, Java, JavaScript, Ruby, C#, Go y otros están en ese grupo selecto.
Así que salvo que tengas mucho tiempo y recursos disponibles, quizás sea mejor seguir aprendiendo los lenguajes que ya existen y que te van a dar muchas oportunidades de trabajo. Y ¿dónde va a aprenderlos? Obviamente en EDteam.
Ahora ya sabes cómo se crean los lenguajes de programación y si alguien te pregunta, recuerda que lo #AprendisteEnEDteam..