Tema 1: Lenguajes de programacin
ndice
1 Historia de los lenguajes de programacin........................................................................ 2
2 Elementos de los lenguajes de programacin.................................................................. 10
2.1 No son lenguajes de programacin..............................................................................10
2.2 Caractersticas de los lenguajes de programacin....................................................... 11
2.3 Abstraccin..................................................................................................................13
3 Paradigmas de programacin........................................................................................... 14
3.1 Paradigma funcional.................................................................................................... 15
3.2 Paradigma lgico......................................................................................................... 15
3.3 Paradigma imperativo..................................................................................................16
3.4 Paradigma orientado a objetos.....................................................................................17
4 Scheme Como lenguaje de programacin........................................................................18
4.1 Algunos ejemplos de Scheme......................................................................................18
4.2 Por qu Scheme?........................................................................................................19
4.3 Algunas primitivas.......................................................................................................20
4.4 Extensiones de Scheme............................................................................................... 23
4.5 Abstraccin: define......................................................................................................23
4.6 Estructuras de control.................................................................................................. 25
5 Referencias.......................................................................................................................27
Copyright 2006 Depto. CCIA, Universidad de Alicante All rights reserved.
1. Historia de los lenguajes de programacin
Desde 1954 hasta la actualidad se han documentado ms de 2.500 lenguajes de programacin
(consultar en The Language List
(http://people.ku.edu/~nkinners/LangList/Extras/langlist.htm) ). Entre 1952 y 1972, la
primera poca de los lenguajes de programacin, se desarrollaron alrededor de 200 lenguajes,
de los que una decena fueron realmente siginificativos y tuvieron influencia en el desarrollo
de lenguajes posteriores.
Una lista parcial de algunos de los lenguajes de programacin ms importantes, junto con su
ao de creacin:
1957 FORTRAN
1958 ALGOL
1960 Lisp
1960 COBOL
1962 APL
1962 SIMULA
1964 BASIC
1964 PL/I
1970 Prolog
1972 C
1975 Pascal
1975 Scheme
1975 Modula
1983 Smalltalk-80
1983 Objective-C
1983 Ada
1986 C++
1986 Eiffel
1987 Perl
1988 Tcl/Tk
1990 Haskell
1991 Python
1993 Ruby
1995 Java
1995 PHP
2000 C#
Un diagrama de los lenguajes ms importantes y sus dependencias:
Tema 1: Lenguajes de programacin
Page 2
Copyright 2006 Depto. CCIA, Universidad de Alicante All rights reserved.
ric Lvnez ha hecho el esfuerzo de construir un rbol genealgico de los lenguajes de
programacin, que indica la fecha en la que cada lenguaje fue creado y la influencia que ha
tenido en los lenguajes posteriores. Consultar el documento PDF
(docs/HistoryProgrammingLanguagesLevenez_a4.pdf) y la web de ric Lvnez
(http://www.levenez.com/lang/) .
Tema 1: Lenguajes de programacin
Page 3
Copyright 2006 Depto. CCIA, Universidad de Alicante All rights reserved.
La Torre de Babel, representa el gran nmero de lenguajes de programacin. Esta imagen se
us en la portada de Programming Languages: History and Fundamentals, de J. E. Sauel,
1969, Prentice Hall.
Al principio, los lenguajes se diseaban nicamente para poder ejecutar los programas
eficientemente. Los ordenadores, carsimos, eran el recurso crtico, y los programadores eran
bastante baratos. Un lenguaje de alto nivel tena que ser competitivo con la ejecucin de un
cdigo en ensamblador. A mediados de los aos 60, cuando se haban diseado FORTRAN,
COBOL, LISP y ALGOL, John Backus (creador de FORTRAN) se dio cuenta que la
programacin estaba cambiando. Las mquinas eran menos caras, el coste de la
programacin estaba aumentando, apareca la necesidad de mover o migrar los programas de
unas estaciones a otras, y surga la necesidad de llevar un buen mantenimiento de los
programas resultantes. El objetivo de un lenguaje de alto nivel se transform no slo en en
ejecutar los programas eficientemente, sino tambin en facilitar el desarrollo de programas
para resolver problemas en determinadas reas de aplicacin.
La tecnologa de los ordenadores madur entre 1960 y 1970 y los lenguajes se centraron en
resolver problemas especficos de un dominio. Los programas cientficos generalmente se
implementaban en FORTRAN, las aplicaciones para los negocios en COBOL, las
aplicaciones militares en JOVIAL, las de inteligencia artificial en LISP y las militares
internas en Ada. Al igual que sucede con los lenguajes naturales, los lenguajes de
programacin a veces dejan de usarse. ALGOL no se utiliza desde los aos 60, se reemplaz
por Pascal, el cual se reemplaz a su vez por C++ y Java. COBOL, que se utilizaba para las
aplicaciones mercantiles, se sustituy tambin por C++.
Tema 1: Lenguajes de programacin
Page 4
Copyright 2006 Depto. CCIA, Universidad de Alicante All rights reserved.
Los primeros lenguajes que todava se usan tienen revisiones peridicas para reflejar
influencias de otras reas de computacin. Lenguajes como Java, C++ y ML reflejan una
gran experiencia obtenida en el diseo y uso de los cientos de lenguajes antiguos. Algunas de
esas influencias son:
Recursos del ordenador: la evolucin de los ordenadores desde los aos 50, junto con los
modernos sistemas operativos, han influenciado las caractersticas de los lenguajes de
alto nivel.
Aplicaciones: el uso de los ordenadores se ha extendido rpidamente desde las
aplicaciones militares, cientficas y de negocios a los juegos, los ordenadores personales,
internet y cualquier aplicacin cotidiana.
Mtodos de programacin: el diseo de los lenguajes tiene que reflejar los buenos
mtodos para implementar programas grandes y complejos.
Estudios tericos: Gracias a la investigacin durante ms de 50 aos en el diseo e
implementacin de lenguajes, se conocen los puntos fuertes y dbiles de las
caractersticas de los mismos, por lo que influye en el diseo de los nuevos lenguajes.
Estandarizacin: cada vez ms existe la necesidad de que los programas sean portables
de unos sistemas a otros.
La siguiente tabla (extraida del libro Programming Languages. Design and Implementation,
de Terrence W. Pratt y Marvin V. Zelkowitz) muestra una pequea lista de los lenguajes y las
influencias que fueron importante a finales del siglo 20.
Tema 1: Lenguajes de programacin
Page 5
Copyright 2006 Depto. CCIA, Universidad de Alicante All rights reserved.
A pesar de la enorme lista de lenguajes de programacin que han ido apareciendo, la mayor
parte de los programadores slo utilizan unos pocos lenguajes. Adems, los programadores a
menudo trabajan en empresas o instalaciones donde se trabaja con un nico lenguaje en
particular, como Java, C o Ada. Entonces, os preguntars por qu es importante el estudio de
diferentes lenguajes o paradigmas cuando al final slo trabajaris con unos pocos. Hay
muchas razones que justifican su estudio, entre las cuales las ms importantes son:
Mejora el uso del lenguaje de programacin: si se conoce cmo estn implementadas las
caractersticas en un lenguaje de programacin, se mejorar la habilidad para escribir
programas eficientes. Por ejemplo, si se conoce cmo crear y manipular listas o cadenas
en un lenguaje, por ejemplo Scheme, utilizando recursin se conseguir construir
programas ms eficientes.
Incrementa el vocabulario de los elementos de programacin.
Permite una mejor eleccin del lenguaje de programacin: El conocimiento de diversos
lenguajes de programacin facilitan la eleccin del lenguaje ms adecuado para un
proyecto determinado.
Tema 1: Lenguajes de programacin
Page 6
Copyright 2006 Depto. CCIA, Universidad de Alicante All rights reserved.
Mejora la habilidad para desarrollar programas efectivos y eficientes: Muchos lenguajes
proporcionan caractersticas que, cuando se utilizan correctamente, aportan muchos
beneficios a la programacin pero, cuando se hace un uso incorrecto, pueden ocasionar
un gran coste computacional. El ejemplo tpico es la recursin, que permite una
implementacin elegante y eficiente de funciones. Pero cuando no se sabe utilizar, puede
ocasionar un aumento exponencial del tiempo de ejecucin.
Facilita el aprendizaje de un nuevo lenguaje de programacin: Cuando se conocen las
estructuras, tcnicas de implementacin y construcciones de un lenguaje, es mucho ms
sencillo aprender un nuevo lenguaje de programacin que tenga estructuras similares.
Facilita el diseo de nuevos lenguajes de programacin: Es posible que en un futuro
tengais que disear vosotros un lenguaje que se adapte a vuestras necesidades. Cuantos
ms lenguajes y paradigmas se conozcan, ms sencillo resultar el diseo y la
implementacin.
La historia de los lenguajes de programacin es dinmica y se encuentra en continua
expansin. El gran nmero de lenguajes de programacin que han aparecido desde los aos
60 hasta la actualidad no son ni mucho menos los nicos que aparecern en un futuro.
A continuacin tenemos una lista extraida de freshmeat donde se puede ver el nmero de
proyectos activos basados en cada lenguaje de programacin en la actualidad.
Ada (67 projects)
APL (3 projects)
ASP (47 projects)
Assembly (272 projects)
Awk (68 projects)
Basic (39 projects)
C (9296 projects)
C# (344 projects)
C++ (5207 projects)
Clipper (1 project)
Cold Fusion (25 projects)
Common Lisp (67 projects)
D (15 projects)
Delphi (80 projects)
Dylan (2 projects)
Eiffel (35 projects)
Emacs-Lisp (66 projects)
Erlang (39 projects)
Euler (1 project)
Euphoria (10 projects)
Forth (29 projects)
Tema 1: Lenguajes de programacin
Page 7
Copyright 2006 Depto. CCIA, Universidad de Alicante All rights reserved.
Fortran (94 projects)
Gambas (11 projects)
Groovy (42 projects)
Haskell (76 projects)
Java (6337 projects)
JavaScript (1260 projects)
Lisp (88 projects)
Logo (6 projects)
Lua (60 projects)
ML (33 projects)
Modula (8 projects)
Object Pascal (35 projects)
Objective C (390 projects)
OCaml (98 projects)
Other (310 projects)
Other Scripting Engines (173 projects)
Pascal (63 projects)
Perl (3816 projects)
PHP (4521 projects)
Pike (13 projects)
PL/SQL (95 projects)
Pliant (1 project)
PROGRESS (4 projects)
Prolog (24 projects)
Python (3323 projects)
REALbasic (14 projects)
Rebol (3 projects)
Rexx (11 projects)
Ruby (512 projects)
Scheme (151 projects)
Simula (1 project)
Smalltalk (24 projects)
SQL (565 projects)
Tcl (523 projects)
Unix Shell (1119 projects)
Visual Basic (49 projects)
XBasic (1 project)
YACC (32 projects)
Zope (48 projects)
En la siguiente web Timeline of Programming Languages
Tema 1: Lenguajes de programacin
Page 8
Copyright 2006 Depto. CCIA, Universidad de Alicante All rights reserved.
(http://encyclopedia.thefreedictionary.com/Programming%20language%20timeline) tenemos
una lista de los lenguajes que han aparecido cronolgicamente desde los aos 50. Es
interesante ver los que han aparecido desde el ao 2000 al 2007 (21 lenguajes).
Cuando los lenguajes de programacin empezaron a aparecer, los creadores normalmente
eran entidades o empresas. Hoy en da es diferente, cualquier informtico puede crear un
lenguaje nuevo en un momento dado que precise ciertas caractersticas en concreto. Por
ejemplo, tenemos el caso de Ruby, un lenguaje de programacin ideado en 1993 por un joven
japons llamado Yukihiro Matsumoto. Quiso crear un lenguaje donde la programacin
funcional y la imperativa estuviese balanceada. Necesitaba adems que fuese un lenguaje de
script ms potente que Perl y ms orientado a objetos que Phyton.
El nombre de Ruby se decidi entre Yukihiro y Keiju Ishitsuka en 1993 en una sesin online
de chat, antes de que se hubiese implementado el cdigo. Se propusieron dos nombres, Ruby
y Coral, y al final decidieron Ruby porque era la piedra del zodiaco de uno de sus colegas.
La primera versin pblica Ruby 0.95 se anunci en un grupo de noticias domsticas en
Japn en diciembre de 1995. A continuacin se lanzaron tres versiones ms y se cre el
grupo de noticias ruby-list. La versin Ruby 1.0 apareci en diciembre de 1996, la versin
1.3 en 1999 y la 1.8.7 en junio de 2008. La ltima versin que se ha lanzado Ruby 1.9.1 ha
sido el 25 de Enero de 2009.
Ruby es un lenguaje orientado a objetos pero multiparadigma: esto quiere decir que en ruby
cada tipo de dato es un objeto y cada funcin es un mtodo, pero permite programacin
imperativa y funcional (multiparadigma).
Un ejemplo de programacin en Ruby:
puts "Hello World!"
Otro ejemplo:
Tema 1: Lenguajes de programacin
Page 9
Copyright 2006 Depto. CCIA, Universidad de Alicante All rights reserved.
puts "What's your favorite number?"
number = gets.chomp
output_number = number.to_i + 1
puts output_number.to_s + ' is a bigger and better favorite number.'
2. Elementos de los lenguajes de programacin
Hemos visto el gran nmero de lenguajes de programacin que se han desarrollado en la
historia de la informtica. A pesar de la gran variedad de lenguajes desarrollados, hay unos
elementos comunes a todos ellos. Cules son? Qu hace que algo pueda ser considerado un
lenguaje de programacin?
2.1. No son lenguajes de programacin
Existen elementos muy usados por los informticos que tienen algunas de las caractersticas
de los lenguajes de programacin, pero que no lo son. Veamos algn ejemplo.
Los lenguajes XML, uno de los estndares ms usados por las aplicaciones informticas para
compartir datos, son lenguajes escritos con una sintaxis perfectamente definida. Por ejemplo,
el siguiente texto en un lenguaje XML para definir una lista de persones:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE people_list SYSTEM "example.dtd">
<people_list>
<person>
<name>Fred Bloggs</name>
<birthdate>27/11/2008</birthdate>
<gender>Male</gender>
</person>
<person>
<name>Mary Baggins</name>
<birthdate>12/07/1942</birthdate>
<gender>Female</gender>
</person>
</people_list>
Sin embargo le falta una caracterstica fundamental para poder ser considerado un lenguaje
de programacin: no define un comportamiento, no tiene una semntica asociada. El trozo de
cdigo anterior no puede ser ejecutado tal cual en un computador, sino que nicamente
define un conjunto de datos.
Un entorno de programacin visual para definir comportamientos y animaciones es otro
ejemplo de algo que no es estrictamente un lenguaje de programacin. Por ejemplo Scratch
(http://scratch.mit.edu/) es un lenguaje visual desarrollado por el MIT para promover el
inters por la programacin entre los jvenes.
Tema 1: Lenguajes de programacin
Page 10
Copyright 2006 Depto. CCIA, Universidad de Alicante All rights reserved.
El ejemplo anterior define una animacin de un sprite en la pantalla. Otro entornos o
herramienta similar es el Adobe Director, que permite disear animaciones multimedia. Los
podemos considerar lenguajes de programacin? Si lo consideramos de una forma estricta,
no. No son lenguajes textuales, los programas no se pueden escribir en un fichero de texto.
Tampoco tienen elementos fundamentales de los lenguajes de programacin como son las
funciones y los tipos de datos. Aunque, por otro lado, si consideramos de una forma ms
amplia el concepto de funcin, s que existen elementos en esos lenguajes que posibilitan la
creacin de abstracciones reutilizables en distintos programas.
Podramos decir que son herramientas de programacin de animaciones que utilizan ciertas
caractersticas de los lenguajes de programacin.
2.2. Caractersticas de los lenguajes de programacin
Cules son estas caractersticas?
Segn la definicin de la Encyclopedia of Computer Science (Encyclopedia of Computer
Science, 4th Edition, Anthony Ralston (Editor), Edwin D. Reilly (Editor), David
Hemmendinger (Editor), Wiley, 2000. Disponible en la biblioteca politcnica con
identificador: POE R0/E/I/ENC/RAL):
"A programming language is a set of characters, rules for combining them, and rules
specifying their effects when executed by a computer, which have the following four
characteristics:
1. It requires no knowledge of machine code on the part of the user
2. It has machine independence
Tema 1: Lenguajes de programacin
Page 11
Copyright 2006 Depto. CCIA, Universidad de Alicante All rights reserved.
3. Is translated into machine language
4. Employs a notation that is closer to that of the specific problem being solved than is
machine code"
Segn Abelson y Sussman, en el libro que vamos a seguir en nuestra asignatura (SICP, p. 1):
"We are about to study the idea of a computational process. Computational processes are
abstract beings that inhabit computers. As they evolve, processes manipulate other abstract
things called data. The evolution of a process is directed by a pattern of rules called a
program. [...] The programs we use to conjure processes are like a sorcerer's spells. They
are carefully composed from symbolic expressions in arcane and esoteric programming
languages that prescribe the tasks we want our processes to perform."
Y despus, en la pgina 4, aaden otra idea fundamental:
"A powerful programming language is more than just a means for instructing a computer to
perform tasks. The language also serves as a framework within which we organize our ideas
about processes. Thus, when we describe a language, we should pay particular attention to
the means that the language provides for combining simple ideas to form more complex
ideas."
As, entre las caractersticas de un lenguaje de programacin podemos remarcar las
siguientes:
Define un proceso que se ejecuta en un computador
Es de alto nivel, cercano a los problemas que se quieren resolver (abstraccin)
Permite construir nuevas abstracciones que se adapten al dominio que se programa
Para Abelson y Sussman, todos los lenguajes de progamacin permiten combinar ideas
simples en ideas ms complejas mediante los siguientes tres mecanismos:
expresiones primitivas, que representan las entidades ms simples del lenguaje
mecanismos de combinacin con los que se construyen elementos compuestos a partir
de elementos ms simples
mecanismos de abstraccin con los que dar nombre a los elementos compuestos y
manipularlos como unidades
Cuando se habla de elementos en el prrafo anterior nos estamos refiriendo tanto a datos
como a programas.
Una breve lista de caractersticas comunes a todos los lenguajes de programacin:
Tienen una sintaxis: un conjunto de reglas que definen qu expresiones de texto son
correctas. Por ejemplo, en C todas las sentencias deben terminar en ';'.
Los lenguajes de programacin se ejecutan en un computador y tienen una determinada
semntica que define cul ser el resultado de la ejecucin de un programa.
Tema 1: Lenguajes de programacin
Page 12
Copyright 2006 Depto. CCIA, Universidad de Alicante All rights reserved.
Definen un conjunto de tipos de datos primitivos que representan los posibles valores que
pueden devolver las expresiones del lenguaje.
Tienen mecanismos de abstraccin para definir nuevos tipos de datos a partir de los
primitivos o nuevas funciones y procedimientos.
2.3. Abstraccin
El concepto de abstraccin es fundamental en informtica. Para modelar un dominio
(sistema de informacin de una universidad, sistema de sensores de una planta qumica, etc.)
es necesario definir distintas abstracciones que nos permitan tratar sus elementos.
Una abstraccin agrupa un conjunto de elementos (datos y procedimientos) y le da un
nombre. Por ejemplo, cuando hablamos del sistema de informacin de una universidad
identificamos elementos como:
Estudiantes
Asignaturas
Matrcula
Expediente acadmico
...
Existen abstracciones propias de la computacin, que se utilizan en mltiples dominios. Por
ejemplo, abstracciones de datos como:
Listas
rboles
Grafos
Tablas hash
Tambin existen abstracciones que nos permiten tratar con dispositivos y ordenadores
externos:
Fichero
Raster grfico
Protocolo TCP/IP
Uno de los trabajos principales de un informtico es la construccin de abstracciones que
permitan ahorrar tiempo y esfuerzo a la hora de tratar con la complejidad del mundo real.
Tal y como dice Joel Spolsky en su blog Joel on Software (http://www.joelonsoftware.com/)
:
"TCP is what computer scientists like to call an abstraction: a simplification of something
much more complicated that is going on under the covers. As it turns out, a lot of computer
Tema 1: Lenguajes de programacin
Page 13
Copyright 2006 Depto. CCIA, Universidad de Alicante All rights reserved.
programming consists of building abstractions. What is a string library? It's a way to
pretend that computers can manipulate strings just as easily as they can manipulate
numbers. What is a file system? It's a way to pretend that a hard drive isn't really a bunch of
spinning magnetic platters 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."
Una misin fundamental de los lenguajes de programacin es proporcionar herramientas que
sirvan para construir estas abstracciones.
3. Paradigmas de programacin
Existe una enorme variedad de lenguajes de programacin, no slo en cuanto a su sintaxis,
sino tambin en cuanto a su comportamiento o semntica.
Hemos visto que cada ao el nmero de lenguajes se incrementa, de forma que para los
informticos es prcticamente imposible conocer cada nuevo lenguaje que aparece. Pero eso
no es un problema, ya que todos esos lenguajes tienen caractersticas comunes y se pueden
agrupar en cuatro grandes grupos o modelos computacionales llamados paradigmas.
Imagen del libro Programming Languages. Design and Implementation, de Terrence W.
Pratt y Marvin V. Zelkowitz.
Todos los lenguajes pertenecen a uno de esos cuatro paradigmas. De forma que, si se
conocen las caractersticas de los paradigmas de programacin, es muy sencillo aprender a
programar en un nuevo lenguaje, porque tendr las caractersticas del paradigma de
Tema 1: Lenguajes de programacin
Page 14
Copyright 2006 Depto. CCIA, Universidad de Alicante All rights reserved.
programacin al que pertenezca.
El origen de la palabra paradigma entendida como un marco general en el que se desarrollan
teoras cientficas se encuentra en el trabajo de 1962 del filsofo e historiador de la ciencia
Thomas S. Kuhn, La estructura de las revoluciones cientficas. Esa palabra ha sido despus
adoptada por el mundo de la computacin para definir un conjunto de ideas y principios
comunes de grandes grupos de lenguajes de programacin.
La definicin de la palabra paradigma ms cercana a lo que se quiere decir en la expresin
paradigma de programacin es la siguiente:
"Un marco filosfico y terico de una escuela o disciplina cientfica en el que se formulan
teoras, leyes y generalizaciones y los experimentos realizados en soporte de ellas."
Un paradigma define un conjunto de reglas, patrones y estilos de programacin que son
usados por los lenguajes de programacin que usan ese paradigma.
Podemos distinguir cuatro grandes paradigmas de programacin:
Paradigma funcional
Paradigma lgico
Paradigma imperativo o procedural
Paradigma orientado a objetos
Algunas caractersticas importantes de cada uno de estos paradigmas.
3.1. Paradigma funcional
En el paradigma funcional la computacin se realiza mediante la evaluacin de expresiones.
Definicin de funciones
Funciones como datos primitivos
Valores sin efectos laterales, no existe la asignacin
Programacin declarativa
(define (factorial x)
(if (= x 0)
1
(* x (factorial (- x 1)))))
>(factorial 8)
40320
>(factorial 30)
265252859812191058636308480000000
3.2. Paradigma lgico
Tema 1: Lenguajes de programacin
Page 15
Copyright 2006 Depto. CCIA, Universidad de Alicante All rights reserved.
Definicin de reglas
Unificacin como elemento de computacin
Programacin declarativa
padrede('juan', 'maria'). % juan es padre de maria
padrede('pablo', 'juan'). % pablo es padre de juan
padrede('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
3.3. Paradigma imperativo
Los lenguajes de programacin que complen el paradigma imperativo se caracterizan por
tener un estado implcito que es modificado mediante instrucciones o comandos del lenguaje.
Como resultado, estos lenguajes tienen una nocin de secuenciacin de los comandos para
permitir un control preciso y determinista del estado.
Definicin de procedimientos
Definicin de tipos de datos
Chequeo de tipos en tiempo de compilacin
Cambio de estado de variables
Pasos de ejecucin de un proceso
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
Tema 1: Lenguajes de programacin
Page 16
Copyright 2006 Depto. CCIA, Universidad de Alicante All rights reserved.
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;
3.4. Paradigma orientado a objetos
Definicin de clases y herencia
Objetos como abstraccin de datos y procedimientos
Polimorfismo y chequeo de tipos en tiempo de ejecucin
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);
Tema 1: Lenguajes de programacin
Page 17
Copyright 2006 Depto. CCIA, Universidad de Alicante All rights reserved.
}
}
Una reflexin importante es que la separacin entre los paradigmas y los lenguajes no es
estricta. Existen ideas comunes a distintos paradigmas, as como lenguajes de programacin
que soportan ms de un paradigma. Por ejemplo, el paradigma funcional y lgico comparten
caractersticas declarativas, mientras que el paradigma orientado a objetos y procedural
tienen caractersticas imperativas.
Otros paradigmas de programacin menos comunes:
Paradigmas de programacin paralela y concurrente
Paradigmas basados en restricciones
Paradigmas visuales
Se puede encontrar ms informacin sobre distintos paradigmas de programacin en la
Wikipedia (http://en.wikipedia.org/wiki/Programming_paradigm) .
4. Scheme Como lenguaje de programacin
4.1. Algunos ejemplos de Scheme
Scheme es un lenguaje interpretado. Podemos lanzar un intrprete de Scheme y teclear en el
prompt algunas expresiones. El intrprete analizar la expresin y mostrar el valor
resultante de evaluarla.
2
(+ 2 3)
(+)
(+ 2 4 5 6)
(+ (* 2 3) (- 3 1))
Las expresiones en Scheme tienen una forma denominada notacin prefija de Cambridge
(Cambridge prefix notation) (el nombre de Cambridge es por la localidad Cambridge,
Massachusets, donde reside el MIT, lugar en el que se ide el Lisp), en la que la expresin
est delimitada por parntesis y el operando va seguido de los operadores.
La sintaxis es la siguiente:
(<funcin> <arg1> ... <argn>)
En Scheme podemos interpretar los parntesis abiertos '(' como evaluadores o lanzadores de
la funcin que hay a continuacin.
La forma de evaluar una expresin en Scheme es muy sencilla:
1. Evaluar cada uno de los argumentos
Tema 1: Lenguajes de programacin
Page 18
Copyright 2006 Depto. CCIA, Universidad de Alicante All rights reserved.
2. Aplicar la funcin nombrada tras el parntesis a los valores resultantes de la evaluacin
anterior
(+ (* 2 3) (- 3 (/ 12 3)))
(+ 6 (- 3 (/ 12 3)))
(+ 6 (- 3 4))
(+ 6 -1)
5
Atencin, preguntas
- En qu orden se evalan los argumentos?
- Influye ese orden en el resultado de la evaluacin?
En Scheme los trminos funcin y procedimiento significan lo mismo y se usan de forma
intercambiable. Son ejemplos de funciones o procedimientos: +, -, *.
En Scheme la evaluacin de una funcin siempre devuelve un valor, a no ser que se produzca
un error que detiene la evaluacin:
(* (+ 3 4) (/ 3 0))
Podemos utilizar la forma especial define para darle un nombre (identificador, smbolo) a
un valor. Una vez definido, podemos usar el nombre en lugar del valor. Ya veremos ms
adelante que esto es equivalente a decir que el smbolo se evala al valor.
> (define pi 3.14159)
> pi
3.14159
> (sin (/ pi 2))
0.9999999999991198
> (define a (+ 2 (* 3 4)))
> a
14
4.2. Por qu Scheme?
Scheme es un dialecto de Lisp.
Scheme es un lenguaje actual. Existen mltiples proyectos y bibliotecas que se estn
implementando en la actualidad en Scheme. Algunos ejemplos:
Coleccin de programas en Scheme
(http://www.rodoval.com/paginalen.php?len=Scheme)
Scheme Gimp (http://gimp.org.es/tutoriales/schemebasic/) , Scheme est dentro de Gimp
para extender la herramienta de tratamiento de imgenes
Recetas en Scheme (http://schemecookbook.org/Cookbook/WebHome)
PLaneT (http://planet.plt-scheme.org/) , un repositorio de paquetes escritos en Scheme.
Tema 1: Lenguajes de programacin
Page 19
Copyright 2006 Depto. CCIA, Universidad de Alicante All rights reserved.
Scheme es un lenguaje ideal para LPP porque:
Tiene una sintaxis muy sencilla
Es un lenguaje de script
Tiene mltiples extensiones: programacin orientada a objetos, etc.
Es posible de extender mediante macros
Existen a su vez mltiples intrpretes de Scheme, nosotros vamos a usar uno de las ms
extendidos: MzScheme en el entorno de programacin DrScheme
(http://www.plt-scheme.org/software/drscheme/) (desarrollados por el grupo PLT Scheme
(http://www.plt-scheme.org/) ). Para una breve introduccin al lenguaje y al entorno de
programacin consultar el manual A brief tour of DrScheme
(http://www.plt-scheme.org/software/drscheme/tour/) escrito por el mismo grupo.
4.3. Algunas primitivas
Recordemos del apartado anterior que un lenguaje de programacin define unos:
procedimientos primitivos
mecanismos de composicin
mecanismos de abstraccin
Vamos a revisar Scheme desde esta perspectiva.
Las primitivas de Scheme consisten en un conjunto de tipos de datos, formas especiales y
funciones incluidas en el lenguaje. A lo largo del curso iremos introduciendo estas
primitivas. Es un lenguaje no demasiado complejo (a diferencia de otros como C++ o Java).
Est descrito completamente en un documento de especificacin de 50 pginas llamado
Revised 5 Report on the Algorithmic Language Scheme (se puede consultar en este enlace
(http://www.schemers.org/Documents/Standards/R5RS/) ). Las primitivas del lenguaje estn
descritas en las 21 pginas del apartado 6 (Standard procedures). En la actualidad este
documento se encuentra en revisin y en breve se aprobar el estndar 6
(http://www.r6rs.org/) .
Vamos a revisar los tipos de datos primitivos de Scheme, as como algunos procedimientos
primitivos para trabajar con valores de esos tipos.
Booleanos
Nmeros
Caracteres
Cadenas
Smbolos
Parejas y listas (*)
Tema 1: Lenguajes de programacin
Page 20
Copyright 2006 Depto. CCIA, Universidad de Alicante All rights reserved.
Vectores (*)
Procedimientos
(*) Los veremos en detalle en futuras clases, cuando hablemos de tipos de datos compuestos.
En la clase de hoy slo veremos unas algunas funciones elementales para crea, recorrer y
aadir listas.
Booleanos
#t ; verdadero
#f ; falso
(> 3 1.5)
(= 3 3.0)
(equal? 3 3.0)
(or (< 3 1.5) #t)
(and #t #t #f)
(not #f)
(not 3)
Atencin, aviso
- Ntese en los ejemplos la diferencia entre (= 3 3.0) y (equal? 3 3.0).
Nmeros
La cantidad de tipos numricos que soporta Scheme es grande. Slo vamos a ver una
pequea parte.
number
complex
real
rational
integer
Algunos procedimientos primitivos
(<= 2 3 3 4 5)
(max 3 5 10 1000)
(/ 22 4)
(quotient 22 4)
(remainder 22 4)
(equal? 0.5 (/ 1 2))
(= 0.5 (/ 1 2))
(abs (* 3 -2))
(floor 3.4) ; relacionados: ceiling, truncate, round
(sin 2.2) ; relacionados: cos, tan, asin, acos, atan
Caracteres
#\a
#\A
#\space
#\ ; se soportan caracteres internacionales
Tema 1: Lenguajes de programacin
Page 21
Copyright 2006 Depto. CCIA, Universidad de Alicante All rights reserved.
#\ ; se codifican en UTF-8
(char<? #\a #\b)
(char-numeric? \#1) ; relacionados: char-alphabetic?
; char-whitespace?, char-upper-case?
; char-lower-case?
(char-upcase #\)
(char->integer #\space)
Cadenas
Las cadenas son secuencias finitas de caracteres.
"hola"
"La palabra \"hola\" tiene 4 letras"
(make-string 10 #\o)
(substring "Hola que tal" 2 4)
(string? "hola")
(string->list "hola")
Smbolos
Un smbolo es lo que en otros lenguajes se denomina identificador. En Scheme los smbolos
e identificadores pueden contener caracteres internacionales (Unicode, UTF-8). El intrprete
DrScheme guarda los ficheros de texto en esa codificacin.
'hola
(symbol 'hola-que<>)
(symbol->string 'hola-que<>)
'maana
'lpiz ; aunque sea posible, no vamos a usar acentos en los smbolos
; pero s en los comentarios
(symbol? 'hola) ; #t
(symbol? "hola") ; #f
(equal? 'hola 'hola)
(equal? 'hola "hola")
Diferencia entre smbolos y cadenas: un smbolo (identificador) es un objeto simple y una
cadena es un objeto compuesto. El intrprete de Scheme codifica un smbolo mediante un
nico nmero, su valor hash. Otra diferencia bastante clara: un smbolo no puede contener un
espacio, pero una cadena s.
Listas
Uno de los elementos fundamentales de Scheme, y de Lisp, son las listas. Vamos a ver cmo
definir, crear, recorrer y concatenar listas.
(list 1 2 3 4) ; list crea una lista
'(1 2 3 4) ; otra forma de definir la misma lista
(car '(1 2 3 4)) ; primer elemento de la lista
(cdr '(1 2 3 4)) ; resto de la lista
'() ; lista vaca
(cdr '(1)) ; devuelve la lista vaca
(null? (cdr '(1))) ; comprueba si una lista es vaca
(append '(1) '(2 3 4) '(5 6)) ; construye una lista nueva concatenando
Tema 1: Lenguajes de programacin
Page 22
Copyright 2006 Depto. CCIA, Universidad de Alicante All rights reserved.
; los argumentos
Atencin, aviso
Uno de los conceptos ms importantes relacionados con las listas es el de lista vaca. La
comprobacin de si una lista es vaca con la funcin null? es el caso base de gran parte de
funciones recursivas que recorren listas.
Procedimientos
Una caracterstica fundamental de Scheme es que los procedimientos son tipos primitivos.
Ms adelante veremos esto en detalle.
+
-
remainder
4.4. Extensiones de Scheme
Es posible definir nuevos procedimientos en Scheme (lo explicamos en el siguiente
apartado). Vamos a usar tambin un conjunto de procedimientos definidos en el fichero
simply.scm (programas/simply.scm.zip) . Son procedimientos definidos en el libro 'Simply
Scheme: Introducing Computer Science' de Brian Harvey and Matthew Wright.
Los procedimientos que vamos a usar ms a menudo son procedimientos para tratar con
smbolos y cadenas (composicin, primer carcter, etc.): first, butfirst (bf), last,
butlast (bl), word, empty? y member?. Adems define la funcin 1+ que incrementa en 1 su
argumento.
(load "/home/domingo/simply.scm") ; en Windows: (load "C:\simply.scm")
(first 'hola)
(butfirst 'hola)
(bf 'hola)
(last 'hola)
(butlast 'hola)
(word 'hola 'mundo)
(word 12 34)
(+ (first 23) 5)
(empty? "hola")
(empty? (bf "h"))
(empty? (bf 'h))
(member? 'f 'abcdefg)
true
false
(1+ 4)
4.5. Abstraccin: define
Las capacidades de abstraccin de un lenguaje de programacin hacen posible definir nuevos
Tema 1: Lenguajes de programacin
Page 23
Copyright 2006 Depto. CCIA, Universidad de Alicante All rights reserved.
elementos y darles un nombre. En otros lenguajes de programacin (Java, C++, etc.) es
posible definir nuevos tipos de datos (clases), definir procedimientos y funciones de esos
tipos de datos, definir constantes, etc.
En Scheme slo tenemos una instruccin para definir nuevos elementos: define (ms
adelante veremos que esto no es completamente cierto, ya que podemos definir macros con
la instruccin define-syntax).
Hemos visto que podemos usar define para darle un nombre (identificador, smbolo) a un
valor.
> (define pi 3.14159)
> pi
3.14159
> (sin (/ pi 2))
0.9999999999991198
> (define a (+ 2 (* 3 4)))
> a
14
La sintaxis de define es:
(define <smbolo> <expresin>)
La forma especial (define smbolo expresin) se evala as:
1. Evaluar expresin
2. Asociar el valor resultante de la evaluacin anterior con el smbolo
El otro uso de define es para definir nuevos procedimientos (aunque ya veremos ms
adelante que Scheme utiliza siempre el define anterior, y que esta forma del define no es ms
que azucar sintctico).
La sintaxis para definir un procedimiento es:
(define (<nombre-funcion> <args>) <cuerpo>)
Se define una funcin con el nombre, argumentos y cuerpo dados. El cuerpo es una expresin
de Scheme. El resultado de evaluar la ltima expresin del cuerpo es el valor devuelto por al
funcin.
Ejemplos:
> (define (cuadrado x)
(* x x))
> (cuadrado 2)
4
> (cuadrado 3 4 5) ; error
(define (plural pal)
(word pal 's))
> (plural 'perro)
Tema 1: Lenguajes de programacin
Page 24
Copyright 2006 Depto. CCIA, Universidad de Alicante All rights reserved.
perros
> (plural 'arbol)
arbols
Algunos ejemplos curiosos (en Scheme los smbolos no estn protegidos):
(define suma +)
(suma 1)
(suma 1 2 3)
(define + -)
(+ 2 3)
(suma 2 3)
(define + suma)
Estos ejemplos explican un poco ms la idea de que en Scheme los procedimientos son
valores primitivos. Al hacer (define + -) estamos asociando el identificador '+' al
procedimiento 'resta' que resulta de evaluar el identificador '-'.
4.6. Estructuras de control
El otro elemento comm a todos los lenguajes de programacin (aparte de la abstraccin y de
las primitivas) es la posibilidad de componer expresiones sencillas en expresiones
compuestas.
Hemos visto que una de las caractersticas de Scheme es la composicin de funciones.
Scheme tambin define estructuras de control que nos permiten seleccionar qu parte de una
expresin evaluamos en funcin del resultado de la evaluacin de otras.
Las estructuras ms importantes de Scheme son el if y el cond para realizar una evaluacin
condicional.
El nombre que reciben en Scheme todas las expresiones que no son procedimientos y que
tienen una evaluacin especial es forma especial. Ejemplos de formas especiales son:
define, if, cond.
Atencin, aviso
- La expresin (+ (* 2 3) 4) se evala de una forma distinta de (define a 3). En el primer
caso estamos evaluando llamadas a funciones, y en el segundo evaluamos una forma especial.
4.6.1. Forma especial 'if'
La forma especial if realiza una evaluacin condicional de las expresiones que la siguen,
segn el resultado de una condicin.
(define x 3)
Tema 1: Lenguajes de programacin
Page 25
Copyright 2006 Depto. CCIA, Universidad de Alicante All rights reserved.
(if (> x 5)
'mayor-que-cinco
'menor-o-igual-que-cinco)
(define (vocal? x)
(member? x 'aeiou))
(define (plural pal)
(if (vocal? (last pal))
(word pal 's)
(word pal 'es)))
Para que un programa Scheme sea legible es muy importante la indentacin (tabulacin)
correcta de sus expresiones.
La sintaxis de if es:
(if <condicin> <exp-verdad> <exp-falso>)
El funcionamiento de la forma especial es:
1. Evaluar condicin
2. Si el resultado es true evaluar exp-verdad
3. Sino evaluar exp-falso
(if (> 3 2) (* 2 3) (/ 2 0))
En la expresin anterior la condicin es verdadera, por lo que no se evala la expresin (/ 2
0) que dara un error. Se evala slo (* 2 3) y se devuelve su resultado.
4.6.2. Forma especial 'cond'
La forma especial cond evala una serie de condiciones y devuelve el valor de la expresin
asociada a la primera condicin verdadera.
(cond
((> 3 4) '3-es-mayor-que-4)
((< 2 1) '2-es-menor-que-1)
((= 3 1) '3-es-igual-que-1)
((= 2 2) '2-es-igual-que-2)
((> 3 2) '3-es-mayor-que-2)
(else 'ninguna-condicion-es-cierta))
; juego del ding: 1,2,ding,4,5,ding,7,8,ding,10,11,ding,ding,14,ding,...
(define (ding x)
(cond
((= (remainder x 3) 0) 'ding)
((member? 3 x) 'ding)
(else x)))
La sintaxis de cond es la siguiente:
(cond
Tema 1: Lenguajes de programacin
Page 26
Copyright 2006 Depto. CCIA, Universidad de Alicante All rights reserved.
(<exp-cond-1> <exp-consec-1>)
(<exp-cond-2> <exp-consec-2>)
...
(else <exp-consec-else>))
La semntica es la siguiente:
1. Se evalan de forma ordenada todas las expresiones hasta que una de ellas devuelva #t
2. Si alguna expresin devuelve #t, se devuelve el valor del consecuente de esa expresin
3. Si ninguna expresin es cierta, se devuelve el valor resultante de evaluar el consecuente
del 'else'
Se hace notar
- En cualquier caso, slo se evala un nico consecuente del cond.
4.6.3. Y los bucles?
En programacin funcional pura no existe el concepto de bucle tan extendido en los
lenguajes de programacin imperativos. Ya veremos que no es necesario si tenemos la
recursin. Cualquier funcin en donde se necesite repetir una sentencia un nmero de veces
(o hasta que se cumpla una determinada condicin) se puede expresar de forma recursiva.
Aunque en Scheme existe la forma especial (do ...) que permite implementar un bucle
nosotros no vamos a usarla. El uso de esta forma especial nos aparta del paradigma
funcional, ya que su semntica no puede definirse con el modelo de sustitucin que veremos
en las prximas clases.
Por ejemplo, las siguientes funciones son equivalentes. En C, usando un bucle while
suma-hasta (k) {
suma=0;j=0;
while (j<=k) {
suma = suma+j;
j++;
}
}
En Scheme, usando la recursin:
(define (suma-hasta k)
(if (= k 0)
0
(+ k (suma-hasta (- k 1)))))
5. Referencias
Para saber ms de los temas que hemos tratado en esta clase puedes consultar las siguientes
Tema 1: Lenguajes de programacin
Page 27
Copyright 2006 Depto. CCIA, Universidad de Alicante All rights reserved.
referencias:
Encyclopedia of Computer Science (Wiley, 2000). Disponible en la biblioteca politcnica
(POE R0/E/I/ENC/RAL). Consultar las entradas:
Control structures
Lisp
Programming
Program
Programming languages
#?rbol genealgico de los lenguajes de programacin (http://www.levenez.com./lang)
Abstraction (http://en.wikipedia.org/wiki/Abstraction_%28computer_science%29)
(Wikipedia)
Structure and Interpretation of Computer Programs
(http://mitpress.mit.edu/sicp/full-text/book/book.html) , Abelson y Sussman, MIT Press
1996 (pp.1-13). Disponible biblioteca politcnica (acceso al catlogo
(http://gaudi.ua.es/uhtbin/boletin/285815) )
DrScheme (http://www.plt-scheme.org/software/drscheme/)
A brief tour of DrScheme (http://www.plt-scheme.org/software/drscheme/tour/)
Tema 1: Lenguajes de programacin
Page 28
Copyright 2006 Depto. CCIA, Universidad de Alicante All rights reserved.