Tema 1: Historia y conceptos de los lenguajes de … · 1.7. Características esenciales de un...

40
Tema 1: Historia y conceptos de los lenguajes de programación 1. Historia de los lenguajes de programación 1.1. Calcular y computar 1.2. Codificación de la información: tarjetas perforadas 1.3. 1935: la máquina universal de Turing 1.4. 1941-45: Los primeros computadores electrónicos 1.5. La arquitectura von Neumann 1.6. Otros hitos de la historia de los computadores 1.7. Características esenciales de un computador 1.8. Los primeros lenguajes de programación 1.9 El nacimiento de los computadores comerciales 1.10. Los primeros lenguajes de alto nivel 1.11. La explosión de los lenguajes de programación 1.12. La evolución de los lenguajes de programación 1.13. Lenguajes de programación en la actualidad 2. Elementos de los lenguajes de programación 2.1. Definición de la Encyclopedia of Computer Science 2.2. Definición de Abelson y Sussman 2.3. Características de un LP 2.4. Elementos de un LP 2.5. Sintaxis y semántica 2.6. Los lenguajes son para las personas 2.7. Importancia del aprendizaje de técnicas de LPs 3. Abstracción 3.1. Modelar como una actividad fundamental 3.2. Abstracciones computacionales 3.3. Construcción de abstracciones 3.4. Distintos aspectos de los lenguajes de programación 4. Paradigmas de programación 4.1. ¿Qué es un paradigma de programación? 4.2. Paradigmas más importantes 4.3. Paradigma funcional 4.4. Paradigma lógico 4.5. Paradigma imperativo 4.6. Paradigma orientado a objetos

Transcript of Tema 1: Historia y conceptos de los lenguajes de … · 1.7. Características esenciales de un...

Tema 1: Historia y conceptos de los lenguajes de programación

1. Historia de los lenguajes de programación

1.1. Calcular y computar1.2. Codificación de la información: tarjetas perforadas1.3. 1935: la máquina universal de Turing1.4. 1941-45: Los primeros computadores electrónicos1.5. La arquitectura von Neumann1.6. Otros hitos de la historia de los computadores1.7. Características esenciales de un computador1.8. Los primeros lenguajes de programación1.9 El nacimiento de los computadores comerciales1.10. Los primeros lenguajes de alto nivel1.11. La explosión de los lenguajes de programación1.12. La evolución de los lenguajes de programación1.13. Lenguajes de programación en la actualidad

2. Elementos de los lenguajes de programación

2.1. Definición de la Encyclopedia of Computer Science2.2. Definición de Abelson y Sussman2.3. Características de un LP2.4. Elementos de un LP2.5. Sintaxis y semántica2.6. Los lenguajes son para las personas2.7. Importancia del aprendizaje de técnicas de LPs

3. Abstracción

3.1. Modelar como una actividad fundamental3.2. Abstracciones computacionales3.3. Construcción de abstracciones3.4. Distintos aspectos de los lenguajes de programación

4. Paradigmas de programación

4.1. ¿Qué es un paradigma de programación?4.2. Paradigmas más importantes4.3. Paradigma funcional4.4. Paradigma lógico4.5. Paradigma imperativo4.6. Paradigma orientado a objetos

5. Compiladores e intérpretes

5.1. Compilación5.2. Interpretación5.3. Ejecución en máquina virtual

6. Bibliografía

Objetivos del tema

Conocer la historia de los lenguajes de programación más importantes: quiénes losdesarrollaron, dónde, en qué época, qué lenguajes han influido en qué otros.

Conocer a los diseñadores de los lenguajes de programación: ser capaz de dar ejemplosde que los lenguajes de programación son diseñados por investigadores de Informática(computer science), por especialistas del mundo open source y, cada vez más, pordesarrolladores que necesitan automatizar procesos y sistemas (lenguajes DSL, ver siguientepunto).

Conocer que el diseño de nuevos lenguajes de programación es algo cada vez máshabitual. Por un lado, cada vez es más fácil diseñar un lenguaje de programación y programarun intérprete o un compilador (asignatura Procesadores de Lenguajes). Por otro lado,herramientas y construcciones en nuevos lenguajes de programación hacen posible el diseñode DSLs (Domain Specific Languages) orientados a una tarea o proceso muy concreto.

Conocer distintas definiciones de Lenguaje de Programación y los aspectos comunes detodas ellas. Entender características generales de los lenguajes de programación:expresividad, sintaxis.

Entender el concepto de abstracción y su importancia en la programación. Entender unlenguaje de programación como una herramienta para construir abstracciones (APIs, clases,tipos de datos, funciones, etc.) que nos van a permitir construir de forma correcta y eficienteuna solución informática (un conjunto de programas que forman un sistema informático que seaplica en un cierto dominio).

Comprender que el objetivo principal de los programas escritos en lenguajes de programaciónes proporcionar una descripción de alto nivel, entendible y comunicable entre humanos, deun proceso que se ejecuta en un procesador. Un programa siempre va a terminar convertidoen instrucciones en código máquina en algún procesador.

Comprender los distintos tipos de ejecución de los lenguajes de programación: lenguajescompilados a código máquina, compilados a bytecodes o interpretados. Entender lasimplicaciones de cada tipo de ejecución y qué lenguaje pertenece a qué tipo.

Tema 1: Historia y conceptos de los lenguajes deprogramación

Conocer el concepto de paradigma de programación y los paradigmas más importantes.Entender que los paradigmas definen una clasificación arbitraria (y a muchas veces difusa) delos distintos lenguajes de programación. Los diseñadores de lenguajes intentan que loslenguajes sean modernos, expresivos y originales y esto les lleva cada vez más a mezclarlibremente características de múltiples paradigmas (ejemplo: Scala y Ruby).

Un lenguaje de programación permite especificar programas que se ejecutan en computadores,programas que definen el comportamiento del computador. Para entender en profundidad qué es unlenguaje de programación es fundamental conocer cuáles son los elementos fundamentales,determinantes, de los computadores. Y para ello es necesario conocer su historia.

Los avances tecnológicos en distintos campos (astronomía, armamento, comercio, etc.) en lossiglos XVI y XVII provocan la necesidad de acelerar y mejorar la precisión de los cálculos.

A principios de 1600 John Napier publica un tratado sobre cómo simplificar operaciones complejascomo multiplicaciones o divisiones convirtiéndolas en sumas y restas usando tablas de logaritmos.

En el siglo XVIII (y, de hecho, hasta los años 1940s) un computador era una persona que secontrataba para realizar cálculos. Cada vez que un editor quería publicar una nueva tabla delogaritmos más precisa tenía que contratar un grupo de computadores, ponerlos a trabajar yrecopilar y transcribir los resultados.

