ARTÍCULO - Historia y evolución de los lenguajes de programación

No os asustéis, la palabra Historia puede sonar fuerte y a veces provoca somnolencia en quienes la escuchan. Tomen esto más bien como un “cuento” que trata de hurgar un poco en el pasado del ser humano, cuando crearon las máquinas y debieron aprender a comunicarse con ellas.
Para nada este artículo trata de ser algo estrictamente científico, nada más lejos de la realidad. Trataremos de enfocarlo como un acercamiento del público general al mundo de la informática, sin necesidad de tener ningún tipo de conocimiento previo.

"El lenguaje nos sirve para comunicarnos. Por desgracia algunas personas tienen un lenguaje bastante físico"










Artículo por: Asensio López Fernández



    Un lenguaje es un método de comunicación que nos permite comunicarnos con los demás. Si hablamos con un Inglés deberemos hacerlo en lenguaje inglés, si hablamos con un Japonés le hablaremos en lenguaje Japonés… pero, ¿y si lo que queremos es hablar con una máquina? Pues en ese caso debemos de hacerlo en un lenguaje que ella pueda entender: un lenguaje de programación.
En realidad estoy mintiendo un poco. Las máquinas solo entienden un lenguaje, el llamado lenguaje máquina, que no es otra cosa que: electricidad o no electricidad, apagado o encendido, unos o ceros. Entonces ¿no entiende los lenguajes de programación?, directamente no, primero han de ser traducidos al lenguaje máquina bien directa o indirectamente, pero vayamos paso a paso.

Origen de los lenguajes de programación:

Si las máquinas nacieron como una idea del hombre para automatizar trabajos rutinarios y repetitivos, la programación nació como un método eficaz de comunicación con dichas máquinas a modo de instrucciones.

La  primera computadora como tal, fue la “máquina analítica” inventada por Charles Babbage allá por el año 1823 y que continuó depurando hasta su muerte en 1872, por lo que se le considera “el padre de la computación”, aunque el artilugio nunca fue totalmente terminado. Se trataba de una máquina capaz de calcular tablas matemáticas, eliminando así los posibles errores humanos debidos a la fatiga o el aburrimiento que producía dicha tarea.
"Hola, soy Charles Babbage"


"Máquina analítica de Babbage















Pero fue Ada Lovelace, hija del poeta inglés Lord Byron, la primera persona que ejecutó un algoritmo para la “máquina analítica” y describió por primera vez un lenguaje de programación de carácter general interpretando las ideas de Babbage, además de solventar ciertos errores de su proyecto. Es por ello por lo que se la conoce como la primer programadora de la historia. Incluso el Ejército de los Estados Unidos llamó a uno de sus lenguajes de programación ADA, en homenaje a esta extraordinaria mujer.
"Esta máquina puede hacer cualquier cosa que sepamos cómo ordenarle que ejecute..."

Tipos de lenguajes:

-El lenguaje Máquina

El lenguaje máquina fue el primer lenguaje de programación, y es el único lenguaje que entiende una computadora. Está compuesto únicamente por unos (1) y ceros (0), es por ello que también se le conoce como lenguaje binario. Con estos dos dígitos (conocidos como bits), forma lo que se conoce como cadenas binarias, con las instrucciones que damos al microprocesador. Ejemplo de cadenas binarias:

110011001000
001001010101
111000111000

Este lenguaje es fácil de entender por una computadora, pero como podréis ver es difícilmente entendible por un humano. Es por ello que con el fin de facilitar el trabajo a los programadores se creó un tipo de lenguaje que sustituía las secuencias de unos y ceros  por palabras o letras provenientes del inglés, facilitando de este modo la lectura, escritura y posterior ejecución de los programas. A los primeros lenguajes de este tipo se les denominó lenguajes de bajo nivel.
Eso sí, una vez que se termina de escribir un programa, es necesario compilarlo o intepretarlo, es decir, volver a traducirlo al lenguaje máquina para que el ordenador lo entienda, ya que como bien he dicho al principio es el único lenguaje que entiende una computadora.

 - Lenguajes de bajo nivel

Los lenguajes de bajo nivel de abstracción, son los que están más cercanos a la forma de trabajar de un microprocesador, por lo que son fácilmente trasladados a lenguaje máquina.

El lenguaje ensamblador (Assembly) fue el primer lenguaje de programación que trató de “sustituir” el lenguaje máquina por uno mucho más parecido al de las personas. Lo que hace es sustituir las secuencias de código máquina por letras o palabras, por lo que en realidad escribir en lenguaje ensamblador es básicamente lo mismo que hacerlo en lenguaje máquina, pero las letras y palabras son más fáciles de recordar y entender que la secuencias de números binarios. Por ejemplo, para sumar se usa la letra A, de la palabra inglesa add (sumar).

La palabra bajo, no implica que el lenguaje sea inferior a uno de alto nivel, se refiere a la reducida abstracción (abstracción = grado de cercanía) entre el lenguaje y el hardware.
Actualmente se suele usar, entre otras cosas, para programar drivers. Entre sus ventajas se encuentran: mayor adaptación al equipo y mejor velocidad con un mínimo uso de memoria. Y entre sus desventajas: Mayor dificultad de comprensión e imposibilidad de escribir código independiente de la máquina.

