EvolSoftwareLeng

toc **2. Lenguajes de Programación** = 2.1. Introducción = Un ordenador necesita un **Sistema Operativo** para funcionar. A su vez, los usuarios necesitan un conjunto de **Programas** o **Aplicaciones** que funcionen en dicho sistema operativo y que les permitan realizar su trabajo. En resumidas cuentas, un ordenador necesita **Software**.

El software está formado básicamente por conjuntos de órdenes secuenciales que entiende el ordenador (o mejor dicho, el procesador o procesadores del ordenador) y que permiten realizar una tarea concreta. Los **Programadores** son los encargados de crear el software y para ello utilizan **Lenguajes de Programación**. Al igual que las personas se comunican en distintos idiomas, los programadores también escriben programas en distintos lenguajes de programación, en función de las ventajas de cada uno, su adecuación a las características del programa, o por simples preferencias personales.

El objetivo de crear software siempre es el mismo: ayudar al usuario a realizar un trabajo o a resolver un problema concreto. Obviamente no es lo mismo escribir en unas pocas horas un sencillo programa para realizar operaciones matemáticas, que diseñar durante meses o años un complejo sistema operativo, un paquete ofimático o una aplicación para diseño aeronaútico.

En la figura siguiente se pueden apreciar los componentes que intervienen básicamente en la resolución de un sencillo problema como puede ser sumar dos números: el **usuario**, el ordenador o **hardware**, y el conjunto de **software** formado por los datos de entrada, el sistema operativo y el programa que suma los números.



= 2.2. El Lenguaje del Ordenador = Uno de los principales problemas que suelen tener las personas que dan sus primeros pasos delante de un ordenador es que se empeñan en que el ordenador les entienda. Sin embargo, somos nosotros quienes debemos entender su lenguaje para darle las instrucciones adecuadas.

Un ordenador no es más que un aparato electrónico por el que circula la corriente eléctrica. El paso de corriente lo interpretamos con el valor lógico '1', y la ausencia de corriente con el valor '0', es decir, lo que todos conocemos como **bits** y que da lugar al **Sistema de Numeración Binario**. Por desgracia, éste es el único lenguaje que entiende un ordenador (para ser más exactos, el lenguaje que entiende el procesador), y originariamente se le denominó **Lenguaje Máquina**.

El lenguaje máquina se utilizó en los primeros programas de ordenador, que se grababan en **Cintas de Papel** o **Tarjetas Perforadas**, donde cada agujero que se realizaba en las mismas correspondía a un bit, es decir, a un '0' o a un '1'. Pronto se vio que esta forma de comunicarse con un ordenador no era la más adecuada ni eficaz. Además, las probabilidades de cometer un error eran muy altas.

De aquí surgió la necesidad de inventar otros lenguajes más cercanos al ser humano para poder escribir programas de ordenador cada vez más complejos, y, de la misma forma, surgió la necesidad de crear herramientas capaces de convertir estos lenguajes en el lenguaje máquina que entiende el ordenador. Un primer acercamiento a esta idea fue el lenguaje **Ensamblador**, donde cada instrucción en lenguaje máquina tiene su correspondiente mnemónico o abreviatura, mucho más sencilla de entender, recordar y escribir. Posteriormente fueron apareciendo otros lenguajes, desde el todavía críptico **Fortran**, hasta otros tan cercanos al lenguaje humano como es el **Cobol**, pasando por lenguajes de tipo intermedio tales como **Basic**, **Pascal** o **C**.

De toda esta evolución es de lo que nos ocuparemos más adelante.

= 2.3. Procesadores, Sistemas Operativos, Traductores, Compiladores e Intérpretes = Antes de entrar en materia, conviene aclarar algunos puntos muy importantes a la hora de hablar de lenguajes de programación.

Como ya comentamos, para que el procesador entienda las instrucciones de un lenguaje de programación, es necesario convertir dicho lenguaje al lenguaje máquina. En primer lugar hay que entender que no todos los procesadores o **familias de procesadores** entienden el mismo código máquina. Así por ejemplo, el conjunto de instrucciones que entienden los micros de la familia 80x86 de Intel es diferente al de los procesadores IBM RS/6000 o a los micros ARM de Samsung para dispositivos móviles. Incluso dentro de una misma familia, el juego de instrucciones de un antiguo Intel 8086 no tiene nada que ver con el de un moderno Intel Core 2, aunque sí es cierto que el segundo incluye todas las instrucciones del primero y todas las instrucciones de cualquier procesador de su misma familia anterior a él.