Los errores en cualquier cálculo medianamente complejo eran inevitables. También era tedioso ycostoso el proceso de cálculo. Por ejemplo, el matemático aficionado inglés William Shanks calculódurante 15 años los 707 primeros decimales de pi (aunque sólo eran correctos los 527 primeros,cometió un error en el 528 que arrastró en el resto de dígitos). Publicó el resultado en el año 1873.

En los siglos XVII al XIX científicos, relojeros y aficionados construyeron un gran número demáquinas de calcular. Todas ellas mecánicas. A continuación mostramos algunos ejemplos.

1. Historia de los lenguajes de programación

1.1. Calcular y computar

Máquina de sumar del alemán Wilhelm Schickard (1623)

Máquina de Schickard

La primera máquina de calcular que podía hacer sumas, restas, multiplicaciones y divisiones:

Máquina de Pascal

Máquina de Pascal abierta

Se construyeron alrededor de 50 unidades.

En 1820 el ingeniero inglés Charles Babbage diseñó el motor de diferencias (Babbage differenceengine) para poder calcular e imprimir tablas numéricas de logaritmos utilizando el método de las

Calculadora de Pascal (1650) (Pascalina),

Motor de diferencias de Babbage

diferencias para calcular valores de un polinomio.

Utilizaba un sistema de numeración decimal y consistía en más de 8.000 piezas que se movían conuna palanca giratoria. Babbage trabajó durante varios años en la máquina sin poder completarla. En2002 el Science Museum de Londres presentó una reconstrucción totalmente funcional (ver vídeo).

Motor de diferencias de Babbage

Todas las máquinas de calcular construidas hasta anteriormente eran manuales, un operador debíaintroducir las operaciones una a una. El motor de diferencias es automático (funciona haciendo giraruna palanca) pero estaba diseñada para realizar un único cálculo.

En 1840 Babbage tiene la idea de lo que sería la primera máquina calculadora automáticaprogramable: el motor analítico.

Se trata de una máquina totalmente mecánica, similar al motor de diferencias, pero cuyasoperaciones pueden ser programadas utilizando tarjetas perforadas como las que se usaban en laépoca para programar telares. Babbage diseñó tres tipos de tarjetas: una para las operacionesmatemáticas, otra para las constantes numéricas y otras para las operaciones de carga yalmacenamiento de operaciones y números en la “memoria” de la máquina. La máquina tenía treslectores separados para cada uno de los tipos de tarjetas.

La máquina estaba diseñada para trabajar en base 10 y se podía conseguir que sus cálculosrealizaran saltos condicionales y bucles.

Babbage trabajó durante más de 30 años para intentar construir la máquina. Tenían una enormecomplejidad para la época y necesitaba muchísima financiación. En 1871 murió habiendo podidoconstruir sólo una parte.

Motor analítico de Babbage

1.2. Codificación de la información: tarjetas perforadas

La forma de introducir los programas y los datos en muchos de los primeros computadores eramediante tarjetas perforadas.

Tienen su origen en Herman Hollerith, que las inventó a finales del siglo XIX para automatizar elprocesamiento del censo en los Estados Unidos

En su origen cada tarjeta guardaba los datos de una persona y usaban una codificación unaria: seagujereaba el dato correspondiente (letra o valor) a cada persona (su fecha de nacimiento, sexo,estado civil, etc.)

Las tarjetas perforadas usadas en los primeros computadores ya utilizan una codificación. Cadacolumna (o fila) define un carácter utilizando alguna combinación de agujeros. Cada tarjetaperforada representa una línea de texto.

Tarjeta perforada

Podemos probar un simulador de tarjetas perforadas.

La máquina de Turing no es un computador real, no existe físicamente. Es un modelocomputacional que formula Alan Turing para estudiar matemáticamente cuáles son los límites delcálculo y la computación, si existen problemas que no pueden ser calculados por muy potente quesea el computador.

Alan Turing, en la Universidad de Cambridge, publicó en 1935 su trabajo “On Computable Numbers,with an Application to the Entscheidungsproblem” en el que demuestra que su nuevo modelocomputacional es equivalente a cualquier modelo computacional planteado y que existen problemasque no pueden resueltos por ninguna computación. Este modelo computacional es muy sencillo ymuy elegante, con las características abstractas esenciales de un instrumento de computación. Lamáquina de Turing es muy similar a un computador físico, pero contiene elementos ideales y pocoeficientes que hacen imposible tomarlo como un diseño de a partir del que construir un computadorfísico.

Una máquina de Turing consiste en un scanner lee y escribe 0s y 1s de una cinta infinita (memoria)y se mueve y los escribe en función de una tabla definida en la máquina (programa).

En el mismo trabajo Turing define el concepto de máquina universal que es capaz de leer de la cinta

1.3. 1935: la máquina universal de Turing

un programa cualquiera y simular su comportamiento en otra parte de la cinta. Esta idea tuvo unprofundo impacto en el desarrollo de los computadores, dando origen, una década después, alconcepto de programa almacenado en memoria.

De forma independiente a todos los proyectos que veremos a continuación, el ingeniero alemánKonrad Zuse diseñó y construyó entre 1938 y 1941 la máquina de calcular Z3. Se considera uno delos primeros computadores programables. Era una máquina electromecánica, que utilizaba 2.300relés para construir principalmente una unidad aritmética que operaba sobre dígitos binarios de 22bits.

La máquina Z3 sólo podía ejecutar secuencias fijas de operaciones aritméticas en punto flotante(suma, resta, multiplicación, división y raíz cuadrada) codificadas en una cinta perforada. Elprograma se codificaba en una cinta externa y se leía paso a paso de forma mecánica. En susinstrucciones no existía el salto condicional.

Debido a que los finales de la cinta perforada podían pegarse, la máquina Z3 era capaz de ejecutarde forma repetida un bucle sencillo de operaciones aritméticas que actuaban sobre númerosalmacenados en memoria.

El modelo computacional de la Z3 es el siguiente:

Contiene registros de memoria denotados por letras (no se puede acceder de forma indirecta)La instrucción LOAD carga el contenido del registro (un número en punto flotante) como unoperando de una operación matemáticaLa instrucción STORE guarda el resultado de la operación en un registro

Un ejemplo de programa:

LOAD bLOAD copSTORE a

Arquitectura de la Z3

1941: el computador Z3 de Zuse

Arquitectura de la Z3

El programa de cálculos a realizar se escribía de forma secuencial en una cinta perforada. La Z3 ibaleyendo la cinta y realizando las operaciones indicadas.

Cinta perforada (no del Z3, sino del UNIVAC)

Debido al estallido de la Segunda Guerra Mundial el trabajo de Zuse quedó olvidado y no tuvorepercusión fuera de sus fronteras.

Tecnología: electromecánica, relés

Programación: cinta con instrucciones codificadasMemoria: 64 palabras de 22 bits en almacenadas en relésVelocidad: 1 instrucción por segundo