Con el tiempo se hizo necesario simplificar aún más la tarea de los programadores, ya que la complejidad de las tareas que realizaban las computadoras iba en aumento. Así que se crearon los lenguajes de alto nivel, que entre otras cosas necesitan menos instrucciones que un ensamblador para realizar una misma tarea.

Si como hemos dicho antes, los lenguajes de bajo nivel son los más próximos a la arquitectura de hardware, los lenguajes de alto nivel son todo lo contrario: los más cercanos a los programadores.

 - Lenguajes de alto nivel

Un lenguaje de alto nivel es aquel que se aproxima más al lenguaje humano que al lenguaje binario, o lenguaje máquina. Utiliza palabras y expresiones del lenguaje humano (en inglés), por lo que al ser más fácilmente compresible por los programadores aumenta la sencillez y rapidez a la hora de crear programas, a la par que reduce las posibilidades de equivocarse.

En C# se usan palabras como: if, convert, write, etc… Ejemplo:

If (numero1 > numero2)  
 {   
 Console.Write (“gana el primero”);  
 }
Esto significa que, si el número 1 es mayor que el número 2, se va a escribir “gana el primero” en una ventana de consola.

La principal característica de un lenguaje de alto nivel es su independencia de un hardware determinado, por lo que un programa escrito en este tipo de lenguaje puede ser utilizado en distintas computadoras. Cierto es también, que la computadora debe disponer de un intérprete o compilador, que es el encargado de traducir dicho programa al lenguaje específico de cada máquina, ya que, como dije al principio,  las computadoras solo entienden el lenguaje binario o lenguaje máquina.