Por otra parte está el Sistema Operativo. En una máquina con un mismo procesador es posible instalar **diferentes sistemas operativos**: versiones diferentes de Microsoft Windows o Mac OS, distintas distribuciones de Linux... Cada sistema operativo tiene un conjunto de funciones de medio o alto nivel propias, que se utilizan en los lenguajes de programación para crear las aplicaciones. Por si esto fuera poco, existen versiones de los sistemas operativos **de 32 y de 64 bits** (es decir, que aprovechan los registros de 64 bits del procesador), y las aplicaciones diseñadas para sistemas de 64 bits no funcionan en sistemas de 32 bits (aunque por ejemplo en Microsoft Windows sí suele ocurrir al contrario).

Por último, para convertir los lenguajes de programación en código máquina de utilizan programas especiales denominados de forma genérica **Traductores**. Si la traducción se lleva a cabo directamente a código máquina se denominan **Compiladores**, mientras que si lo hacen a un tipo de lenguaje intermedio se podrían llamar **Pseudo-Compiladores**. En el caso de que el lenguaje se convierta a algún lenguaje intermedio o ni siquiera sufra ningún tipo de conversión, es necesario la utilización de **Intérpretes**, programa encargados de ejecutar los programas y convertir dichos lenguajes "sobre la marcha".

De todo esto se puede deducir que, por lo general (salvo excepciones tales como el lenguaje Java), los programas se deben crear en un lenguaje de programación concreto, para una arquitectura concreta, para un sistema operativo concreto y utilizando los programas de traducción adecuados a dicha arquitectura y sistema operativo.

= 2.4. Clasificación de los Lenguajes de Programación = Aunque existen distintas clasificaciones de los Lenguajes de Programación, una de las más habituales es la que hace referencia a su nivel de complejidad léxica y sintáctica, o lo que es lo mismo, lo que dicho lenguaje se acerca al lenguaje humano y se aleja y abstrae por tanto del lenguaje máquina y del funcionamiento interno del procesador.

Según esto, podemos distinguir entre:
 * **Lenguajes de Bajo Nivel:** lenguajes cercanos al lenguaje máquina del procesador. El ejemplo típico es el Ensamblador.
 * **Lenguajes de Medio Nivel:** lenguajes intermedios entre las otras dos categorías, tales como Fortran, C o Pascal.
 * **Lenguajes de Alto Nivel:** lenguajes más cercanos al lenguaje natural del ser humano, tales como BASIC o Cobol.

Realmente no está demasiado clara la diferencia entre estas categorías. Así por ejemplo, está claro que Cobol es un lenguaje de alto nivel, pero alguien podría pensar que Basic es de Medio Nivel en vez de Alto Nivel, o que Java es de Alto Nivel en vez de Medio Nivel, o que Fortran no está claro si es de Bajo o de Medio Nivel.

Por otra parte, cabe mencionar que históricamente los lenguajes de bajo nivel se asociaban a **tareas en tiempo real** o a programas donde **la velocidad de ejecución era crítica**. Así por ejemplo, el ensamblador era el lenguaje utilizado sistemáticamente para el diseño de rutinas gráficas en los juegos o en programas de control de automatismos. Hace años que la potencia de los procesadores de cualquier ordenador personal es tal, que esta variable ha dejado de ser un punto crítico en el desarrollo de las aplicaciones.

= 2.5. Evolución de los Lenguajes de Programación =

A continuación se incluye una lista, ordenada cronológicamente, de los lenguajes de programación que más relevancia han tenido a lo largo de la Historia:

1949. Shortcode

 * Primer lenguaje de programación** que se usó en computadoras electrónicas. Requería que el programador convirtiera sus programas a **Código Máquina** (formado por 0's y 1's) de forma manual.

1950. Ensamblador
El **Ensamblador** (o **Assembler** en inglés) es un lenguaje en el que cada instrucción de Código Máquina tiene su correspondiente mnemónico o abreviatura, mucho más fáciles de utilizar y recordar que el propio Código Máquina. Fue prácticamente el único lenguaje utilizado para el desarrollo de sistemas operativos hasta la aparición del lenguaje C, e incluso era habitual hasta mediados del siglo XX en la realización de aplicaciones o partes de aplicaciones cuya ejecución en el tiempo era crítica.

1951. A-0

 * Grace Hopper**, trabajando para Remington Rand, comienza a desarrollar el **primer compilador**, lo que facilitó enormemente las tareas de programación y ejecución de los programas.

1957. FORTAN
FORTRAN (**FOR**mula **TRAN**slating system) fue desarrollado por IBM para la realización de cáculos científicos. El líder del proyecto fue **John Backus**, quien posteriormente contribuiría en la creación del lenguaje **ALGOL**. FORTRAN incluía las instrucciones FOR, DO y GOTO, y definía algunos tipos de datos básicos: TRUE, FALSE, integer, real, double precision.

1958-1959. LISP
El profesor **John McCarthy** del M.I.T. desarrolló un lenguaje de procesamiento de listas llamado LISP (**LIS**t **P**rocessing). En 1960 McCarthy publica un histórico artículo demostrando cómo con unos cuantos operadores y una notación para funciones es posible construir un lenguaje de programación completo.