En paralelo al desarrollo del Z3, de forma independiente, el profesor estadounidense John VincentAtanasoff en la universidad de Iowa y su estudiante de doctorado Cliff Berry diseñan y desarrollan elprimer computador totalmente electrónico, utilizando unas 300 válvulas de vacío (ABC, Atanasoff-Berry Computer).

Realmente no se trataba de un computador genérico, sino de una máquina de cálculo de propósitoespecífico orientada a la resolución de sistemas lineales de ecuaciones algebráicas.

Aunque la parte electrónica se terminó con éxito, el computador no llegó nunca a funcionartotalmente. Las partes mecánicas, como el lector de tarjetas binarias, introdujeron continuamenteerrores irrecuperables.

Tecnología: electrónica, válvulas de vacíoProgramación: no es de propósito general, la entrada de datos y ecuaciones se hace con tarjetasperforadasMemoria: 60 números en representados en binario en palabras de 50 bits almacenadas encondensadoresVelocidad: 30 sumas/restas por segundo

Colossus es el primer computador electrónico digital capaz de funcionar de forma continua. Sedesarrolló en el centro de investigación británico de Bletchley Park en para automatizar ladescodificación de los mensajes alemanes durante la Segunda Guerra Mundial.

En Bletchley Park también trabajó Turing desde 1938, diseñando y construyendo una máquinaelectromecánica (la Turing–Welchman bombe) que aceleró la descodificación de los mensajesproducidos por las máquinas codificadoras alemanas llamadas Enigma.

Colossus fue diseñado y construido entre 1943 y 1944 por el matemático Max Newman y elingeniero Tommy Flowers. Flowers convirtió un diseño inicial electromecánico de Newman en uncomputador totalmente digital electrónico utilizando válvulas de vacío. Colossus I teníaaproximadamente 1600 válvulas de vacío. Las siguientes versiones llegaron a tener 2400. En enerode 1943 se terminó Colossus I. Al final de la guerra, en 1945, había diez versiones más avanzadasfuncionando diariamente en Bletchley Park.

Colossus tampoco fue un computador general. Aunque sus circuitos de válvulas podían realizaroperaciones booleanas y contar, no estaba diseñado para realizar un programa (ni siquiera externo,como el Z3). Estaba diseñado para la tarea específica de descodificación de los mensajes usando

1.4. 1941-45: Los primeros computadores electrónicos

ABC (1942, USA)

Colossus (1944, UK)

un método predeterminado. Los operadores podían modificar parámetros del método genérico dedescodificación alterando el cableado físico de la máquina, mediante enchufes e interruptores.

Todos estos trabajos fueron declarados secretos por el gobierno inglés hasta 1983, cuando seautorizó a Flowers a publicar detalles parciales del Colossus I. Durante muchos años no se supoque la computación electrónica fue clave para descodificar los mensajes alemanes y ayudó deforma decisiva al triunfo aliado en la Segunda Guerra Mundial.

Tecnología: electrónica, válvulas de vacíoProgramación: no es de propósito general, la entrada/salida se realiza con una cinta de datosperforada e interruptoresMemoria: no tiene elementos de memoria

Mark-1 fue diseñada por el profesor Howard Aiken de Harvard y construida por IBM. Era unamáquina enorme, del tamaño de una habitación, formada por miles de piezas conectadas a un árbolde levas de más de 15 metros. El objetivo del Mark-1 era el cálculo de tablas resultantes defunciones matemáticas. Por ejemplo, tablas balísticas para el lanzamiento de misiles.

Tecnología: electromecánica, relésProgramación: programa codificado en una cinta, similar al Z3, sin operador de comparación,entrada de datos con 60 conjuntos de 24 interruptoresMemoria: 72 números en codificación decimal de 23 dígitosVelocidad: 3 sumas/restas por segundo, una división tardaba 15 segundos y un logaritmo o funcióntrigonométrica alrededor de 1 minuto

ENIAC es el primer computador electrónico construido en los EEUU, en la Moore School de launiversidad de Pensilvania, en un proyecto financiado por el departamento de defensa y dirigido porJ. Presper Eckert y John Mauchly.

ENIAC tenía una tecnología similar a Colossus, pero era considerablemente más grande y másflexible (aunque aun estaba lejos de ser un computador de propósito general). La función principalde ENIAC fue el cálculo de tablas numéricas usadas para el cálculo de posición en los lanzamientosbalísticos de misiles.

ENIAC no tenía tampoco un programa almacenado y para modificar su funcionamiento eranecesario reconfigurar la máquina usando enchufes e interruptores. Durante muchos años se creyóque ENIAC fue el primer computador electrónico en funcionamiento, por el secreto que rodeó lafabricación de Colossus.

En 1944 John von Neumann se unió al grupo de desarrollo del ENIAC y aconsejó modificaciones enla arquitectura que llevaron, en 1948, a introducir un mecanismo primitivo de programa almacenadoen memoria.

Mark-1 (1944, USA)

ENIAC (1945, USA)

En los diseños iniciales del ENIAC se utilizaba una cinta de instrucciones similar a la del Z3. Eckertparece que también se dio cuenta de forma independiente, antes de la llegada de von Neumann, deque la lectura de instrucciones de forma mecánica era el cuello de botella de la máquina. La formade sacar todo el partido a la velocidad a la que los datos se procesaban por los circuitoselectrónicos era colocar las instrucciones codificadas en los mismos dispositivos de alta velocidadque almacenaban las instrucciones.

Tecnología: electrónica, 17.000 válvulas de vacíoPrograma: podía realizar bucles, condicionales o subrutinas, pero el programa se introducíamodificando sus interruptores y clavijas. La entrada y salida de datos se realizaba con tarjetasperforadasMemoria: 20 registros decimalesVelocidad: 5.000 sumas/restas por segundo

En 1945, mientras que el ENIAC estaba todavía en construcción, von Neumann, trabajando en laUniversidad de Princeton (EEUU) escribió su famoso informe First Draft of a Report on the EDVACen el que propone la arquitectura básica de un computador digital de propósito general conprogramas almacenados en memoria (stored-program electronic computer) que denominó EDVAC.

Von Neumann se había interesado en el concepto de máquina universal de Turing en los años 36-38, cuando coincidió con Turing en la Universidad de Princeton. En la Moore School, von Neumannresaltó la importancia del concepto de programa almacenado para la computación electrónica,incluyendo la posibilidad de permitir que la máquina modificara su propio programa cuando estabaen ejecución (por ejemplo, para controlar los bucles y los condicionales).

Von Neumann trabajó desde 1945 hasta 1950 en la construcción de un computador con esaarquitectura en el Instituto for Advanced Study en Princeton.

El EDVAC se completó seis años después, pero no por sus diseñadores, que dejaron la MooreSchool para construir computadores en otras empresas.

