Introducción e Historia

La finalidad de un lenguaje de programación es "decirle" al ordenador qué es lo que tiene que hacer paso a paso. Esta definición da que pensar: no parecen muy listos los ordenadores. Debido a esto es muy frecuente la expresión

Los ordenadores son tontos.

Necesitan de alguien que les indique lo que tienen que hacer. Y ese "alguien" es el programador. Pero una vez que saben qué hacer y cómo, lo pueden repetir siempre que deseen, sin error posible y a velocidades muy superiores a las que podría hacerlo una persona.

Desgraciadamente, el ordenador y las personas hablan idiomas diferentes: el ordenador entiende unas determinadas secuencias de ceros y unos, llamado lenguaje o código máquina. El programador debe darle instrucciones en ese formato. Este lenguaje o código máquina es difícil de aprender, difícil de utilizar e incluso aún más difícil de modificar. Además ese código máquina no es el mismo para todos los ordenadores lo que se traduce en que los programas realizados para un tipo de máquina no sirven para el resto.

Se pensó que sería más útil trabajar en un lenguaje parecido o similar al lenguaje hablado, al lenguaje que usamos diariamente. Una vez expresado el conjunto de instrucciones en ese lenguaje cercano al lenguaje natural, será necesario traducir ese lenguaje a código máquina. Pero esta labor se puede programar y que sea el ordenador el que automáticamente haga la traducción a lenguaje máquina. De esta forma surgieron los lenguajes llamados de alto nivel y los programas encargados de la traslación: los traductores. Estos últimos se enmarcan hoy en día en los denominados procesadores del lenguaje que no se limitan exclusivamente al tratamiento de lenguajes de programación sino que extienden su campo de aplicación mucho más lejos. El objetivo, sin duda, es que en algún momento los ordenadores sean capaces de entender el lenguaje que emplean las personas. Actualmente esta meta aún se encuentra lejos pero se está trabajando en esta línea desde hace ya varios años y los resultados son prometedores.

Algoritmo

Se define "algoritmo" como el conjunto de pasos necesarios para resolver un problema. El algoritmo es por tanto la "receta" que señala qué se debe hacer en cada momento y bajo que condiciones hacerlo. El algoritmo se puede expresar de múltiples formas aunque actualmente la más utilizada combina diferentes tipos de diagramas junto con especificaciones en lenguaje natural. El conjunto de pasos para resolver un problema puede tener diferentes niveles de abstracción dando lugar a diferentes niveles de concrección del algoritmo. El procedimiento natural parte de una especificación muy general y la refina ciclicamente hasta alcanzar el grado de detalle necesario. ¿Cuál es dicho grado de detalle?. Pues aquel que permita interpretar el algoritmo sin ambigüedades. Como es lógico el contexto condiciona el grado de detalle necesario. Haciendo un pequeño simil con el mundo de la cocina, el algoritmo representa la receta y por lo tanto no es lo mismo una receta diseñada para ser interpretada por un experto cocinero que una diseñada para una persona que nunca ha cocinado.

Programa

Podemos definir un programa como un conjunto ordenado de instrucciones expresadas en un lenguaje de programación que implementan un algoritmo.

Un lenguaje de programación, al igual que un lenguaje natural, estaría constituido por:

Combinando correctamente los símbolos será capaz de crear programas. Los programas serán más sencillos de escribir cuanto más cercano sea el lenguaje de programación al lenguaje humano. En realidad son muy parecidos al lenguaje dominante en el mundo de la informática: el inglés. Pero no se asuste, esto no es un curso de idiomas.

Evolución Histórica

Se ha comentado previamente que el primer lenguaje de programación fue el lenguaje máquina. A continuación aparece el Lenguaje Ensamblador (Assembly) en un intento de sustituir indescifrables secuencias de ceros y unos por símbolos y códigos nemotécnicos (códigos cuyos nombres recuerdan la acción que representan) para especificar instrucciones del código máquina. Cada instrucción del código máquina se corresponde con una instrucción en lenguaje ensamblador. Fue un primer avance para simplificar las tareas de programación.

En los años 50 comienzan a aparecer lenguajes de carácter más humano. En 1956 aparece el lenguaje FORTRAN (FORmula TRANslation) de la mano de IBM. Este lenguaje conserva algunos vínculos con la máquina. Es un lenguaje que aún se usa en entornos muy específicos. En 1958 aparece el lenguaje ALGOL (ALGOritmic Language). En 1959 se crea el LISP en el MIT (Instituto Tecnológico de Massachusetts), lenguaje orientado al área de la Inteligencia Artificial.