1959. COBOL
CODASYL (Conference on Data Systems and Languages) crea el lenguaje COBOL (**CO**mmon **B**usiness **O**riented **L**anguage), el primer gran lenguaje de alto nivel (su sintaxis está muy cercana a la de la lengua inglesa) **orientado al desarrollo de software empresarial**. Destaca por su facilidad para el manejo de estructuras de datos (tipos de datos estructurados, ficheros, bases de datos, etc.).

1964. BASIC
Inventado por **John George Kemeny** y **Thomas Eugene Kurtz** en el Colegio Dartmounth. Sus siglas provienen de **B**eginners **A**ll-purpose **S**ymbolic **I**nstruction **C**ode, es decir, su objetivo era proporcionar un lenguaje sencillo, fácil de aprender y de propósito general.

1968-1970. Pascal
Creado por **Niklaus Wirth** como herramienta de enseñanza de la programación. Fue diseñado de una manera muy ordenada, reflejando la experiencia de su diseñador, incluyendo las mejores características de los lenguajes de la época, al mismo tiempo que intentaba evitar sus deficiencias. **Delphi** fue una versión moderna de Pascal orientada a objetos.

1970. Prolog
Diseñado en la Universidad de Aix-Marseille por los profesores **Alain Colmerauer** y **Phillipe Roussel**, su nombre proviene del frances **Pro**gramation et **Lo**gique, y estaba orientado a la resolución de problemas ralacionados con la Inteligencia Artificial.

1971. C
Diseñado por **Dennis Ritchie** y **Ken Thompson** mientras trabajaban para los Laboratorios Bell, se basó en los lenguajes existentes B y BCPL. Desde su creación estuvo pensado para la programación de sistemas operativos, inicialmente para usarse en UNIX. Su gran evolución y aceptación, y el que sea un lenguaje de propósito general que permite realizar rutinas tanto de bajo como de alto nivel, le ha otorgado el galardón de ser el lenguaje más utilizado en la historia de la programación.

1983. C++

 * Bjarne Stroustroup**, también de los Laboratorios Bell, desarrollo un nuevo lenguaje basado en C que aplica los conceptos de la programación orientada a objetos. Junto con C, es otro de los lenguajes utilizados mayoritariamente desde su creación hasta la actualidad.

1989-1993. HTML

 * Tim Berners-Lee** comenzó a desarrollar en 1989 su idea de un lenguaje de marcas (tags o etiquetas) que permitiera diseñar páginas web. En 1993, con la ayuda de **Dan Connolly**, publica la primera especifica de HTML (**H**yper**T**ext **M**arkup **L**anguage). HTML no se puede considerar un lenguaje de programación al uso, pero es tan importante que sin él no existiría la Worl Wide Web.

1990-1994. Java
Fue desarrollado por **James Gosling** y sus equipo de Sun Microsystems, pensado originalmente como un reemplazo de C++. Orientado a objetos y muy parecido a C++, se caracteriza principalmente por ser un lenguaje que se pseudo-compila (generando el llamado "bytecode") y que es **multiplataforma**. Es realmente la llamada "Máquina Virtual de Java" de cada plataforma la que se encarga de ejecutar las instrucciones pseudo-compiladas de Java. Con el paso del tiempo ha conseguido posicionarse a la par de C y C++ en cuanto a su utilización se refiere, y actualmente está muy orientado al desarrollo de aplicaciones web.

1995. JavaScript
Fue desarrollado por **Brendan Eich**, en su trabajo para Netscape. Su sintaxis es similar a la de Java, pero se trata de un lenguaje de script que se inserta directamente en el código **HTML** y es interpretado por el propio navegador en la parte cliente. Tiene amplia utilización en el desarrollo de páginas web. **DHTML** y **AJAX** son dos tecnologías de creación de páginas web dinámicas basadas en JavaScript.

1994-1995. PHP
Creado por **Rasmus Lerdorf**, es un lenguaje de scripts orientado totalmente a la web, tanto en la parte cliente como en la del servidor. Inicialmente significaba **P**ersonal **H**ome **P**age Tools, pero actualmente su nombre oficial es **P**HP **H**ypertext **P**reprocessor. Se ha convertido en uno de los lenguajes mas populares para programación Web.

2001-2003. C#
Es un lenguaje orientado a objetos desarrollado por **Microsoft** como parte de su estrategia comercial .NET, tomando ideas de C++ y Java. Además de la implementacion de Microsoft, existen implementaciones libres como Mono y dotGNU. Gracias a la maquinaría comercial de Microsoft y la amplia base de escritorios Windows, el uso de C# está muy extendido en entornos corporativos.