En 1946 se celebraron en la Moore School conferencias y seminarios sobre el EDVAC y suarquitectura. Asistieron un gran número de investigadores americanos e ingleses. Las conferenciasterminaron de impulsar en universidades y centros de investigación de empresas el concepto dearquitectura de computador basado en programas almacenados en memoria.

El concepto de programa almacenado en memoria es clave en la historia de los lenguajes deprogramación. Desde el momento en que un programa se puede almacenar en memoria, se puedetratar de la misma forma que se tratan otros datos. Aparecen los preprocesadores, lincadores,compiladores e intérpretes. Programas que procesan otros programas.

El EDSAC fue uno de los primeros computadores en funcionamiento que utilizó la arquitectura vonNeumann con el programa almacenado en memoria. Fue desarrollado por un equipo dirigido por

1.5. La arquitectura von Neumann

EDSAC (1949, UK)

Maurice Wilkes. Wilkes había asistido tres años antes a los seminarios de la Moore School endonde conoció los fundamentos de la arquitectura.

Para la programación del EDSAC, Wilkes estableció una biblioteca de programas cortos llamadossubrutinas almacenados en tarjetas perforadas.

Tecnología: válvula de vacíoPrograma: almacenado en memoria, leído con tarjetas perforadasMemoria: 1000 palabras de 16 bits almacenadas en memorias de línea de retardo de mercurioVelocidad: 714 operaciones por segundo

Una vez terminada la guerra, después de trabajar en el diseño de Colossus, Max Newmann crea elComputing Machine Laboratory en la universidad de Manchester.

El primer computador electrónico digital de propósito digital con programa almacenado se construyóen este laboratorio. Se conoció con el nombre de Manchester ‘Baby’. Fue diseñado por MaxNewmann usando la tecnología proporcionada por los ingenieros F.C. Williams y Tom Kilburn.Williams había inventado un dispositivo de memoria electrónico (la válvula de Williams) capaz desustituir las lentas líneas de retardo de mercurio.

Max Newmann fue otra de las figuras claves en la divulgación de las ideas fundamentales de loscomputadores y de la arquitectura basada en un programa almacenado y un conjunto deinstrucciones capaz de saltos, condicionales y direccionamientos indirectos.

En una charla en la Royal Society el 4 marzo de 1948 explicaba estos conceptos de la siguientemanera:

The machines now being made in America and in this country are in certain general respectsall similar. There is provision for storing numbers, say in the scale of 2, so that each numberappears as a row of, say, forty 0’s and 1’s in certain places or “houses” in the machine.

Certain of these numbers, or “words” are read, one after another, as orders. In one possibletype of machine an order consists of four numbers, for example 11, 13, 27, 4. The number 4signifies “add”, and when control shifts to this word the “houses” H11 and H13 will beconnected to the adder as inputs, and H27 as output. The numbers stored in H11 and H13pass through the adder, are added, and the sum is passed on to H27. The control then shifts tothe next order.

In most real machines the process just described would be done by three separate orders, thefirst bringing [H11] (=content of H11) to a central accumulator, the second adding [H13] into theaccumulator, and the third sending the result to H27; thus only one address would be requiredin each order.

A machine with storage, with this automatic-telephone-exchange arrangement and with thenecessary adders, subtractors and so on, is, in a sense, already a universal machine.

Máquina de Manchester (1948, UK)

La máquina de Manchester fue el primer computador con un conjunto de instrucciones completo,capaz de realizar saltos, condicionales y direccionamiento indirecto. La primera ejecución de unprograma fue el 21 de junio de 1948. En esa fecha Alan Turing se incorporó a la universidad deManchester, como director del Laboratorio de Computación. Tres años después, con un diseñoampliado en el que también influyó Turing, una versión mucho mayor de la máquina se convirtió enel primer computador disponible comercialmente, el Ferranti Mark I. El primero se instaló en launiversidad de Manchester en febrero de 1951, un mes antes que el UNIVAC I fuera entregado alDepartamento de Censo de los EEUU. Se vendieron otras 10 máquinas a Gran Bretaña, Canadá,Holanda e Italia.

El primer programa complejo de Inteligencia Artificial, un jugador de damas escrito por ChristopherStrachey, se ejecutó en el verano de 1952 en el Ferranti Mark I en el Laboratorio de Computaciónde Manchester. Strachey escribió el programa animado por Turing y usando el manual deprogramación del Ferranti que Turing acababa de escribir. Turing participó también en el desarrollode otros programas de IA, como un jugador de ajedrez basado en heurísticas.

Puedes encontrar otros hitos de la historia del computador en la línea de tiempo de la historia delcomputador del Computer History Museum.

A pesar de haberse desarrollado múltiples variantes de máquinas, arquitecturas y modelos decomputador, existen ciertos elementos esenciales comunes a todos ellos.

Un computador se dice que es universal cuando su conjunto de instrucciones permite realizarcualquier programa computable. De forma teórica un computador es universal cuando es posiblesimular con él una máquina de Turing.

Los primeros computadores tenían cierta flexibilidad, pero estaban muy lejos de ser universales.

Un computador universal debe tener suficiente memoria accesible por referencia, acceso indirecto,como mínimo un acumulador y ser capaz de ejecutar el conjunto de instrucciones CLR (clear), INC(increment), LOAD, STORE, and BZ (branch if zero) (Raul Rojas, Konrad Zuse’s Legacy).

De forma práctica, los computadores empezaron a dejar de ser máquinas de calcular y empezarona resolver otros tipos de problemas: problemas combinatorios de búsqueda eficiente en un espaciode soluciones (criptografía o problemas matemáticos) o primeras aplicaciones de inteligenciaartificial (juegos como las damas).

Un concepto fundamental de los conjuntos de instrucciones de los procesadores es el dedireccionamiento indirecto:

1.6. Otros hitos de la historia de los computadores

1.7. Características esenciales de un computador

Computador universal

El direccionamiento indirecto

LOAD A [B]

El contenido del registro B es una dirección de memoria, y la sentencia accede a esa dirección ycarga en el registro A su contenido.

En los lenguajes de programación de alto nivel, el direccionamiento indirecto se representa conpunteros o referencias. Por ejemplo, en la siguiente sentencia de C, se guarda en la variable a

una referencia a la dirección de memoria en la que comienza la cadena "Hola, mundo" .

char *a = "Hola, mundo"

El * como una forma de indicar un direccionamiento indirecto ya se usaba en el ensamblador delIBM 7090.

El direccionamiento indirecto es necesario para que un conjunto de instrucciones de un procesadorsea Turing computable (On Basic Concepts of Early Computers in Relation to ContemporaryComputer Architectures, Raúl Rojas)

Sin el direccionamiento indirecto es imposible acceder al contenido de tablas con un númerovariable de elementos. Es necesario para acceder a los contenidos de un array en memoria.

Los primeros computadores electrónicos se programan directamente usando el conjunto deinstrucciones del procesador, en código máquina, código hexadecimal