En 1960 el DoD (Departamento de Defensa de EE.UU.) crea el COBOL (Common Business Oriented Language), lenguaje orientado a la gestión que ha sido durante muchos años muy utilizado en banca y empresas en general. En la década de los 60 en la Universidad de Darmouth se desarrolla el BASIC (Beginners All-Purpose Symbolic Instruction Code), siendo éste un lenguaje de propósito general muy vinculado a los procesos de iniciación.

En 1971 N. Wirth crea PASCAL. Una de las principales características de este lenguaje es que es fuertemente estructurado. Será el que nos acompañe a lo largo de este curso. En la década de los 70 Dennis Ritchie crea el Lenguaje C. C es un lenguaje de alto y bajo nivel a la vez que ha presentado una evolución pareja a la del sistema operativo UNIX. Hoy en día el lenguaje C sigue siendo muty utilizado, se le considera de medio nivel por tener características de los dos extremos. La ventaja es que salvando las distancias tienen muchas analogías con PASCAL, lo que permite que una persona que conozca PASCAL pueda aprender C en muy poco tiempo.

A partir de ese momento la aparición de nuevos lenguajes y revisiones de los anteriores ha sido constante, sin mencionar numerosos lenguajes de programación desarrollados específicamente para tareas muy concretas. También han surgido todo tipo de variantes de los lenguajes anteriores con características de tipo visual o añadiendo otros paradigmas de programación como son la programación orientada a objetos, la programación basada en eventos, la computación orientada a servicios y muchas otras. Como posibles ejemplos tenemos Visual C, Visual Basic, C++, Pascal Orientado a Objetos, Java, SQL, PHP y un largo etcetera. En la dirección http://www.levenez.com/lang/ hay un cuadro muy interesante que muestra la cronología de 50 lenguajes de programación con enlaces a la descripción de cada uno. Un cuadro mucho más completo que alcanza más de 2500 lenguajes se puede ver en http://people.ku.edu/~nkinners/LangList/Extras/langlist.htm.

Con el desarrollo de las "interfaces" gráficas las aplicaciones actuales se manejan "a golpe de ratón" por lo que se han desarrollado herramientas visuales que permiten crear aplicaciones apoyándose en rutinas ya realizadas para el manejo de ventanas, menús desplegables, botones, etc. En el momento que se tienen claros los conceptos de programación básicos, el salto a este tipo de programación es muy sencillo.

Con el paso del tiempo los modelos de programación más conocidos como "paradigmas de programación" han ido evolucionando y han surgido nuevos enfoques. Inicialmente la programación en código máquina y la programación en lenguaje ensamblador estaban fundamentadas en instrucciones que hacían operaciones y en instrucciones que alteraban la ejecución secuencial de las mismas a través de saltos incondicionales. La propuesta de Wirth a través del lenguaje Pascal asentó el paradigma estructurado (cualquier programa se basa en tres estructuras básicas de programación) y el paradigma modular (un programa está formado por un conjunto de subprogramas que se encadenan entre si). Ambos paradigmas serán estudiados en detalle a lo largo de este curso y la práctica totalidad (con algunas excepciones muy específicas) de los lenguajes de programación utilizan ambos paradigmas como base, aunque luego adopten otros que cohexisten con los primeros. En los años 80, el paradigma de la orientación a objetos modificó la concepción de aplicaciones. Conceptualmente su diseño es más complejo pero facilita la reutilización de los programas y en cierta forma refleja de forma más natural la realidad que se pretende modelar a la hora de desarrollar una aplicación. De todas formas, los conceptos de la programación estructurada y modular siguen siendo útiles en la programación orientada a objetos y en otros paradigmas que se han ido afianzando con el tiempo como son la programación basada en eventos, la programación orientada a servicios, la programación basada en aspectos, etc.

En general todos los lenguajes de alto nivel tienen propiedades comunes: el uso de sentencias simples, la existencia de variables, expresiones, estructuras de control y subprogramas. Todos estos conceptos y su utilización serán objeto de los temas siguientes.

El lenguaje Pascal es uno de los más adecuados para aprender y consolidar dichos conceptos.