Cada nueva evolución en los lenguajes de programación ha traído consigo una simplificación de los mismos, por lo que, en muchos casos, varias instrucciones en lenguaje máquina pueden ser simplificadas en una sola instrucción en lenguaje de bajo nivel, y varias instrucciones en lenguaje de bajo nivel pueden ser  simplificadas en una sola instrucción en lenguaje de alto nivel.
En la actualidad existen gran diversidad de lenguajes de alto nivel (C, C++, C#, BASIC, PASCAL, JAVA, entre muchos otros)

Tipos de programación:

El tiempo hizo que los lenguajes de programación tuviesen que irse adaptando a las circunstancias cambiantes. El usuario final requería cada vez programas más potentes a la par que intuitivos y fáciles de manejar, y paradójicamente los programas sencillos de utilizar son los más difíciles de programar. A esto se sumó el nacimiento de la red de redes y la creación de nuevos dispositivos a parte de las computadoras.

Podemos dividir los lenguajes de alto nivel en tres tipos de acuerdo a su evolución y tipo de programación:
De programación de procesamiento, de programación estructurada y de programación orientada a objetos.

- Programación de procesamiento

La programación de procesamiento o programación lineal es aquella en que las instrucciones se ejecutan en el mismo orden en que han sido escritas. Se basa en una serie de procedimientos que se ejecutan uno tras otro y que actúan sobre los datos. A estos procedimientos también se les llama, funciones o métodos.

El principal problema de este tipo de programación queda en evidencia a la hora de realizar programas complejos, ya que ofrece poca flexibilidad.  Es especialmente complicado mantener una gran cantidad de líneas de código con superposición de funciones y se hace en extremo confuso para el programador..

- Programación estructurada

Con el tiempo los programas comenzaron a ser más complejos y ambiciosos por lo que la evolución lógica era la llamada programación estructurada. Básicamente en este tipo de programación lo que se hace es dividir el trabajo en partes, llamadas módulos o componentes.Esta forma de programación entiende un programa como un conjunto de tareas. Cada tarea compleja es dividida en módulos, y cada módulo complejo es subdividido en componentes. De este modo cada tarea es fácilmente entendible y puede ser mejor documentada internamente. Los módulos o componentes son ejecutados a medida que son requeridos, de este modo tenemos un diseño compuesto por módulos independientes que pueden comunicarse entre sí.

Pero este tipo de lenguaje se centra en los procedimientos (también se le llama programación procedimental), y crecía la necesidad de pensar en los datos, en lo que se puede hacer con ellos. Además se vio que  había funciones iguales que se copiaban una y otra vez en los módulos y se pensó que se podrían reciclar dichas funciones para distintas situaciones. Fue así como nació la programación orientada a objetos.

- Programación orientada a objetos

La programación orientada a objetos (POO) combina las mejores ideas de la programación estructurada con conceptos nuevos y potentes que nos hacen ver las tareas de programación desde un nuevo punto de vista: el de los objetos. Debo hacer hincapié en que no se trata de un lenguaje de programación en sí, sino de una forma de plantearse la programación, soportado por muchos lenguajes actualmente.

Se trata de una forma de programar mucho más cercana a como expresamos las cosas en la vida real; descompone los problemas en conjuntos de datos con estructura propia, que llamamos objetos. Su idea principal es llevar al mundo del condigo lo mismo que encontramos en el mundo real. Y en nuestro mundo, cuando miramos alrededor, ¿qué nos encontramos? La respuesta es sencilla: cosas, objetos.

Para entender la programación orientada a objetos debemos entender que es un objeto. En el mundo real, un objeto es cualquier cosa que vemos a nuestro alrededor, un lápiz, una televisión, un coche, etc… Podemos distinguir un objeto de otro porque son de una clase diferente, o incluso diferenciar objetos de una misma clase, como pueden ser dos coches de modelos distintos.
Un objeto puede estar compuesto por diferentes componentes, por ejemplo un coche está compuesto por: motor, radiador, frenos, ruedas, etc... Todo en conjunto forma parte del objeto coche. Internamente cada componente puede ser muy complicado y haber sido construido por distintas empresas, pero a nosotros nos basta con saber cuál es su funcionamiento y como se relaciona con los otros componentes.
Y lo mismo pasa en la programación orientada a objetos, todo el programa está construido en base a diferentes objetos, compuestos por diferentes componentes. Cada uno tiene un rol específico en el programa y todos pueden comunicarse entre sí de formas predefinidas.Me resta decir que todos los lenguajes compatibles con programación orientada o objetos deben cumplir con estos tres requisitos: Herencia, encapsulación, y polimorfismo; hay quién añade también la abstracción, pero ésta en realidad forma parte de la encapsulación.

Permítanme que no entre más en detalles sobre programación orientada a objetos en este tema, ya que redactaré otro artículo íntegramente dedicado a explicar todos los pormenores de esta forma de programar.

Intérpretes y compiladores

 Como ya dijimos anteriormente, un lenguaje de alto nivel no puede ser entendido directamente por una máquina, sino que debe ser traducido a su lenguaje, el lenguaje binario o lenguaje máquina, para que la computadora pueda entenderlo y ejecutarlo. Existen dos tipos de “traductores”: los Intérpretes y Compiladores.

Intérpretes:

El intérprete realiza la traducción del programa fuente (programa escrito en lenguaje de alto nivel) al lenguaje máquina directamente,  ejecutando dicha traducción al momento de ejecutar cada una de las instrucciones. Normalmente no guarda el resultado de dicha traducción. De este modo, el programa fuente siempre conserva su forma original, con la desventaja de que cada vez que es ejecutado debe ser traducido nuevamente. Este proceso puede hacer más lenta la ejecución del programa, por lo que los intérpretes suelen ser menos usados que los compiladores.Podríamos comparar la labor de un intérprete con la que realiza un traductor humano, que va traduciendo lo que escucha  a otro idioma en tiempo real, pero sin escribirlo ni dejar registro alguno.
"Terminator dispone de un programa interprete que traduce lo que le dice John Connor al lenguaje máquina"
Llamamos lenguaje interpretado a todo aquel que está diseñado para ser ejecutado por medio de un intérprete.Algunos de los más famosos pueden ser: PHP, ActionScript, LUA o JavaScript.

Compilador:

El compilador a diferencia del intérprete, no ejecuta el programa directamente, haciendo la traducción en tiempo real, sino que, tras analizar el programa fuente lo traduce a otro lenguaje equivalente, creando lo que llamamos un programa objeto. Para remarcarlo aún más, diré que un programa objeto es la traducción de un programa en lenguaje de alto nivel a un programa en lenguaje máquina, lenguaje que la máquina puede interpretar y ejecutar.
Una vez compilado el programa, el resultado en forma de programa objeto no puede ser directamente ejecutado. Debemos usar un programa conocido como enlazador  o linker, que combina todos los módulos del archivo objeto para formar un archivo ejecutable (un .exe por ejemplo), que ya sí que se considera un programa en sí mismo y no necesita hacer referencia al código fuente original.
Volviendo al símil del traductor humano, podríamos decir que lo que hace un compilador sería equivalente a la labor que haría un humano al coger un libro y traducirlo a otro idioma dejándolo por escrito para la posteridad.
Principales ventajas y desventajas de cada método:

- El compilador presenta la ventaja considerable de la velocidad de ejecución al no tener que traducir el programa fuente cada vez que es ejecutado.
- Usando un intérprete el programa se puede mover de una plataforma a otra más fácilmente, produciendo resultados iguales en (Windows, Linux, Mac, PS3, etc…)
- Se requiere un compilador para cada lenguaje de programación.
- En la actualizad, uno de los entornos más comunes de uso de los intérpretes es Internet, debido a la posibilidad que estos tienen de ejecutarse independientemente de la plataforma. . 

Eso es todo, espero no haberos aburrido con tanta teoría. En el siguiente artículo de programación indagaremos más profundamente en los lenguajes de alto nivel con programación orientada a objetos.

5 comentarios:

  1. wow gracias!! me sirvió para mi tarea :)

    ResponderEliminar
  2. Creo que Terminator dispone de un programa compilador que traduce lo que le dice John Connor al lenguaje máquina (de esta manera lo deja en la memoria), creando lo que llamamos un programa objeto.Y luego internamente pasa a la etapa del linker (creo que es el recuerdo) para usar las frases anteriormente compiladas: "¡Hasta la vista baby!"

    ResponderEliminar