El primer lenguaje de un nivel algo más elevado que el código máquina es el ensamblador.Programas que empiezan a ayudar a los programadores: ensambladores. Hay una relación casidirecta entre la notación en ensamblador y el código hexadecimal que produce el ensamblador.

A finales de la década de los 40 se empiezan a intentar resolver con los primeros computadores losprimeros problemas matemáticos distintos de operaciones numéricas: codificación ydescodificación, problemas combinatorios como el coloreado del mapa o problemas de ordenación.

Uno de los primeros algoritmos de von Neumann realiza una ordenación de un conjunto denúmeros. Von Neumann lo describe en una carta fechada en 1945. Utiliza el conjunto deinstrucciones del EDSAC cuando todavía no se había construido. El programa fue estudiado porDonald Knuth en el artículo Von Neumann’s first Computer Program, en donde documenta quehabía un bug en las primeras instrucciones. Es el primer bug escrito del que se tiene historia. Si VonNeumann hubiera podido ejecutar el programa en el EDSAC se hubiera dado cuenta del error yhubiera sido la primera depuración de un programa.

1.8. Los primeros lenguajes de programación

Primer programa de Von Neumann

(Donald Knuth, “Von Neumann’s first Computer Program”, Journal of the ACM Computing Surveys(CSUR) Surveys, Volume 2 Issue 4, Dec. 1970, Pages 247-260)

El UNIVAC fue el primer computador comercial (1951). Con este computadora aparece por primeravez la figura del programador: manuales, cursos de formación, ofertas de empleo, etc.

1.9 El nacimiento de los computadores comerciales

Foto UNIVAC

Instalaciones UNIVAC

Los computadores son lentos y muy complicados de instalar y mantener.

Manual de programación del UNIVAC (1959)

Son más importantes las horas de funcionamiento del computador que las horas de trabajo delprogramador.

La complejidad de las tareas a programar es pequeña y es suficiente con los programas enensamblador.

El manual de 1959 de programación del UNIVAC es una referencia histórica de gran interés de laque hemos extraído las siguientes imágenes:

Manual del UNIVAC

Programación UNIVAC

Algoritmo UNIVAC

Codigo UNIVAC

Se realizan los primeros anuncios y reportajes de televisión sobre computadores (YouTube)

Anuncio UNIVAC

El IBM 704 fue el otro gran ordenador comercial de la década de los 50.

Tuvo una difusión mucho mayor que el UNIVAC: centros gubernamentales, universidades.

Los primeros lenguajes de programación de alto nivel se desarrollan para este computador.

Foto IBM 704

IBM 704

Programando los primeros computadores

The UNIVAC I was an interesting machine to program, with its mercury delay line storage andits short mean time to failure. Programs were entered into the computer by typing them ontosteel magnetic tape, a major innovation at that time.

Working with the IBM 704 at NYU was an entirely different experience from the UNIVAC I. Itwas built for executing scientific applications, and had as its major innovation a magnetic corememory, replacing the Williams tube memory of the IBM 701 and the primary memory drum ofthe IBM 650. It also had a floating point arithmetic unit and index registers to form effectiveaddresses, both of which were significant advances at that time. The machine had theequivalent of 128 KB primary memory, 32 KB of secondary drum memory and magnetic tapesthat held 5 MB of data. It operated at 0.04 MIPS, and cost $3 million dollars in 1957, theequivalent of perhaps $20 million today.

George Sadowsky, My Second Computer was a UNIVAC I

Los primeros lenguajes de alto nivel se desarrollaron a finales de la década de los 50:

* FORTRAN en 1956* Lisp en 1958

Ambos lenguajes planteaban dos enfoques muy distintos desde el principio:

FORTRANPrimer lenguaje comercial, equipo de IBM dirigido por John W. BackusLenguaje imperativo: estado, estructuras de control, contador de programa, celdas dememoriaLenguaje compilado

LispLenguaje diseñado en un departamento de investigación, un equipo del MIT dirigido porJohn McCarthyLenguaje funcional: funciones, recursión, listas, símbolosLenguaje interpretado

Desarrollado por IBM para programar el IBM 704. Algunos datos:

Su nombre proviene de FORmula TRANslating system.El primer manual de FORTRAN se imprime en octubre de 1956 para el IBM 704.El primer compilador se comercializa en abril de 1956.

Cita de John Backus (Wikipedia sobre FORTRAN):

Much of my work has come from being lazy. I didn’t like writing programs, and so, when I was

1.10. Los primeros lenguajes de alto nivel

FORTRAN

working on the IBM 701, writing programs for computing missile trajectories, I started work ona programming system to make it easier to write programs.

John Backus

Ejemplo FORTRAN

Tomado del manual de FORTRAN del IBM 704

El otro lenguaje de alto nivel desarrollado en esa época es el Lisp. Desarrollado a finales de los 50en el MIT por John McCarthy.

Aunque históricamente el nombre del lenguaje se solía escribir con letras mayúsculas (LISP),posteriormente se ha popularizado el uso de la mayúscula sólo para la primera letra (Lisp). Esta

Lisp

forma es más fiel al origen del nombre del lenguaje. Lisp no es un acrónimo, sino la contracción dela expresión List Processing. El procesamiento de listas es una de las características principales delLisp.

McCarthy explica en un artículo de 1979 la historia inicial del Lisp:

[…] My desire for an algebraic list processing language for artificial intelligence work on theIBM 704 computer arose in the summer of 1956 during the Dartmouth Summer ResearchProject on Artificial Intelligence which was the first organized study of AI. […]

[…] There were two motivations for developing a language for the IBM 704. First, IBM wasgenerously establishing a New England Computation Center at M.I.T. which Dartmouth woulduse. Second, IBM was undertaking to develop a program for proving theorems in planegeometry (based on an idea of Marvin Minsky’s), and I was to serve as a consultant to thatproject. At the time, IBM looked like a good bet to pursue artificial intelligence researchvigorously, and further projects were expected. It was not then clear whether IBM’s FORTRANproject would lead to a language within which list processing could conveniently be carried outor whether a new language would be required.[…]

[…] I invented conditional expressions in connection with a set of chess legal move routines Iwrote in FORTRAN for the IBM 704 at M.I.T. during 1957-58. This program did not use listprocessing. The IF statement provided in FORTRAN 1 and FORTRAN 2 was very awkward touse, and it was natural to invent a function XIF(M,N1,N2) whose value was N1 or N2 accordingto whether the expression M was zero or not. The function shortened many programs andmade them easier to understand, but it had to be used sparingly, because all three argumentshad to be evaluated before XIF was entered, since XIF was called as an ordinary FORTRANfunction though written in machine language. This led to the invention of the true conditionalexpression which evaluates only one of N1 and N2 according to whether M is true or false andto a desire for a programming language that would allow its use.[…]

John McCarthy, History of LISP

John McCarthy

Uno de los primeros manuales de Lisp publicados es el manual de LISP de 1960 para el IBM 704escrito por Phyllis A. Fox. del grupo de investigación del MIT dirigido por McCarthy.

Un ejemplo de código Lisp:

[Ejemplo LISP]

[Ejemplo LISP]: ./imagenes/tema01-historia_lenguajes_programacion/codigo-LISP_500px.pngTomado de “The Programming Language LISP”, MIT Press, 1964

Desde 1954 hasta la actualidad se han documentado más de 2.500 (consultar en The LanguageList). Entre 1952 y 1972 alrededor de 200 lenguajes. Una decena fueron realmente siginificativos ytuvieron influencia en el desarrollo de lenguajes posteriores.

1.11. La explosión de los lenguajes de programación

1.12. La evolución de los lenguajes de programación

Genealogía de los lenguajes de programación

Genealogía de los LP

Algunas notas sobre la genealogía:

APL es un lenguaje algebraico declarativo de especificación de funciones y circuitos lógicos.Su carácter declarativo ha tenido influencia en lenguajes como Prolog o Haskell.

Lisp no sólo es un lenguaje funcional, sino que también es el primer lenguaje interpretado, conmuchas características de tiempo de ejecución y poco chequeo estático. En esos aspectos hainfluido en lenguajes dinámicos no funcionales como Python o Smalltalk. Lenguajes comoSmalltalk o Objective-C también heredan de Lisp algunas características funcionales como laposibilidad de usar un bloque de código como un objeto primitivo que se crea en tiempo deejecución y que se puede asignar o pasar como parámetro. Es lo que se denomina clausura enel paradigma de programación funcional.

SIMULA es el primer lenguaje que define conceptos como clase u objeto. Es el origen de laprogramación orientada a objetos estática y fuertemente tipeada. Lenguajes como C++, Eiffel,o Java toman esta idea. Frente a esta tendencia se encuentra otra visión de la programaciónorientada a objetos de lenguajes como Smalltalk u Objective-C en la que se enfatiza másaspectos dinámicos como el paso de mensajes o la modificación de clases en tiempo deejecución.

1950-1960 1970 1980 1990 2000

1957 FORTRAN 1970 Pascal 1980 Smalltalk-80 1990 Haskell 2000 C#

1958 ALGOL 1972 Prolog 1983 Objective-C 1991 Python 2003 Scala

1960 Lisp 1972 C 1983 Ada 1993 Ruby 2003 Groovy

1960 COBOL 1975 Scheme 1986 C++ 1995 Java 2009 Go

1962 APL 1975 Modula 1986 Eiffel

1964 BASIC 1987 Perl

1967 SIMULA

¿Por qué hay tanta variedad en los lenguajes de programación? Hay muchos aspectos quefomentan esta variedad y que provocan la necesidad de nuevos lenguajes:

Nuevos recursos y tipos de ordenadoresNuevas aplicaciones y necesidades de los usuariosNuevos métodos de programaciónDescubrimientos en estudios teóricosNecesidad de estandarización

La siguiente tabla (extraída del libro Programming Languages. Design and Implementation, deTerrence W. Pratt y Marvin V. Zelkowitz) muestra una pequeña lista de los lenguajes y lasinfluencias que fueron importante a finales del siglo 20.

Algunos lenguajes importantes y su fecha de creación

Aspectos que provocan la evolución de los LP

Evolución de los lenguajes

Si comprobamos la historia de los lenguajes de programación, podemos clasificar a sus creadoresen tres grandes categorías:

Investigadores trabajando en empresas (Backus-IBM-FORTRAN, Gosling-Sun-Java)Investigadores en universidades y departamentos de Informática (McCarthy-MIT-Lisp, Wirth-ETH-Pascal, Odersky-EHT-Scala)Desarrolladores open source que distribuyen su trabajo a la comunidad (Wall-Perl, Matsumoto-

Los creadores de los LPs

Ruby)

El índice TIOBE es un indicador de la popularidad de los lenguajes de programación. El índice seactualiza una vez al mes. Las puntaciones se basan en estadísticas no reveladas que incluyen elnúmero de ingenieros en todo el mundo, cursos y aplicaciones desarrolladas. También se utilizanresultados obtenidos en los motores de búsqueda más usados.

El índice TIOBE no trata de medir el número de líneas escritas en los lenguajes de programaciónsino su popularidad e importancia en la comunidad.

Lista TIOBE

También es muy interesante comprobar la evolución de los 10 lenguajes más populares en losúltimos 10 años.

1.13. Lenguajes de programación en la actualidad

Evolución TIOBE

Es interesante comprobar que cada vez es más fácil desarrollar nuevos lenguajes de programación.Las técnicas y herramientas de procesamiento de lenguajes se han popularizado cada vez más yson accesibles a mayor número de personas. Los lenguajes ya no sólo se crean en departamentoscon un gran número de investigadores, sino también en comunidades open source formadas porvoluntarios interesados y motivados

Ejemplos de nuevos lenguajes y sus creadores:

Ruby

La evolución no se detiene

Foto Matsumoto

Ruby, un lenguaje de programación ideado en 1993 por el desarrollador japonés YukihiroMatsumotoLenguaje multi-paradigma interpretado y muy expresivo que actualmente se utiliza tanto paradesarrollar aplicaciones web como videojuegos.Proyecto vivo, cada año aparecen nuevas versiones

Scala

Foto Odersky

Scala, diseñado en 2003 por el profesor alemán Martin OderskyRespuesta a los problemas de los lenguajes tradicionales imperativos para manejar laconcurrenciaEstá implementado sobre Java y corre en la Máquina Virtual Java

Go

Foto Thompson

Go, el nuevo lenguaje de programación de Google lanzado en 2009Desarrollado, entre otros, por Ken Thompson, uno de los padres del UNIXUna mezcla de C y Python que intenta conseguir un lenguaje de programación de sistemasmuy eficiente, expresivo y también multiparadigma.

A programming language is a set of characters, rules for combining them, and rules specifying theireffects when executed by a computer, which have the following four characteristics:

1. It requires no knowledge of machine code on the part of the user2. It has machine independence3. Is translated into machine language4. Employs a notation that is closer to that of the specific problem being solved than is machine

code

We are about to study the idea of a computational process. Computational processes areabstract beings that inhabit computers. As they evolve, processes manipulate other abstractthings called data. The evolution of a process is directed by a pattern of rules called aprogram. […] The programs we use to conjure processes are like a sorcerer’s spells. They arecarefully composed from symbolic expressions in arcane and esoteric programming languagesthat prescribe the tasks we want our processes to perform.

Y otra idea fundamental

A powerful programming language is more than just a means for instructing a computer toperform tasks. The language also serves as a framework within which we organize our ideasabout processes. Thus, when we describe a language, we should pay particular attention tothe means that the language provides for combining simple ideas to form more complex ideas.

2. Elementos de los lenguajes de programación

2.1. Definición de la Encyclopedia of Computer Science

2.2. Definición de Abelson y Sussman

1. Define un proceso que se ejecuta en un computador2. Es de alto nivel, cercano a los problemas que se quieren resolver (abstracción)3. Permite construir nuevas abstracciones que se adapten al dominio que se programa

Para Abelson y Sussman, todos los lenguajes de progamación permiten combinar ideas simples enideas más complejas mediante los siguientes tres mecanismos

Expresiones primitivas que representan las entidades más simples del lenguajeMecanismos de combinación con los que se construyen elementos compuestos a partir deelementos más simplesMecanismos de abstracción con los que dar nombre a los elementos compuestos ymanipularlos como unidades

Sintaxis: un conjunto de reglas que definen qué expresiones de texto son correctas. Por ejemplo, enC todas las sentencias deben terminar en ‘;’

Los lenguajes de programación se ejecutan en un computador y tienen una determinada semánticaque define cuál será el resultado de la ejecución de un programa.

Los lenguajes de programación deben ser precisos, deben poder traducirse sin ambigüedad enlenguaje máquina para que sean ejecutados por computadores. Pero deben ser utilizados (leídos,comentados, probados, etc.) por personas.

La programación es una actividad colaborativa y debe basarse en la comunicación.

Es importante conocer cómo funciona “por dentro” un lenguaje de programación y suscaracterísticas comparadas.

Mejora el uso del lenguaje de programaciónIncrementa el vocabulario de los elementos de programaciónPermite una mejor elección del lenguaje de programaciónMejora la habilidad para desarrollar programas efectivos y eficientesFacilita el aprendizaje de un nuevo lenguaje de programaciónFacilita el diseño de nuevos lenguajes de programación

2.3. Características de un LP

2.4. Elementos de un LP

2.5. Sintaxis y semántica

2.6. Los lenguajes son para las personas

2.7. Importancia del aprendizaje de técnicas de LPs

3. Abstracción

Una misión fundamental de los lenguajes de programación es proporcionar herramientas que sirvanpara construir estas abstracciones. Cuando definimos una abstracción le damos un nombre a unaentidad del lenguaje (una variable, una función, una clase, etc.).

Escoger un buen nombre para los elementos que vamos construyendo en nuestro programas esfundamental para conseguir un código legible y reutilizable.

Para escribir un programa que preste unos servicios es fundamental modelar el dominio sobreel que va a trabajarEs necesario definir distintas abstracciones (tanto APIs, como datos) que nos permitan tratarsus elementos y comunicarnos correctamente con los usuarios que van a utilizar el programa.Las abstracciones que vamos construyendo van apoyándose unas en otras y permiten hacercompresible y comunicable un problema complejoEjemplo: el modelado del funcionamiento de una biblioteca contiene abstracciones como“libros”, “préstamo”, “reserva”, o “libros disponibles” que representan conceptos del dominioque deben ser implementados en nuestra solución

Casos de uso biblioteca

3.1. Modelar como una actividad fundamental

3.2. Abstracciones computacionales

Existen abstracciones propias de la informática (computer science), que se utilizan en múltiplesdominios. Por ejemplo, abstracciones de datos como:

ListasÁrbolesGrafosTablas hash

También existen abstracciones que nos permiten tratar con dispositivos y ordenadores externos:

FicheroRaster gráficoProtocolo TCP/IP

Uno de los trabajos principales de un informático es la construcción de abstracciones que permitanahorrar tiempo y esfuerzo a la hora de tratar con la complejidad del mundo real.

Cita de Joel Spolsky en su blog Joel on Software

TCP is what computer scientists like to call an abstraction: a simplification of something muchmore complicated that is going on under the covers. As it turns out, a lot of computerprogramming consists of building abstractions. What is a string library? It’s a way to pretendthat computers can manipulate strings just as easily as they can manipulate numbers. What isa file system? It’s a way to pretend that a hard drive isn’t really a bunch of spinning magneticplatters that can store bits at certain locations, but rather a hierarchical system of folders-within-folders containing individual files that in turn consist of one or more strings of bytes.

La programación es una disciplina compleja, que tiene que tener en cuenta múltiples aspectos delos lenguajes de programación y las API:

1. Programas como procesos runtime que se ejecutan en un computador. Tenemos que entenderqué pasa cuando se crea un objeto, cuánto tiempo permanece en memoria, cuál es el ámbitode una variable, etc.

Herramientas: depuradores, analizadores de rendimiento.

2. Programas como declaraciones estáticas. Hay que considerar un programa desde el punto devista de una declaración de nuevos tipos, nuevos métodos, tipos genéricos, herencia entreclases, etc.

Herramientas: entornos de programación con autocompletado de código, detección de erroressintácticos.

3. Programas como comunicación y actividad social. Tenemos que tener en cuenta que un

3.3. Construcción de abstracciones

3.4. Distintos aspectos de los lenguajes de programación

programa va a ser usado por otras personas, leído, extendido, mantenido, modificado. Losprogramas siempre se van a modificar.

Herramientas: sistemas de control de versiones (Git, Mercurial, Github, Bitbucket), de gestiónincidencias (Jira) , tests que evitan errores de regresión, …

Un paradigma define un conjunto de características, patrones y estilos de programación basados enalguna idea fundamental. Por ejemplo el paradigma funcional se basa en la idea que unacomputación se puede especificar como un conjunto de funciones que transforman valores deentrada en valores de salida.

Es conveniente ver un paradigma como un estilo de programación que puede usarse en distintoslenguajes de programación y expresarse con distintas sintaxis. Por ejemplo, se puede escribircódigo que use programación lógica en Prolog (sería lo más natural), pero también en Java, usandoalgún API específica.

Normalmente todos los lenguajes tienen características de más de un paradigma. Por motivosprácticos los lenguajes más populares no se limitan de forma estricta o pura a un único paradigmade programación.

Por ejemplo, el Prolog es un lenguaje en su mayor parte lógico y declarativo, pero tiene operadoresimperativos como el corte. A pesar de ello, es normal adscribir un lenguaje al paradigma en el quees más sencillo o natural escribir código usando sus construcciones.

Existen lenguajes que refuerzan y promueven la expresión de código en más de un paradigma deprogramación. Y lo hacen no por necesidad o accidente, sino con el intento explícito de fusionarmás de un paradigma en una forma única de programar. Estos lenguajes se denominan lenguajesmulti-paradigma.

Por ejemplo, Scala es lenguaje multi-paradigma en el que Martin Odersky, su creador, mezclacaracterísticas de programación orientada a objetos con programación funcional.

Prolog o Lisp, aunque tienen características no lógicas o no funcionales, no pueden serconsiderados multi-paradigma porque no fueron creados con la idea de integrar paradigmasvariados en una forma coherente de expresión.

Paradigma funcionalParadigma lógicoParadigma imperativo o proceduralParadigma orientado a objetos

4. Paradigmas de programación

4.1. ¿Qué es un paradigma de programación?

4.2. Paradigmas más importantes

Resumen de las características principales:

La computación se realiza mediante la evaluación de expresionesDefinición de funcionesFunciones como datos primitivosValores sin efectos laterales, no existen referencias a celdas de memoria en las que se guardaun estado modificableProgramación declarativa (en la programación funcional pura)

Lenguajes: Lisp, Scheme, Haskell, Scala, Clojure.

Ejemplo de código (Lisp):

(define (factorial x) (if (= x 0) 1 (* x (factorial (- x 1)))))

(factorial 8)40320(factorial 30)265252859812191058636308480000000

Características:

Definición de reglasUnificación como elemento de computaciónProgramación declarativa

Lenguajes: Prolog, Mercury, Oz.

Ejemplo de código (Prolog):

4.3. Paradigma funcional

4.4. Paradigma lógico

padrede('juan', 'maria'). % juan es padre de mariapadrede('pablo', 'juan'). % pablo es padre de juanpadrede('pablo', 'marcela').padrede('carlos', 'debora').

hijode(A,B) :- padrede(B,A).abuelode(A,B) :- padrede(A,C), padrede(C,B).hermanode(A,B) :- padrede(C,A) , padrede(C,B), A \== B.

familiarde(A,B) :- padrede(A,B).familiarde(A,B) :- hijode(A,B). familiarde(A,B) :- hermanode(A,B).

?- hermanode('juan', 'marcela').yes?- hermanode('carlos', 'juan').no?- abuelode('pablo', 'maria').yes?- abuelode('maria', 'pablo').no

Los lenguajes de programación que cumplen el paradigma imperativo se caracterizan por tener unestado implícito que es modificado mediante instrucciones o comandos del lenguaje. Comoresultado, estos lenguajes tienen una noción de secuenciación de los comandos para permitir uncontrol preciso y determinista del estado.

Características:

Definición de procedimientosDefinición de tipos de datosChequeo de tipos en tiempo de compilaciónCambio de estado de variablesPasos de ejecución de un proceso

Ejemplo (Pascal):

4.5. Paradigma imperativo

type tDimension = 1..100; eMatriz(f,c: tDimension) = array [1..f,1..c] of real;

tRango = record f,c: tDimension value 1; end;

tpMatriz = ^eMatriz;

procedure EscribirMatriz(var m: tpMatriz);var filas,col : integer;begin for filas := 1 to m^.f do begin for col := 1 to m^.c do write(m^[filas,col]:7:2); writeln(resultado); writeln(resultado) end; end;

Características:

Definición de clases y herenciaObjetos como abstracción de datos y procedimientosPolimorfismo y chequeo de tipos en tiempo de ejecución

Ejemplo (Java):

4.6. Paradigma orientado a objetos

public class Bicicleta { public int marcha; public int velocidad; public Bicicleta(int velocidadInicial, int marchaInicial) { marcha = marchaInicial; velocidad = velocidadInicial; } public void setMarcha(int nuevoValor) { marcha = nuevoValor; } public void frenar(int decremento) { velocidad -= decremento; } public void acelerar(int incremento) { velocidad += incremento; }}

public class MountainBike extends Bicicleta { public int alturaSillin;

public MountainBike(int alturaInicial, int velocidadInicial, int marchaInicial) { super(velocidadInicial, marchaInicial); alturaSillin = alturaInicial; } public void setAltura(int nuevoValor) { alturaSillin = nuevoValor; } }

public class Excursion { public static void main(String[] args) { MountainBike miBicicleta = new MoutainBike(10,10,3); miBicicleta.acelerar(10); miBicicleta.setMarcha(4); miBicicleta.frenar(10); }}

Existe una gran variedad de estrategias para conseguir que un programa se ejecute en uncomputador. Todas se basan en los “meta-programas” (compiladores, intérpretes, etc.) cuyos datos

5. Compiladores e intérpretes

de entrada son el código fuente de otros programas.

El resultado final debe ser siempre la ejecución en uno o más computadores del programa que seestá procesando.

Esto lo consiguen los meta-programas con distintos enfoques y técnicas: compilación,interpretación, ejecución mediante máquina virtual, enlazado de librerías, etc.

La siguiente figura (tomada, como las demás de este apartado del Programming LanguagePragmatics) muestra el proceso de generación y ejecución de un programa compilado.

Compilación

Ejemplos: C, C++Diferentes momentos en la vida de un programa: tiempo de compilación y tiempo de ejecuciónMayor eficiencia

Interpretación

Ejemplos: BASIC, Lisp, Scheme, Python, RubyNo hay diferencia entre el tiempo de compilación y el tiempo de ejecuciónMayor flexibilidad: el código se puede construir y ejecutar “on the fly” (funciones lambda oclousures)

Los lenguajes interpretados suelen proporcionar un shell o intérprete. Se trata de un entornointeractivo en el que podemos definir y evaluar expresiones. Este entorno se denomina en loscírculos de programación funcional un REPL (Read, Eval, Print, Loop) y ya se utilizó en los primeros

5.1. Compilación

5.2. Interpretación

años de implementación del Lisp. El uso del REPL promueve una programación interactiva en laque continuamente evaluamos y comprobamos el código que desarrollamos.

Cuidado, no confundir con las máquinas virtuales del tipo VirtualBox o VmWare.

En nuestro caso, la máquina virtual es un proceso que se ejecuta en el sistema operativo y queejecuta el código binario intermedio al que se compila un lenguaje (Java, por ejemplo).

Permite independizar la generación de código del procesador en el que se ejecuta el programa. Elcódigo binario intermedio es multi plataforma.

Máquina virtual

Ejemplos: Java, Scala

Introducción capítulo 1 SICP, Building Abstractions with ProceduresCapítulo 1.2 PLP, The Programming Language SpectrumCapítulo 1.3 PLP, Why Study Programming LanguagesCapítulo 1.4 PLP, Compilation and InterpretationRaul Rojas, “Konrad Zuse’s legacy the architecture of the Z1 and Z3”, IEEE Annals of theHistory of Computing, Vol. 19, No. 2, 1997Charles Petzold, “Code”, Microsoft Press, 2000 (Capítulo 18: “From Abaci to Chips”)Jack Copeland, “The Modern History of Computing”, The Stanford Encyclopedia of Philosophy(Fall 2008 Edition), URL = http://plato.stanford.edu/archives/fall2008/entries/computing-history/Georgi Dalakov, “History of Computers”, URL = http://history-computer.com

Lenguajes y Paradigmas de Programación, curso 2013-14© Departamento Ciencia de la Computación e Inteligencia Artificial, Universidad de AlicanteDomingo Gallardo, Cristina Pomares

5.3. Ejecución en máquina virtual

6. Bibliografía