Académique Documents
Professionnel Documents
Culture Documents
in y modelos
de
omputa
in
(draft)
2008
Resumen
Este libro es el resultado del di
tado del
urso Anlisis Comparativo de Lenguajes
para alumnos de pregrado en la Universidad Na
ional de Ro Cuarto.
Si bien existe una vasta bibliografa en el tema, es dif
il en
ontrar un ni
o libro
que
ubriese todos los temas y
on el enfoque que bus
ado en la asignatura.
Los prin
ipales objetivos de este trabajo es re
opilar
ontenidos de varias fuentes
bibliogr
as y
ompilarlas desde un enfoque de las
ara
tersti
as de los lenguajes de
programa
in a partir de un punto de vista de modelos de
omputa
i+on y paradigmas
(o estilos) de programa
in, desarrollando los
on
eptos relevantes de los lenguajes de
programa
in.
En
ada
aptulo se desarrollan los
on
eptos a partir de un lenguaje de programa
in bsi
o para luego
ompararlo
on las
onstru
iones similares en
ontradas en
algunos lenguajes de programa
in sele
ionados.
Los lenguajes de programa
in se han sele
ionado por su difusin en la industria
y por su importan
ia desde el punto de vista a
admi
o, los
uales se analizan en base
a los
on
eptos bsi
os estudiados.
Se ha elegido el enfoque de lenguaje n
leo , para el
ual se dene su sintaxis y
semnti
a (en base a su mquina abstra
ta
orrespondiente). Luego se irn agregando
adornos sint
ti
os y otras
onstru
iones bsi
as para ir obteniendo las
ara
tersti
as
a analizar. La semnti
a formal permite realizar anlisis de
orre
titud y su
omplejidad
omputa
ional.
Este material est dirigido a alumnos de segundo o ter
er ao de
arreras de
ien
ias de la
omputa
in o ingeniera de software. Sus
ontenidos permiten desarrollar
un
urso en
uatro meses de dura
in
on pr
ti
as de aula y talleres del tipo de los
ejer
i
ios propuestos en
ada
aptulo.
Los paradigmas estudiados impli
an el modelo
a objetos, lgi o y
el
on urrente.
modelos por lo que se ha
e un anlisis y
onsidera
iones en
ada
ontexto en parti
ular.
El lenguaje kernel sele
ionado es
ndi
e general
1. Introdu
in
1.1.
. . . . . . . . . . . . . .
1.2.
Abstra iones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.1.
. . . . . . . . . . . . . . . . . . . . . . .
1.2.2.
Abstra in de datos . . . . . . . . . . . . . . . . . . . . . . . . .
1.3.
10
1.4.
11
1.4.1.
1.4.2.
Sintaxis
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
1.4.1.1.
Lenguajes regulares
. . . . . . . . . . . . . . . . . . . .
13
1.4.1.2.
14
Semnti a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.5.
1.6.
Ejer i ios
1.5.1.
. . . . . . . . . . . . .
2. El modelo de
larativo
2.1.
Un lenguaje de
larativo
2.1.1.
2.2.
2.3.
15
16
18
19
23
. . . . . . . . . . . . . . . . . . . . . . . . . . .
Memoria de asigna in ni a
. . . . . . . . . . . . . . . . . . . .
24
24
2.1.2.
Crea in de valores . . . . . . . . . . . . . . . . . . . . . . . . . .
25
2.1.3.
Un programa de ejemplo . . . . . . . . . . . . . . . . . . . . . . .
26
2.1.4.
. . . . . . . . . . . . . . . . . . . . .
26
2.1.5.
27
. . . . . . . . . . . . . . . . . .
27
2.2.1.
28
2.2.2.
. . . . . . . . . . . . . . . .
30
2.2.3.
30
2.2.4.
32
. . . . . . . . . . . . . . . . . .
Semnti a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
32
2.3.1.
La mquina abstra ta
. . . . . . . . . . . . . . . . . . . . . . . .
33
2.3.2.
Eje u in de un programa . . . . . . . . . . . . . . . . . . . . . .
34
2.3.3.
. . . . . . . . . . . . . . . . . . . .
34
2.3.4.
35
2.3.5.
Al an e (s ope) . . . . . . . . . . . . . . . . . . . . . . . . . . . .
36
2.3.6.
38
2.3.7.
Manejo de la memoria . . . . . . . . . . . . . . . . . . . . . . . .
39
2.3.8.
39
2.3.9.
El algoritmo de uni a in
40
Ejer i ios
==)
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . .
42
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
42
45
3.1.
. . . . . . . . . . . . . . . . . . . . . . . . . . .
45
3.2.
46
3.3.
47
3.4.
Fundamentos teri
os
3.4.1.
3.4.2.
3.5.
3.6.
48
Cl ulo lambda . . . . . . . . . . . . . . . . . . . . . . . . . . . .
49
3.4.1.1.
Redu in
. . . . . . . . . . . . . . . . . . . . . . . . .
50
3.4.1.2.
50
3.4.1.3.
Estrategias de redu in
. . . . . . . . . . . . . . . . .
52
Lgi a ombinatoria . . . . . . . . . . . . . . . . . . . . . . . . .
53
LISP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
55
3.5.1.
Sintaxis
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
55
3.5.2.
Semnti a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
56
3.5.3.
Estado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
56
3.5.4.
Apli a iones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
57
57
3.6.1.
3.6.2.
3.7.
. . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
ML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
57
3.6.1.1.
58
3.6.1.2.
60
3.6.1.3.
60
Haskell
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
61
3.6.2.1.
Tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . .
62
3.6.2.2.
Casos y patrones . . . . . . . . . . . . . . . . . . . . . .
63
3.6.2.3.
64
3.6.2.4.
Ambientes
. . . . . . . . . . . . . . . . . . . . . . . . .
64
3.6.2.5.
65
3.6.2.6.
Emula in de estado . . . . . . . . . . . . . . . . . . . .
66
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
72
Ejer i ios
Semnti a de eldas
4.2.
Aliasing
4.3.
4.4.
74
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
76
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
77
Igualdad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
78
. . . . . . . . . . . . . . . . . . . .
78
4.4.1.
Razonando on estado . . . . . . . . . . . . . . . . . . . . . . . .
79
4.4.2.
79
4.5.
80
4.6.
Ejer i ios
81
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
82
5.1.
De lara iones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
82
5.2.
Expresiones y omandos . . . . . . . . . . . . . . . . . . . . . . . . . . .
83
5.3.
Ex ep iones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
85
5.4.
Introdu in al lenguaje C . . . . . . . . . . . . . . . . . . . . . . . . . .
85
5.5.
86
5.6.
El ompilador C
88
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.7.
Compila in de un programa
. . . . . . . . . . . . . . . . . . . . . . . .
88
5.8.
El pre-pro esador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
89
5.9.
90
91
91
91
91
92
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
93
. . . . . . . . . . . . . . . . . . . . . .
94
95
5.17. Operadores
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.17.1. Asigna in
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . .
95
96
97
97
97
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
98
98
99
. . . . . . . . . . . . . . . . . . . . .
99
. . . . . . . . . . . . . . . . . . . . 100
. . . . . . . . . . . . . . . . . . . . . . . . 100
. . . . . . . . . . . . . . . . . . . . . . . . . 104
6. Manejo de la memoria
111
6.1.
6.2.
6.3.
. . . . . . . . . . . . . . . . . . . . . . . 111
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
6.3.2.
. . . . . . . . . . . . . . . . . . . . . . . . . . . 119
6.3.3.
. . . . . . . . . . . . . . . . 121
123
7.1.
Objetos
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
7.2.
Clases
7.3.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
7.3.1.
7.3.2.
Mtodos y mensajes
7.3.3.
. . . . . . . . . . . . . . . . . . . . . . . . . 128
7.4.
Heren ia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
7.5.
7.6.
7.7.
Polimorsmo
7.8.
7.9.
7.4.1.
7.10. Reexin
. . . 130
. . . . . . . . . . . . . . . . 133
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
. . . . . . . . . . . . . . . . . . . . . . . . . 136
. . . . . . . . . . . . . . . . . . . . . . . . 137
8. Con
urren
ia
8.1.
. . . . . . . . . . . . . . . . . . . 143
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
148
8.1.2.
8.2.
8.3.
Control de eje u in
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
8.3.1.
Corrutinas
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
8.3.2.
Barreras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
8.3.3.
. . . . . . . . . . . . . . . . . . . . . . 155
8.4.
. . . . . . . . . . . . . . . . . . . . . . . . . 156
8.5.
. . . . . . . . . . . . . . . . . . . . . . . . . 157
8.6.
8.7.
8.8.
8.9.
8.8.2.
Deadlo k
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
9.2.
9.1.1.
9.1.2.
9.1.3.
. . . . . . . . . . . . . . . . . . . . . . . . . . . 173
. . . . . . . . . . . . . . . . . . . . . 174
. . . . . . . . . . . . . . . . . . 175
Prolog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
9.3.1.
Elementos Bsi os
9.3.2.
9.3.3.
9.3.4.
9.4.
. . . . . . . . . . . . . . . . . . . . . 170
9.1.4.
9.2.1.
9.3.
170
. . . . . . . . . . . . . . . . . . . . . . . . . . 177
9.3.3.1.
9.3.3.2.
9.3.3.3.
. . . . . . . . 180
. . . . . . . . . . . . . . . . 181
. . . . . . . . . . . . 183
9.3.5.
Problema de la Nega in
9.3.6.
Ejer i ios
. . . . . . . . . . . . . . . . . . . . . . 188
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
Captulo 1
Introdu
in
Los lenguajes de programa
in son la herramienta de programa
in fundamental
de los desarrolladores de software. Desde los
omienzos de la
omputa
in, la programa
in fue evolu
ionando desde la simple
ongura
in de interruptores, pasando
por los primeros lenguajes
assembly,
omputa
in .
El objetivo de este material es estudiar los
on
eptos y prin
ipios que en
ontramos
en los lenguajes de programa
in modernos.
Es importante
ono
er un po
o la historia y la evolu
in de algunos
on
eptos para
poder entender algunas
ara
tersti
as de algunos lenguajes.
En la a
tualidad (2007) se en
uentran
atalogados mas de 1500 lenguajes de programa
in, por lo
ual una
urr
ula en
ien
ias de la
omputa
in o de desarrollo de
software no puede enfo
arse en base al di
tado de
ursos sobre lenguajes
on
retos,
sino que es ne
esario que se estudien lenguajes de programa
in desde el punto de
vista de los diferentes modelos o estilos de
omputa
in en los
uales se basan.
Estos modelos o estilos permiten
lasi
ar a los lenguajes de programa
in en familias que generalmente se
ono
en
omo paradigmas.
El estudio de los lenguajes en base al anlisis de
ada paradigma permite generalizar
on
eptos utilizados en grupos de lenguajes mas que en lenguajes parti
ulares.
El enfoque utilizado permite realizar anlisis de los
on
eptos utilizados en todos
los lenguajes de programa
in existentes, permitiendo realizar
ompara
iones entre
lenguajes o familias.
El estudio de los
on
eptos y prin
ipios generales, en lugar de estudiar la sintaxis
de lenguajes espe
os, permite que el desarrollador pueda estudiar y aprender por s
1 Un sistema de omputa in omprende el hardware y el software de base, es de ir, sistema operativo, enlazador, ompiladores, editores, et .
Introdu in
mismo, a utilizar
orre
tamente las fa
ilidades provistas por un nuevo lenguaje (o uno
des
ono
ido).
Los paradigmas estudiados
omprenden el de
larativo, dentro del
ual podemos
en
ontrar el fun
ional y el lgi
o, el imperativo, en el
ual podemos en
ontrar una gran
antidad de lenguajes ampliamente utilizados
omo Pas
al, C, Basi
, Ada, FORTRAN,
COBOL, . . . ,
on sus evolu
iones en la programa
in orientada a objetos (POO) y los
lenguajes basados en
omponentes.
Los
on
eptos y prin
ipios de la
on
urren
ia son apli
ables a todos los dems
paradigmas por lo que se estudia
omo un paradigma en parti
ular analizndose su
apli
a
in en
ada modelo de
omputa
in en parti
ular.
programa
in .
La arma
in anterior es f
ilmente veri
able ya que
ualquier mtodo de desarrollo deber permitir la genera
in de
digo al menos para algn lenguaje de
programa
in.
2 En realidad las
ara
tersti
as que en
ontramos en los mtodos de desarrollo se pueden en
ontrar
en lenguajes de programa
in desarrollados
on bastante anterioridad.
Introdu in
de programa
in que in
orpore
on
eptos modernos
omo abstra
iones de alto nivel.
La deni
in anterior nos permite denir el trmino programa
in.
Deni in 1.2.1
onquer (divide y ven
ers), la
ual se basa en la des
omposi
in del problema en un
onjunto de subproblemas mas simples y una forma de
omposi
in de esos subproblemas para obtener la solu
in nal.
La abstra
in pro
edural es la base de la implementa
in de esta estrategia de
resolu
in de problemas. A modo de ejemplo, la programa
in fun
ional se
ara
teriza
por la deni
in de fun
iones y la
omposi
in fun
ional. La programa
in imperativa
se
ara
teriza por denir la evolu
in de los estados de un sistema basndose en la
omposi
in se
uen
ial y en opera
iones de
ambios de estado (asigna
in).
Introdu in
abstra iones.
Esto deja
laro que en el
ontexto de este libro, a modo de ejemplo, un lenguaje
omo SQL
Implementable: debera
E
iente:
ada
ara
tersti
a del lenguaje debera poder implementarse utilizando la menor
antidad de re
ursos posibles, tanto en espa
io (memoria) y nmero
de
omputa
iones (tiempo).
Uniforme:
lenguaje. Como un
ontraejemplo, en Pas
al las senten
ias for y while a
eptan
una ni
a senten
ia en su
uerpo, mientras que la senten
ia repeat a
epta un
nmero variable de senten
ias en su
uerpo.
En C el smbolo * se utiliza tanto para las de
lara
iones de punteros
omo para
los operadores de referen
ia
in y multipli
a
in, lo que a menudo
onfunde y
da lugar a la es
ritura de programas dif
iles de entender.
Legible:
Los programas deberan ser f iles de entender. Una rti a a los len-
=.
Seguro: Los errores deberan ser dete
tables, preferentemente en forma estti
a
(en tiempo de
ompila
in).
Los lenguajes de programa
in son las herramientas bsi
as que el programador
tiene en su
aja de herramientas. El
ono
imiento de esas herramientas y
mo y en
qu
ontexto debe usarse
ada uno de ellos ha
e la diferen
ia entre un programador
3 En
Introdu in
abstra iones.
frases vlidas del lenguaje y de la semnti a o signi ado de ada una de ellas.
1.4.1. Sintaxis
Los me
anismos de deni
in de sintaxis han sido ampliamente estudiados desde
los ini
ios de la
omputa
in. El desarrollo de la teora de lenguajes y su
lasi
a
in[
ha permitido que se denan formalismos de des
rip
in de lenguajes formales y hasta el desarrollo de herramientas automti
as que permiten generar automti
amente
gramti
as libres de
ontexto, las
uales permiten espe
i
ar la
onstru
in (o deriva
in) de las frases de un lenguaje en forma modular.
Las gramti
as libres de
ontexto
ontienen un
onjunto de reglas de forma
in de
las diferentes frases o
ategoras sint
ti
as de un lenguaje.
Deni
in 1.4.1
(VN , VT , S, P ),
VT es el
P es un
on
np 0
p : X0 X1 . . . Xnp
y en el
aso que
4 Como
np = 0 ,
se es ribir omo:
omo:
(1.1)
Introdu in
p : X0
(1.2)
apare e en la parte
produ
in .
Es
omn que un
onjunto de produ
iones de la forma
abrevie de la forma
{X , . . . , X }
Deni in 1.4.2
Sean
q
enton
es X =
G
, (N T )
y sea
q : X
una produ in de P,
se
X | . . . | .
denotar omo
Deni in 1.4.3
obtenida por
Deni in 1.4.4
Deni in 1.4.5
1.
M (VN VT )
2.
l(K0 ) = S
3.
S l(k1 ) . . . l(kn )
l(ki ) VT , (1 i n),
ST .
4. Si
o si
n=1
l(k1 ) = ,
enton es
Ki
es una hoja de
5. Si
5 Esta
Introdu in
Deni in 1.4.6
G =< VN , VT , S, P >. La
k1 . . . kn es la se
uen
ia formada
l(k1 ) . . . l(kn )
tal que
Teorema 1.4.1
Sea
G =< VN , VT , S, P >
E > E + E
E > E * E
E > id
uya frontera es
*
S =
G
si
E
E
Deni
in 1.4.7
guaje, es de
ir que
Dos gramti as
L(g1 ) = L(g2 )6 .
g1
g2
Hay gramti
as inherentemente ambigas para las
uales no existe una gramti
a
equivalente no ambiga.
Deni
in 1.4.8
nen la forma:
Una
X Ya
X a,
donde
X, Y N
a T.
Estas gramti
as slo permiten des
ribir la
onforma
in de las palabras o tokens
de un lenguaje lenguaje, pero no es posible des
ribir la estru
tura de frases. A modo
de ejemplo se muestra una gramti
a regular que des
ribe la forma
in de un valor
entero positivo:
6 La determina
in si dos gramti
as libres de
ontexto son equivalentes es inde
idible, es de
ir, no
existe un algoritmo que lo determine.
13
Introdu in
E
|
|
|
|
--> t
E E
(E '|' E)
(E)?
(E)*
-----
se
uen
ia
alternativa (
hoi
e)
op
ional (
ero o una vez)
ero o ms ve
es
E --> [ E ... E
| (E)+
(S):
{S}:
[S]:
...
var-de
l --> var id {',' id} ':' type ';'
type
--> integer | real | ...
...
if-stmt --> if
ondition then stmt [ else stmt
...
14
Introdu in
const_decl
type_decl
decl
var_decl
proc_fun_decl
var_decl
"var"
id
":"
id
";"
Los diagramas de sintaxis son una representa
in gr
a por medio de un grafo
dirigido el
ual muestra el ujo de apari
in de los
omponentes sint
ti
os. Los nodos
del grafo
orresponden a los smbolos terminales y no terminales y los ar
os indi
an
el smbolo que puede seguir en una frase. Es
omn que los nodos
orrespondientes
a los smbolos terminales se denoten
on
r
ulos y los nodos que
orresponden a no
terminales se denoten
omo valos.
La gura 1.4.1.2 muestra un ejemplo de diagramas de sintaxis.
1.4.2. Semnti
a
La semnti
a de un lenguaje de programa
in des
ribe el signi
ado,
omportamiento o efe
tos de las diferentes frases del lenguaje.
Es muy
omn que en los manuales de los lenguajes de programa
in la semnti
a
de
ada una de las frases de des
riba de manera informal.
Esta informalidad ha llevado mu
has ve
es a
onfusiones en los programadores o
los implementadores de herramientas
omo
ompiladores e intrpretes,
ausando que
los resultados de un programa en una implementa
in no sean los mismos que en otra .
Para dar una deni
in pre
isa de la semnti
a de un lenguaje es ne
esario utilizar
algn formalismo que des
riba en forma
lara y no ambiga el signi
ado de las frases.
Se han utilizado diferentes estilos de formalismos para dar semnti
a:
Denota ional:
matemti
as (ej:
onjuntos, fun
iones, et
) que representa el signi
ado de
ada
estru
tura.
Esta forma de dar semnti
a es til desde el punto de vista teri
o, pero en
general no es
modo para los implementadores de lenguajes y los desarrolladores.
Opera ional:
guaje en una mquina abstra
ta dada. Una mquina abstra
ta est basada en
algn modelo de
omputa
in.
7 Esto
Introdu in
Esta forma es til tanto para los implementadores del lenguaje
omo para los desarrolladores de programas, ya que tienen una visin mas
on
reta (opera
ional)
del lenguaje.
Axiomti
a: des
rip
in de
ada
onstru
in del lenguaje en trminos de
ambios de estado. Un ejemplo es la lgi
a de Hoare, que es muy til para el desarrollo
y veri
a
in formal de programas imperativos.
Esta t
ni
a es til para los desarrolladores pero no demasiado buena para los
implementadores del lenguaje.
En este libro se utilizar la semnti
a opera
ional para dar el signi
ado al lenguaje
que se ir desarrollando en
ada
aptulo, siguiendo la idea de lenguaje n
leo (kernel)
el
ual permite dar una sintaxis y semnti
a de manera sen
illa para luego adornar
el lenguaje
on mejoras sint
ti
as (synta
ti
sugars) y abstra
iones sint
ti
as o
lingsti
as pr
ti
as, las
uales tendrn un patrn de tradu
in al lenguaje n
leo.
Compilador:
Intrprete:
Es posible en
ontrar intrpretes de bajo nivel, tambin
ono
idos
omo eje
utores
de programas. Estos eje
utores interpretan lenguajes de bajo nivel (assembly real
o hipotti
o).
Es
omn que una implementa
in de un lenguaje venga a
ompaado por un
ompilador a un assembly de una mquina abstra
ta y un intrprete de ese
lenguaje de alto nivel. Ejemplos de esto son algunos
ompiladores de COBOL,
Pas
al (se tradu
a a P-
ode).
A
tualmente uno de los
asos mas
ono
idos sea Java. Es
omn que un
ompilador de Java traduz
a los mdulos a un assembly sobre una mquina abstra
ta
ono
ida
omo la Java Virtual Ma
hine (JVM).
Este ltimo enfoque permite obtener portabilidad binaria, ya que es posible eje utar un programa en ualquier plataforma que tenga una implementa in (intrprete) de la mquina abstra ta.
16
Introdu in
Enlazador (linker):
referen ias externas. El linker toma un onjunto de ar hivos objetos8 , arma una
imagen en memoria, resuelve las referen
ias externas de
ada uno (asigna dire
iones de memoria
on
retas a
ada referen
ia externa no resuelta) y genera un
ar
hivo binario eje
utable (programa ).
En forma ms rigurosa, un linker bsi
amente implementa una fun
in que toma
una referen
ia a un smbolo externo y retorna la dire
in de memoria de su
deni
in.
if
archivo
fuente
Analizador
lexico
(lexer)
tokens
if ( ...
Analizador
sintactico
(parser)
Analizador
Semantico
(type checker)
(
...
Optimizador
mov ax,...
generador
de codigo
codigo
(assembly)
assembler
archivo
objeto
Compilador
archivo
objeto
resolucion de
referencias
externas
edicion
archivo
ejecutable
(programa)
biblioteca
Linkeditor (linker)
Figura 1.3: Esquema de
ompila
in de un programa.
La gura 1.3 muestra un esquema del pro
eso de
ompila
in de un programa.
8 Generalmente
Introdu in
10 (DLLs).
9 Una rutina de startup generalmente abre ar
hivos de entrada-salida estndar e invo
a a la rutina
prin
ipal del programa.
10 En el mundo UNIX son
ono
idas
omo shared libraries.
18
Introdu in
y
ada ar
hivo objeto de
ada bibliote
as debe
ontener al menos el
onjunto de smbolos que exporta.
Las prin
ipales ventajas que tiene este me
anismo son:
El
digo de las rutinas de las bibliote
as se en
uentra presente una sola vez (no
hay mltiples
opias).
El
digo se
arga baja demanda. Es de
ir que no se
argar el
digo de una
bibliote
a que no haya sido utilizada en una instan
ia de eje
u
in.
Como desventaja tiene que la eje
u
in de los programas tiene una sobre
arga adi
ional (overhead) que es el tiempo insumido por la resolu
in de referen
ias externas
y la
arga dinmi
a de
digo.
Un linker
on
apa
idades de generar bibliote
as dinmi
as deber generar ar
hivos
objetos
on la informa
in adi
ional que men
ionamos arriba y el sistema operativo
deber permitir eje
utar
digo reubi
able, es de
ir independiente de su ubi
a
in en
la memoria
11 .
Una bibliote
a
ompartida no debera tener estado propio, ya que puede ser utilizada por mltiples pro
esos en forma simultnea, es de
ir que es un re
urso
ompartido
por varios pro
esos. Por ejemplo, un programador de una bibliote
a que pueda utilizarse en forma
ompartida no podr utilizar variables globales.
Lo anterior es muy importante a la hora de disear bibliote
as. Es bien
ono
ido
errno),
la
11 Esto
Introdu in
3. Usar el omando
grep12
que sele ione las lneas del ar hivo fuente Pas al del
E T [ + E]
T F [ T ]
F V | ( E )
V ( 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 )+
Ayuda: Por
ada regla de la gramti
a de la forma
X a Y b
se puede denir
Pro
edure X;
begin
if
urrent_token = 'a' then begin
next_token;
Y
end
else
error;
if
urrent_token = 'b' then
next_token
else
error
end;
donde next_token es un pro
edimiento que obtiene el prximo (smbolo) token
de la entrada.
Para sta gramti
a next_token debera re
ono
er (y obtener) valores numri
os
y los smbolos + y * (e ignorar espa
ios, tabs y new-lines).
Generar patrones de
digo para reglas que
ontengan
omponentes op
ionales
(0 o una vez) y repeti
iones (0 o mas y 1 o mas).
6. Extender el programa anterior para que evale la expresin.
Ayuda: utilizar una pila de operandos y una pila de operadores.
12 Uso:
Introdu in
Program CallToC;
Var x:integer; external name 'y';
Pro
edure in
_x; external name 'in
_y';
begin { programa prin
ipal }
x := 1;
in
_x;
writeln('x=',x)
end.
/* file in
.
*/
int y;
/* global integer y */
void in
_y(void)
{
y++;
}
a )
ompilar el programa Pas
al (usando gp
). En
aso de error des
ribir su
origen y quin lo genera (
ompilador o linker).
pondiente
on la bibliote a mylib.
int main(void)
{
in
_y();
}
9. Re
ompilar el programa Pas
al denido arriba usando la bibliote
a
reada en el
ejer
i
io anterior.
13 Usar
el
omando g
-v -
in
.
.
21
Introdu in
/* File:
#in
lude
#in
lude
#in
lude
foo.
*/
<stdio.h>
<stdlib.h>
<dlf
n.h>
int main()
{
void *handle;
double (*
osine)(double); /* Pointer to a fun
tion */
/* Load the math library */
handle = dlopen("libm.so", RTLD_LAZY);
/* Get (link) the "
os" fun
tion: we get a fun
tion pointer */
osine = (double (*)(double)) dlsym(handle, "
os");
printf("%f\n",
osine(2.0));
dl
lose(handle);
exit(EXIT_SUCCESS);
22
Captulo 2
El modelo de
larativo
La programa
in
omprende tres
osas:
Un modelo de
omputa
in, el
ual dene formalmente la sintaxis y la semnti
a
de las frases (senten
ias) del lenguaje.
Un
onjunto de t
ni
as de programa
iny prin
ipios de diseo. Generalmente
sto se
ono
e
omo el modelo (o estilo) de programa
in.
Un
onjunto de t
ni
as para razonar sobre los programas y
al
ular su e
ien
ia.
Otros autores llaman a los tres puntos que
ara
terizan a familias de lenguajes
omo que denen un paradigma de programa
in.
El modelo que se presentar es el modelo de
larativo, el
ual dene me
anismos
bsi
os para evaluar fun
iones par
iales (o fun
iones sobre estru
turas de datos par
iales).
Este modelo se
ono
e
omunmente
omo programa
in sin estado (stateless),
opuesto a la programa
in
on estados (statefull) o programa
in imperativa.
El trmino imperativo se reere a que el programador ve a los programas
omo una
se
uen
ia de
omandos que
ambian el estado (valores de un
onjunto de variables)
para llegar a obtener el efe
to del programa deseado. En
aso que los programas arrojen resultados, el estado nal se
orrespondera
on el resultado del programa.
La programa
in de
larativa
omprende bsi
amente dos paradigmas de
larativos,
el paradigma fun
ional y el lgi
o.
Estos paradigmas
omprenden la programa
in en base a fun
iones sobre valores
ompletos
omo Sheme y ML,
omo tambin a la programa
in no determinsti
a sobre rela
iones,
omo Prolog.
Una de las grandes ventajas de la programa
in de
larativa es que es mas simple el razonamiento sobre los programas ya que al no tener estado es posible ha
er
razonamiento en forma modular.
23
El modelo de larativo
En estos modelos, es
omn que la programa
in est basada en deni
iones re
ursivas (tanto de fun
iones
omo de datos), lo que permite razonar en trminos matemti
os utilizando el prin
ipio de indu
in (natural y estru
tural).
Como desventaja es ne
esario men
ionar que hay algunos problemas que pare
en
ser modelados mas naturalmente
on la no
in de estado,
omo lo son la entrada-salida,
omputa
iones usando evalua
in par
ial, et
.
Si bien lo anterior es posible modelarlo sin estado, las implementa
iones son mas
omplejas y dif
iles de entender.
x1
3.14
x2
person
name
x3
unbound
age
25
24
El modelo de larativo
los dems.
La gura 2.1 muestra un ejemplo de la memoria de variables y valores en el modelo de
larativo. La gura ilustra la representa
in de un valor Integer y del Re
ord
no est ligada.
No se deben
onfundir las variables
on los identi
adores ya que es posible que
algunas variables se identiquen en el programa por medio de indenti
adores, mientras
que otras pueden no estar nombradas en el programa (pero s tal vez denotada por
alguna expresin). Generalmente esas variables se denominan mudas.
Adems un mismo identi
ador puede estar aso
iado a una variable en un
ontexto (ambiente) y a otra variable en otro,
omo
omnmente o
urre en lenguajes que
permiten denir mltiples ambientes.
Se debe notar que los valores pueden ser valores par
iales, esto es una estru
tura
puede
ontener
omponentes no ligados (unbounded).
En este sentido el lenguaje que se est introdu
iendo es ms general que las variables de algunos lenguajes fun
ionales
omo por ejemplo ML o Haskell. Los lenguajes
fun
ionales se
ara
terizan por el he
ho que todas sus variables estn ligadas desde
el momento de su introdu
in. Esto quiere de
ir que la
rea
in de una variable va
a
ompaada de su valor.
X = 25
rea la estru
tura de datos para representar el valor 25 (ej: un bloque de memoria
de 4 bytes) y liga la variable identi
ada por
al valor.
El lenguaje n
leo del modelo de
larativo permite la
rea
in de los siguientes tipos
de valores:
1. Nmeros (enteros y reales).
Los
ara
teres sern representados
omo nmeros (su
digo
orrespondiente
segn la
odi
a
in utilizada, ej: ASCII o Uni
ode).
2. Registros. Ejemplo:
person(name:George age:25).
3. Pro
edimientos. En el lenguaje n
leo los pro
edimientos son valores a diferen
ia
del paradigma imperativo. El uso de pro
edimientos
omo valores otorga una
gran exibilidad para denir
onstru
iones de mas alto nivel.
En los programas de ejemplo usaremos denota
iones de la forma [x1 x2 . . . xn para representar listas. Las listas se representarn
omo registros de la forma list(X1:x1
25
El modelo de larativo
X2:x2 . . . XN:xn).
Tambin denotaremos tuplas de la forma tuple(x1 x2 . . . xn), las
uales se representarn
omo registros de la forma tuple(1:x1 2:x2 . . . n:xn).
lo
al Fa
torial in
Fa
torial = pro
{$ N ?R}
if N == 0 then R = 1 else R = N * { Fa
torial N - 1 } end
end
end
lo
al F in
F = {Fa
torial 5} invo
a
in a Fa
torial(5)
{Browse F}
end
Browse es
in) en la bibliote
a estndar del lenguaje, el
ual muestra por
onsola (salida estndar)
el valor pasado
omo argumento.
x1 )
store
"X"
3.14
1 Se
El modelo de larativo
el lenguaje n leo, los identi adores se denotarn en mays ulas y utilizaremos mins ulas para referirnos a las variables dentro de la memoria de asigna in simple.
Deni in 2.1.1
Un
dores y variables.
Los identi
adores de variables estarn
ontenidos en un rea separada de memoria.
De he
ho en los lenguajes
ompilados, los identi
adores (es de
ir, el ambiente) no
existen en tiempo de eje
u
in. Estos son slo identi
adores que utiliza el
ompilador
person(name:X age:25)
x3)
El lenguaje tambin permite des
ribir estru
turas
li
as, tal
omo el siguiente
ejemplo:
X = node(value:345 tail:X)
Dos variables pueden referirse al mismo valor, por lo tanto en un programas los
identi
adores
orrespondientes tambin lo harn. Esto se denomina aliasing ya que
puede haber varias variables denotando el mismo valor.
El
on
epto de aliasing
obrar mayor importan
ia durante el estudio del paradigma
imperativo ya que en general se
onvierte en algo no deseable a la hora de razonar sobre
los programas.
El problema es que
uando se
ambia el valor de una variable, ese
ambio se reejar
automti
amente en las dems variables ligadas entre ellas.
En el modelo de
larativo el aliasing no genera problemas ya que las variables ligadas son inmutables.
El lenguaje de
larativo permite uni
ar (igualar) dos variables. La senten
ia
X = Y
liga las variables X e Y. Esta senten
ia se denomina variable-variable binding.
2 En realidad las variables se
orresponden
on dire
iones de memoria o ndi
es de una tabla. Un
ambiente
omnmente se denomina tabla de smbolos.
27
El modelo de larativo
|
<v>
< number >
< record >
< pattern >
senten
ias
senten
ia va
a (sin efe
to)
omposi
in se
uen
ial
rea
in de variable
ligadura variable-variable
rea
in de valor
Condi
ional
skip
::=
::=
::=
::=
|
< literal > ::=
< f ield > ::=
< bool > ::=
valores
nmeros
re
ords
patrones
booleans
Las denota
iones para las listas y tuplas sern adornos sint
ti
os para ha
er ms
legibles los programas, pero se representern
omo registros
omo se men
ion anteriormente.
Las
adenas de
ara
teres (strings) sern reprentados
omo listas de enteros pero
se denotarn entre
omillas dobles, tal
omo es habitual en la mayora de los lenguajes
de programa
in.
Diremos que un
es de un tipo
si
v T.
El lenguaje de
larativo des
ripto aqu es un lenguaje tipado ya que los valores pertene
en a tipos de datos bien denidos, llamados tipos bsi
os. Estos tipos bsi
os
pueden
lasi
arse en la jerarqua de la gura 2.5.
Entre los tipos bsi
os tenemos dos
lases:
1.
elementales:
estru turados:
28
El modelo de larativo
Value
Number
Integer
Float
Record
Procedure
Tuple
Function
Literal
Char
Bool
List
Atom
String
Los tipos de datos estru
turados pueden
lasi
arse en base a diferentes
ara
ters
as.
Por el tipo de sus elementos que
ontienen:
1.
homogneos:
todos sus elementos son del mismo tipo, omo por ejemplo los
arreglos.
2.
heterogneos: sus elementos pueden ser de diferente tipo, omo los registros.
estti
os: el nmero de sus elementos est dado por una
onstante momento de
su
rea
in. Ejemplo: arreglos en Fortran o Pas
al.
2.
3.
semi-dinmi os:
3 Como
El modelo de larativo
omo valor de salida en un pro
edimiento. En ste modelo se requerir que el parmetro
a
tual (o real) no est ligado en el momento de la invo
a
in.
El smbolo ? permite dar
laridad sint
ti
a a la deni
in de un pro
edimiento
pero no tiene ninguna semnti
a parti
ular.
end
end
...
podemos es ribir
else L in
end
if
N == 1
then s
...
lo al es permitir la de lara in de varios identilo al A B ... in . . . end, lo ual ser equivalente al siguiente
lo
al A in
lo
al B in
end
end
...
30
El modelo de larativo
D)
A = B * (C +
lo al T1 T2 in
{Number.`+` C D T1}
{Number.`*` B T1 T2}
end
A = T2
En las expresiones es posible utilizar parntesis para aso
iar opera
iones.
El lenguaje n
leo tendr en
uenta la pre
eden
ia y aso
iatividad entre los
operadores bsi
os del lenguaje de la manera habitual en otros lenguajes de
A + B * C signi
a A + (B * C)
A+B+C signi
a (A+B)+C (aso
iatividad).
(pre-
ser una expresin que deber ser eje utada al nal de la fun in.
Las invo
a
iones a fun
iones podrn formar parte de las expresiones.
Una fun
in se podr denir
omo los pro
edimientos des
riptos arriba. Es de
ir
que en el ejemplo 2.2, la fun
in
fun { Fa
torial N }
if N == 0 then R = 1
else R = N * { Fa
torial N - 1 }
end
end
4 Los
de la forma
El modelo de larativo
ten ia
Des rip in
Operandos
A==B
Compara in (igualdad)
Value
A\=B
Compara in (desigualdad)
Value
{IsPro edure P }
Pro edure
A<=B
Number o tomo
A<B
Compara in (menor)
Number o tomo
A>=B
Number o tomo
A>B
Compara in (mayor)
Number o tomo
A+B
Suma
Number
A-B
Diferen ia
Number
A*B
Produ to
Number
A/B
Divisin
Number
Divisin entera
Integer
Mdulo (resto)
Integer
div B
A mod B
{ Arity R }
Aridad
Re ord
{ Label R }
Rtulo
Re ord
R.F
Sele in de ampo
Re ord
2.3. Semnti
a
La semnti
a se denir en trminos de un modelo opera
ional simple. Bsi
amente se denir una mquina abstra
ta ade
uada para la evalua
in de fun
iones sobre
valores par
iales.
El modelo permitir al programador razonar en forma simple sobre los programas
sobre su
orre
titud y
omplejidad
omputa
ional. La mquina denida es una mquina de alto nivel la
ual elimina los detalles en
ontrados en otras mquinas abstra
tas
omo registros del pro
esador y dire
iones de memoria.
32
El modelo de larativo
lo al A in
A = 20
{Browse A * 2}
end
Deni in 2.3.1
La
y valores. Las variables en la memoria forman una parti
in de
onjuntos que son
iguales pero no ligadas a valores y variables ligadas (a nmeros, registros o pro
edimientos).
Por ejemplo, la memoria de asigna
in ni
a se denota
omo
En este ejemplo, la variable
variables
x2
x3
x1
{x1 , x2 = x3 , x4 = 25}.
x4
Deni in 2.3.2
Un
ambiente
.
Denotaremos un ambiente
{X
x1 , Y x2 }.
Deni
in 2.3.3
donde
<s>
Una
senten ia semnti a
es una senten ia y
es un par de la forma
es un ambiente.
Deni in 2.3.4
Un
33
El modelo de larativo
Deni in 2.3.5
Una
(ST0 , 0 ) (ST1 , 1 ) . . .
Cada transi
in en una
omputa
in es un paso de
omputa
in.
< s >,
omo
suspended,
el pro eso (programa en eje u in) quedar ongelado sin poder progresar.
Adjun tion:
Restri tion:
tente.
La nota
in E |{x1 ,...,xn } denota un nuevo ambiente
E = dom(E) {x1 , . . . , xn }
<X>
en el ambiente
{x1 , . . . , xn }.
E.
34
El modelo de larativo
state = running
while sta
k not empty and state = running do
s := top sta
k
pop
exe
s
end
A
oontinua
in se dene la semnti
a de
ada senten
ia del lenguaje, es de
ir qu
deber implementar
exe .
(skip, E):
(s1 s2 , E):
1. Push
(s2 , E).
2. Push
(s1 , E).
(X = Y, E):
1.
en la memoria
(s, E + {X x}).
(ligadura variable-variable).
(X = v, E):
( rea in de un valor).
aso ia
o Pro
edure.
1. Crear la representa
in del valor
res de
en la memoria
E.
Ya se ha visto
mo se
rean valores numri
os o registros, pero los pro
edimientos (tambin llamados
lausuras ) se
rean de la siguiente manera:
Un valor
pro { $ y1 . . . yn
} s
pro { $ y1 . . . yn
donde
} s
end,CE)
CE = E |{z1 ,...,z1 }
{z1 , . . . , z1 }
{z1 , . . . , z1 }
s.
miento.
35
El modelo de larativo
2. Ha er que
se reera a
en
1. Si
2. Sino, si
state := Suspended.
es
, E): (pattern
mat
hing).
1. Si
2. Sino, si
Label(E(X)) = lit
enton es
ha
er
Push
({X Y1 . . . Yn }, E):
1. Si
(s2 , E).
2. Sino, si no
IsP rocedure(E(X))
Arity(E(X) <> n,
disparar un error de
tipo.
3. Si
E(X)
pro
{ $ z1 . . . zn } s end,CE),
+ {z1 E(Y1 ), . . . zn E(Yn )})
tiene la forma (
Push (s,CE
ha er
2.3.5. Al
an
e (s
ope)
A
ontinua
in se analizar el
omportamiento del siguiente programa:
lo al X in
X=1
lo
al
X in
X=2
s
s1
{Browse
end
s2 {Browse X}
X}
end
([(s, )], )
es de
ir, la senten
ia
lo al de s, obtenemos
El modelo de larativo
s1
es una senten ia
lo al y su eje u in deja
s1
on el ambiente
{X x2 }
y la senten ia
s2
on el
{X x1 }.
senten
ia.
5. Despus de eje
utar la senten
ia
X =2
(binding) obtenemos
{Browse X }
x2 ).
lo al
introdu e un nuevo
ren
ia
in de
ada senten
ia se puede determinar sin ne
esidad de eje
utar el programa.
Lo anterior tiene un mayor impa
to en la deni
in de pro
edimientos y fun
iones,
ya que en una invo
a
in, el pro
edimiento se eje
uta en el ambiente de su de
lara
in.
Es de
ir que
ualquier referen
ia no lo
al en el
uerpo del pro
edimiento (variables
lo
ales o parmetros formales), se reere a identi
adores ligados a variables en su
ambiente de de
lara
in y no en el ambiente de su invo
ante.
Esisten otros lenguajes que tienen
en los
uales una senten
ia o pro
edimiento opera sobre el ambiente de su invo
a
in.
Lenguajes
omo Clipper, S
heme y Perl permiten tener ambos tipos de al
an
e.
El al
an
e estti
o es el mas ade
uado porque permite razonar sobre programas en
forma modular, es de
ir sin tener en
uenta sus posibles
ontextos de invo
a
in.
Una ventaja que posee el al
an
e dinmi
o es que es posible dar mayor exibilidad
en algunos
asos
omo por ejemplo en Clipper, el
ual es un lenguaje orientado al
manejo de bases de datos y por ejemplo, la aperura de un ar
hivo ha
e que aparez
an
37
El modelo de larativo
automti
amente variables mediante las
uales se puede a
eder a los valores de los
ampos de la la
orriente de un ar
hivo.
Un lenguaje es
si no permite la eje u in de
type he king.
Deni in 2.3.7
Un lenguaje es
pado.
Por supuesto que un lenguaje que permita realizar
hequeo estti
o, deber expresar, expl
ita o impl
itamente el tipo de
ada
onstru
in del lenguaje.
A modo de ejemplo, en Pas
al todas las variables,
onstantes parmetros y valores
retornados por fun
iones deben de
lararse (expl
itamante)
on su tipo
orrespondiente.
De esta manera un
ompilador Pas
al tiene toda la informa
in de los tipos de las
entidades que apare
en en un programa por que puede realizar el
hequeo de tipos en
durante la
ompila
in.
En los lenguajes fun
ionales modernos
omo Haskell, ML o Miranda no es ne
esario
de
larar los tipos de las expresiones denidas ya que le lenguaje puede inferirlos a partir
(relativo).
38
invo a iones.
El modelo de larativo
En los aptulos siguientes se analizar en detalle los diferentes tipos de polimorsmo que podemos en ontrar en los diferentes paradigmas.
Deni in 2.3.8
Un
dor.
Deni in 2.3.9
Una
sustitu in de
X,
un trmino
por
y una expresin
T.
Deni
in 2.3.10
posi
in de
E1
age:25) = X.
39
El modelo de larativo
2. Opera sobre valores par iales : por ejemplo, (si X1 y X2 no estn ligadas)
X1 George
X2 25.
3. Puede no
ausar
ambios : en el
aso que ambos valores (par
iales o no) sean
iguales (uniquen).
4. Puede
ausar error : en el
aso que ambos valores sean in
ompatibles.
Por ejemplo:
L=node(value:X rest:L)
6. Puede ligar estru
turas
li
as : es posible uni
ar las siguientes expresiones:
X=Y
rea
X=f(a:X b:X).
La senten
ia
omo
X=f(a:X b:_)
X
X=Y
Y=f(a:_ b:Y)
Y
X=f(a:X b:X)
en la memoria
40
El modelo de larativo
x5 , x6 , x7 = x8 }.
El algoritmo de uni
a
in se basa en las opera
iones primitivas bind y merge, las
uales operan sobre la memoria
1.
bind(ES, v):
Por ejemplo,
bind({x7 , x8 }, f oo(a : x2 ))
ES
on el valor
v.
de equivalen ia
ES1
merge({x3 = x4 = x5 }, {x6 })
omo
(x, y) W L
2. Si
x ESx
y ESy ,
3. Si
x ESx
es determinada, ha er
bind(ESx , y).
4. Si
y ESy
es determinada, ha er
bind(ESy , x).
(y, x) W L,
terminar.
enton es ha er
merge(ESx , ESy ).
5. Si
6. Si
on
ha er
WL
ya uni
adas.
Esto impide que el algoritmo entre en un
i
lo innito, ya que a lo sumo se invo
a
unif y (x, y) por
ada par de variables x e y . Como la
antidad
41
El modelo de larativo
true
false si los grafos uyos vrti es parte de x e y son diferentes, o sea que
tural.
emphequivalen ia estru -
Tiene
omoventaja que es posible
omparar estru
turas
omplejas pero el algoritmo
requiere tiempo lineal sobre el tamao de la estru
tura. El algoritmo deber tener
uidado
on las estru
turas
li
as, pero el problema ha sido ampliamente estudiado
en el
ampo de los algoritmos sobre grafos.
Otros lenguajes realizan slo
ompara
iones sobre valores de los tipos bsi
os no
estru
turados,
omo es
omn en lenguajes imperativos
omo Pas
al o C.
La igualdad de valores estru
turados generalmente la tiene que denir el programador.
lo
al X in
lo
al Y in
lo
al Z in
X = person(name:"George" age:Y)
Z = 26
Z = Y
{Browse Y}
end
end
{Browse X}
end
8 El trmino entailment viene de la lgi
a, ya que puede verse
omo |= (x = y) (desde sigma
puede inferirse que x = y.
42
El modelo de larativo
Nota: el pro
edimiento {Browse Arg} muestra el valor aso
iado a Arg.
3. Eje
utar paso a paso el siguiente programa:
lo
al X in
lo
al Y in
X = person(name:"George" age:25)
Y = person(name:"George" age:26)
X = Y
end
{Browse Y}
end
4. Dado el siguiente programa, mostrar su eje
u
in paso a paso segn la mquina
abstra
ta denida.
lo
al X in
X = 1
lo
al P in
P = pro
{\$}
{Browse X}
end
lo
al X in
X = 2
{P}
end
end
end
5. El programa del ejer
i
io anterior muestra que el al
an
e (s
ope) es estti
o, es
de
ir un pro
edimiento se evala en el ambiente de su deni
in.
Eje
utar el programa
on la nueva semnti
a para veri
ar que la salida del
programa sera
6. Una expresin es una abrevia
in sint
ti
a de una se
uen
ia de opera
iones que
arrojan un valor. Suponiendo que extendemos la sintaxis de nuestro lenguaje
para permitir expresiones en las opera
iones de binding y en la
ondi
in de la
senten
ia
if.
El modelo de larativo
lo
al X Y in
X = 1
Y = 2 + X
if X > Y then
{Browse X}
else
{Browse Y}
end
end
Tradu
ir el programa al lenguaje kernel.
7. Mostrar que en el siguiente programa re
ursivo a la
ola, el tamao de la pila se
mantiene limitada o a
otada.
pro
{Loop5 I}
lo
al C in
C = I == 5
if C then skip
else
lo
al J in
J = I + 5
{Loop5 J}
end
end
end
Ayuda: eje
utar al menos dos invo
a
iones re
ursivas.
44
Captulo 3
publi el memorable art ulo Can Programming Be Liberated From the Von Newmann
Style?, por el
ual se le otorg el premio Turing Award Le
ture. En ese art
ulo Ba
kus
propone el lenguaje FP (fun
tion-level programming language ), el
ual introdu
e los
prin
ipales
on
eptos de la programa
in fun
ional moderna.
La programa
in fun
ional tiene sus propias
ara
tersti
as y
on
eptos, que se
des
riben a
ontinua
in.
1 John Ba
kus, entre otras
osas, desarroll FORTRAN y fue el
reador de la BNF (Ba
kus Naur
Form).
45
tienen efe
tos
olaterales. Es de
ir que tienen las siguientes propiedades (algunas
de las
uales pueden ser usadas por el intrprete o
ompilador para optimizar
digo):
Cada vez que se llame a una fun
in
on los mismos argumentos, el resultado
ser el mismo. Esto se
ono
e
omo transparen
ia referen
ial.
Fun
iones de alto orden : Una fun
in es de alto orden
uando puede tomar
fun
iones
omo argumentos o retornar fun
iones
omo resultado. Las fun
iones
de alto orden son naturales en la programa
in fun
ional y son la base de la
t
ni
a de programa
in
ono
ida
omo programa
in genri
a.
de dimensin
N.
...
p := 0;
for i := 1 to N do
p := p + a[i * b[i
46
p.
2
Una solu in al estilo fun ional podra es ribirse omo (al estilo de FP):
una lista de listas) puede ser evaluada mediante la
omposi
in de tres pasos:
1. Obtener la transpuesta de matriz de entrada.
2. Apli
ar el operador
3. Apli ar el operador
InnerP roduct
<<
sera:
retorna
3. La apli
a
in de Insert + a
evalua
in retornara
uya
i).
N.
2 Extraido del art
ulo Can Programming Be Liberated From the Von Newmann Style? de John
Ba
kus, disponible en http://www.stanford.edu/
lass/
s242/readings/ba
kus.pdf
47
for, ::=,
. . . ).
Si bien del anlisis anterior es posible ver las ventajas de la programa
in fun
ional
sobre la imperativa, es justo nombrar algunos problemas en los
uales la no
in de
estado es importante y natural para su solu
in.
48
calculus),
Kleen en 1930, es un sistema formal diseado para investigar las deni
iones de fun
iones y sus apli
a
iones.
El
l
ulo lambda se puede ver
omo un lenguaje minimalista de programa
in,
sobre el
ual se dene un modelo de
omputa
in, el
ual tiene el mismo poder
omputa
ional de otros lenguajes de programa
in (turing
omputable).
Adems de sus apli
a
iones en
ien
ias de la
omputa
in tiene un rol fundamental
en el rea de fundamentos de la matemti
a, gra
ias a la
orresponden
ia CurryHoward.
En esta se
in se analizar el
l
ulo lambda no tipado. Mu
has de sus apli
a
iones utilizan una de sus extensiones
ono
ida
omo
l
ulo lambda tipado.
Informalmente, en el
l
ulo lambda
ada expresin es una fun
in unaria. Es de
ir
que
ada fun
in toma un argumento y retorna un valor.
Deni in 3.4.1
omo:
1. Una variable (denotadas
omo
2. Abstra
in lambda: si
tambin lo es
3. Apli
a
in: si
x, y, . . .)
es una variable y
(x.M ).
M, N
(M N ).
MN
en lugar de
MNP
(M N ).
signi
a
(M N ) P .
(xM N )
y no
xy.N
F V (M ),
F V (x) = {x}
F V (x.M ) = F V (M ) {x}.
3 Rela
in
se puede abreviar
xy.N .
Deni
in 3.4.2
tada
omo
xM N
(xM )N .
M,
deno-
F V (M N ) = F V (M ) F V (N ).
Una variable no libre en una expresin
Deni in 3.4.3
Una expresin
on
F V (M ) =
3.4.1.1. Redu
in
La rela
in de redu
in dene los pasos de
omputa
in que se pueden apli
ar a
una expresin lambda.
Conversin alpha: permite renombrar a las variables ligadas. Cabe a
larar que
la apli
a
in en una expresin de esta regla puede
ambiar su signi
ado. Por
ejemplo, si en la expresin
Redu in beta
xy.x
se reemplaza
por y, se obtiene
yy.y .
E1 [x E2 ]
la expresin
E1 .
Conversin eta (extensionalidad): dos fun
iones son iguales si dan los mismos
resultados en
ada uno de sus posibles argumentos. Por ejemplo,
onvertir a
f,
siempre que
no aparez a libre en
x.f x
puede
f.
Esta
onversin no es siempre
onveniente
uando las expresiones lambda son interpretadas
omo programas (la evalua
in de
la evalua
in de
no).
El numeral de Chur h
SU CC n f x.f (n f x)
P LU S m n f x.n f (m f x) o P LU S m n.m SU CC n.
Multipli
a
in: M U LT m n f.m(n f ) o P LU S m n.m(P LU S n)0
Fun
in su
esor:
Suma:
50
= n1
P RED0 = 0)
sa para des
ribir. La siguiente deni
in se puede validar por indu
in: sea
T = g h.h(g f ), enton
es T n (ux) = (h.h(f n1 (x))), para n > 0.
P RED
Operadores lgi
os
F ALSE t f.f (notar
T RU E t f.t
AN D p q.p q p
OR p q.p p q
N OT pab.pba
P RED
es
m n)
Pares: (f
P AIR xyf.f x y
F ST p.pT RU E
SN D p.pF ALSE
Tambin es posible redenir
P RED
usando pares:
donde
n) = P AIR(n n + 1))
Re
ursin
El
ombinador
Y g.(x.g(xx))(x.g(xx))
y se
ono
e
omo el operador de punto jo ya que
(expande a
Yg
es un punto jo de
g(Y g)).
51
si se apli a
Deni in 3.4.4
Una fun in
No existe un algoritmo (una fun
in
omputable) que tome dos expresiones lambda
y retorne
T RU E
F ALSE
Deni in 3.4.5
Una expresin que no puede ser redu ida se denomina forma nor-
mal.
Deni in 3.4.6
Un
Una expresin
es un
redex
si
tiene la forma
((x.M ) N ).
Una expresin
es un
redex
si
tiene la forma
x.M x
en
no est libre
M.
M [x N ]
M,
redu to.
respe tivamente.
Full beta redu
tion:
ualquier redex puede redu
irse en
ada paso.
Orden apli
ativo: en
ada paso se elige el redex ms interno y ms a la dere
ha.
Intituivamente, esto signi
a que los argumentos siempre se redu
en antes que
la apli
a
in de la fun
in, lo que impli
a que las fun
iones siempre operan sobre
formas normales.
Orden normal:
52
x.(x.x)x, ya est en
(x.x)x
Por ne
esidad (
all-by-need): igual que en orden normal, pero aquellas apli
a
iones que podran generar trminos dupli
ados en lugar de nombres de argumentos, se redu
en slo
uando sean ne
esitados. Esta estrategia se
ono
e
generalmente
omo evalua
in lazy y en la pr
ti
a
omnmente se implementa
usando punteros (el
ual representa el nombre ) y el redex se representa
on una
estru
tura de datos (usualmente un rbol o un DAG).
El orden apli
ativo no es una estrategia normalizante, es de
ir que no siempre
E1 = (x.xx x.xx),
E1 . Esto signi
a que E
no tiene forma normal (bajo ninguna estrategia). La expresin E2 = (x y.x)(x.x)E1 ,
usando orden apli
ativo, se debe apli
ar en E1 primero, pero
omo E1 no tiene forma
normal, el orden apli
ativo falla para en
ontrar una forma nomrmal de E2 .
4 En el ejemplo
E2
redu e a
I = x.x.
Una de las ventajas del orden apli
ativo sobre el orden normal, es que el primero no produ
e
omputa
iones inne
esarias si se utilizan todos los argumentos en las
abstra
iones, porque nun
a sustituye argumentos
onteniendo redexes (porque ya han
sido redu
idos previamente).
Deni in 3.4.7
Un
Deni
in 3.4.8
4 De
Un
x:
donde
P:
donde
(E1 E2 ):
es una variable.
es una fun
in primitiva.
apli a in de
E1
E2 .
Las fun
iones primitivas son
ombinadores, es de
ir que no tiene variables libres.
La deni
in de
ada
ombinador primitivo dene su regla de redu
in.
Ejemplos de
ombinadores primitivos:
(I x) = x
: (identidad).
((K x) y) = x
(S x y z) = (x z (y z))
dentro del
ontexto de
z ).
I
puede obtenerse de
K,
dado que
I =
((S S K)x).
Y = S(K(SII))(S(S(KS)K)(K(SII)))
El siguiente teorema muestra que es posible denir
ada expresn lambda en
ombinadores, utilizando los
ombinadores primitivos
Teorema 3.4.1
SKI.
SKI.
T [x] x.
2.
3.
4.
T [x.x I
5.
6.
, si
no est libre en
, si
54
E.
es libre en
E.
de expresio-
Dado que
ada trmino lambda puede ser tradu
ido a un
ombinador
junto de
ombinadores primitivos
SK se denomina ompleto.
SKI, el on-
(C a b c) = (a c b)
(B a b c) = (a (b c))
Estos
ombinadores son muy tiles para realizar una tradu
in ms dire
ta desde
el
l
ulo de predi
ados y el
l
ulo lambda a la li
a de
ombinadores.
3.5. LISP
LISP (LISt Pro
essing)fue inventado por John M
Carty en 1958 en el MIT. La sintaxis del lenguaje se basa en la no
in de S-expresiones (symboli
expressions),
omo
por ejemplo (
ar(
ons A B)).
3.5.1. Sintaxis
LISP es un lenguaje orientado a expresiones. La evalua
in de una expresin arroja
un valor (o lista de valores). Los valores pueden ser bsi
os (ej: nmeros,
ara
teres y
tomos) o estru
turados (listas).
Los tipos de datos en LISP pueden ser dos: tomos o listas.
Un tomo es un identi
ador (smbolo) o una
onstante numri
a o
ara
ter. Las
expresiones se es
riben
omo listas en forma preja.
Una lista en LISP es una lista simplemente enlazada. Cada
elda de una lista se
denomina un
ons el ual
ar)
dr).7
y el resto (
5 Slo se ne
esitaran denir las fun
iones de redu
in para
ada
ombinador primitivo.
6 Lo
ual evala a A, la
abeza (
ar ) de la lista [a,b (
ons es el
onstru
tor de listas.
7 Los nombres
ar y
dr se deben a
ontents of address register y
ontents of de
rement
register,
respe
tivamente y tienen rela
in dire
ta a la primera implementa
in de LISP en la IBM 704.
55
Por ejemplo, la fun in list retorna sus argumentos omo una lista, as la expresin
retorna la lista
(1 foo).
(if E1 E2 )
retorna
E1
si
evala a
nil
(un tomo
E2 .
body es la
3.5.2. Semnti
a
LISP evala las expresiones a menos que estn pre
edidas por el operador
quote
('). La evalua
in naliza
uando una expresin es un valor bsi
o (nmero, tomo o
lista que evala a s misma). Cada elemento de una lista que est ligado a una deni
in de una fun
in podr ser evaluada, sino es
onsiderada un valor (evala a s
mismo).
El orden de evalua
in utilizado por LISP es estri
to, espe
amente orden apli
ativo.
El intrprete de LISP (fun
in
defun dene una nueva fun in en una sesin la ual puede ser invo ada
3.5.3. Estado
LISP no es un lenguaje fun
ional puro ya que permite
ompartir y modi
ar estru
turas denidas.
Por ejemplo, la fun
in
setf, permite
56
Si se ha
e
el valor
(1.b).8
3.6.1. ML
ML fue desarrollado por Robin Milner y otros en los
omienzos de la d
ada de
1970 en la Universidad de Edimburgo. Uno de los prin
ipales objetivos fue la implementa
in de t
ti
as de prueba para demostradores de teoremas.
Su nombre proviene de metalenguaje. ML permite introdu
ir efe
tos
olaterales, lo
que lo ha
e un lenguaje fun
ional impuro, por lo que se
onsidera un lenguaje fun
ional
on
ara
tersti
as imperativas.
ML utiliza orden de evalua
in ansiosa (eager), en parti
ular la estrategia denominada
all by value y tiene al
an
e (s
ope) estti
o. A
tualmente existen varios derivados
de ML,
omo Standard ML (SML) y O
aml.
A
ontinua
in se muestran algunos ejemplos en O
aml.
8 La
let sum a b =
let s = a + b in
Print.printf "Sum=%d\n" s ;;
let re fa torial n =
La fun
in fa
torial muestra que es posible disparar ex
ep
iones (los
uales son
valores de un tipo espe
o) y re
ono
imiento de patrones (pattern mat
hing).
La deni
in de fun
iones re
ursivas deben denotarse expl
itamente por las reglas
de al
an
e (s
ope) del lenguaje. Si se omitiese, la invo
a
in de fa
torial en el
uerpo
de su deni
in tratara de resolver a un smbolo denido previamente, mas que el
smbolo que se est deniendo. fa
torial.
Los tipos bsi
os de O
aml son: int, bool,
har, string, unit.
tuplas:
type introdu e
1in
son valores.
(v1 ,...,vn ),
donde
vi ,
registros (re
ords): son
omo las tuplas, pero
on sus elementos rotulados. Son
equivalentes a las estru
turas (stru
t) de C o registros de Pas
al.
Ejemplo:
Leaf 1
Tree (Leaf 3, Leaf 4)
Tree (Tree (Leaf 3, Leaf 4), Leaf 5)
[1;2;3
[
(lista va
a)
1 :: [2;3
1 :: 2 :: 3 :: [
El operador :: (
ons)
onstruye una lista tomando
omo su primer argumento la
abeza (head) y su segundo argumento el resto o
ola (la
ual es una lista).
Las nota
iones de listas usando
or
hetes son un ejemplo de synta
ti
sugar.
Las listas son un ejemplo de un tipo de datos parametrizado.
59
1 :: Nil resulta
en
length (longitud
[1.
de una lista)
:=
!v. El operador
array
[|e0 ; . . . ; en |]
El siguiente ejemplo muestra el uso de arreglos
on una senten
ia de
ontrol for.
array es un
mutable.
mutable. Por ejemplo,
el tipo ref
3.6.2. Haskell
Haskell es un lenguaje fun
ional puro,
on evalua
in lazy, alto orden y pattern
mat
hing. Tiene un avanzado sistema de tipos que permite polimorsmo paramtri
o
y sobre
arga de
onstru
tores de
lases.
De igual forma que ML, Haskell es un lenguaje basado en expresiones,
uya evalua
in arroja valores, de un determinado tipo,
omo resultado. Los tipos de datos bsi
os
son
Los tipos bsi
os no dieren de los tipos denibles por el programador, ya que es
posible denirlos en Haskell, pero el lenguaje usa nota
iones
onvenientes para esos
valores. Por ejemplo, el tipo
Char
Hola uando en
['h','o','l','a').
denirse omo
qui
ksort [
= [
qui
ksort (x:xs)= qui
ksort [y | y <- xs, y<x
++ [x ++
qui
ksort [y | y <- xs, y<=x
El operador
operador
++
es la on atena in de listas.
La nota in
as. Ejemplos:
add x y = x + y
add :: Integer ->Integer ->Integer.
in
= add 1 tiene tipo in
:: Integer ->Integer, o sea que su valor
in 4
retorna
5.
Si se desea des
urri
ar uan fun
in se pueden agrupar los argumentos en una
tupla. Por ejemplo,
add (x,y) = x + y
in
= \x -> x + 1
Los operadores injos se pueden denir por medio de e
ua
iones
omo
ualquier
otra fun
in. Por ejemplo, el operador de
on
atena
in de listas est denido
omo
++
se dene
infixr 5 ++
Los operadores injos aso
iativos a izquierda se denen
on
iativos
on
infix.
infixl
y los no aso-
3.6.2.1. Tipos
En Haskell se dene un nuevo tipo mediante la palabra reservada
data Pair a = Pr a a
data BinTree a = Leaf a | Bran
h (Tree a) (Tree a)
Es posible denir sinnimos (alias) de tipos, usando
type
type
type
type
data.
String = [Char
Name = String
Address = String
Person = (Name,Address)
62
type.
(_) (tambin llamados
omodines o wild
ards),
uando una determinada parte de un
patrn no se ne
esita en la parte dere
ha de la e
ua
in.
head (x:_) = x
tail (_:xs)= xs
Existen patrones irrefutables,
omo por ejemplo, las variables y otros patrones re-
futables.
El algoritmo utilizado de
ompara
in de patrones (pattern mat
hing) puede tener
xito, puede fallar o puede divergir.
Cuando la
ompara
in de dos patrones tiene xito (uni
an) se produ
en ligaduras
(bindings) entre variables y valores. Dos patrones pueden no uni
ar,
omo por ejemplo
[1,_,[2,x, ya que
[1,2 on [bot,0.9
sign x | x > 0 = 1
sign x | x == 0 = 0
sign x | x < 0 = -1
En Haskell los patrones se pro
esan de arriba ha
ia abajo y de dere
ha a izquierda.
Las expresiones
presin
ase tiene
ase permiten
la forma
if then e1 else e2
es equivalente
ase (
) of
True -> e1
Else -> e2
bot = bot
no termina. Esto quiere de
ir que si se dene una fun
in
onstante de la forma
uno x = 1
la apli
a
in de
uno bot
uno
no usa su argumento y
ones = 1 : ones
from n = n : from (n+1)
squares = map (^2) (from 0)
Como desventaja de la evalua
in lazy se puede men
ionar el
onsumo de memoria adi
ional requerido, ya que es ne
esario mantener estru
turas de datos an no
evaluadas (redu
idas) en memoria.
3.6.2.4. Ambientes
A menudo es deseable generar un mbito lo
al en una expresin o deni
in. Esto
permite ha
er deni
iones que o
ultan detalles de implementa
in.
Las expresiones
let
Por ejemplo:
let y = a * b
f x = (x+y)/y
in f
+ f d
La
lusula
64
f x y | y > z = ...
| y <= z = ...
where z = x * x
Expresiones lambda (abstra
iones):
\x -> E
donde
x.E
Eq
igualdad y desigaldad para que pueda ser instan iada por un onjunto de tipos on retos.
lass Eq a where
(==), (/=) :: a -> a -> Bool
x == y = not (x /= y)
x /= y = not (x == y)
Las deni
iones de las opera
iones
sin (default).
En la deni
in de tipos de datos
on
retos, las opera
in de igualdad podr ser
una instan
ia de la
lase
Eq:
integerEq
floatEq
/=
Eq.
Ord
deriva de
Eq.
65
Cabe a
larar que las
lases de Haskell no son equivalentes al
on
epto de
lase de
la programa
in orientada a objetos. A
ontinua
in se des
riben algunas diferen
ias:
Haskell separa la deni
in de un tipo de la deni
in de los mtodos aso
iados
a di
ho tipo.
Los mtodos de Haskell se
orresponden
on las fun
iones virtuales de C++.
Las
lases de Haskell son similares a las interfa
es de Java, es de
ir que denen
un proto
olo para el uso de objetos en lugar de un objeto en s.
11
rollDie se representa
omo un par: el valor generado y una fun
in de genera
in del
prximo valor. Habra que redenir la fun
in:
s es
s ->(a,s),
Con esto es posible denir una fun
in que, por ejemplo, obtenga un estado
on la
suma de los valores de dos lanzamientos del dado:
lanzamientos de un dado:
>>
los estados intermedios. Para poder denir algunas fun
iones interesantes,
omo por
ejemplo, sumar los valores apare
idos en
ada lanzamiento del dado, es ne
esario otra
fun
in an ms general:
>>=
en la
para la obten in del prximo estado. Por esta ligadura, este operador se
>>=
67
operadores bind
y return :
Deni
in 3.6.1
M
Una
return :: a > M a,
m >>= return = m
2.
returnx >>= f = f x
3.
El operador
>>=
una mnada.
Las mnadas son un resultado de la teora de
ategoras. En 1991, Eugenio Moggi
las utiliz para des
ribir la semnti
a de diferentes tipos de
omputa
iones. Dependiendo de la mnada se puede modelar estado, no determinismo (ba
ktra
king) usando
M a = Either a a).
listas o ex ep iones (
Monad
forma:
68
lass Monad m
(>>=) ::
(>>) ::
return ::
fail ::
where
m a ->
m a ->
m a ->
String
(a -> m b) -> m b
m b -> m b
a
-> m a
formador de estados (fun
in) para algn tipo ( ) de resultado. Intuitivamente, esta
mnada representa una fun
in que dado un estado y un valor, retorna un par
ompuesto
on otro estado y otro valor.
La idea del transformador de estados es poder arrastrar un estado y una fun
in,
la
ual permitir obtener el prximo estado a partir del estado a
tual.
Haskell introdu
e una abstra
in lingusti
a que es muy
onveniente para la
laridad de los programas y que evita el uso expl
ito del operador
do
>>=:
signi a
do
>>=
nmeros aleatorios).
Intuitivamente, la fun
in
ta
in (fun
in)
m b
m b.
69
while x != y do
if x < y then
y := y - x;
else
x := x - y;
return x
Para poder es
ribir el algoritmo en Haskell simulando estado, es ne
esario primero,
denir el tipo que representar el estado y fun
iones para a
eder y modi
ar sus
omponentes.
getX
getY
del pro-
(fun
in) que dado un estado generan un nuevo estado
on los valores de
ada
omponente requerida. Las opera
iones
que retorna el valor
().
setX
setY
do putX (x-y)
g
d
getChar :: IO Char
el tipo IO Char indi
a que
uando getChar sea evaluada, realizar una a
in de
tipo IO, el
ual es una mnada,
on valores de tipo
ar
ter. Las a
iones que no devuelven nada til pueden retornar el tipo () (similar al tipo void del lenguaje C o
C++),
omo por ejemplo la fun
in putChar :: IO ().
Es pre
iso notar que la fun
in
es una fun in de alto orden, ya que retorna una estru tura de tipo
un par (valor,fun
in) que
ontiene el valor produ
ido en ese estado y un transformador
(fun
in) de estados. La apli
a
in de di
ho transformador al estado a
tual generar
otro par (valor,fun
in). De esta forma es posible seguir apli
ando otras fun
iones de
entrada-salida al estado retornado.
Un programa Haskell en s debe
omuni
arse
on el mundo exterior, as que en
realidad la fun
in
En general la mnada
e
ho = do
<- getChar
putChar
La variable
La fun in
getChar
getChar y putChar.
return
y el operador
do
ombina se-
return :: a ->IO a
return es posible denir
Con el operador
getLine :: IO String
getLine :: do
<- getChar
if
== '\n' then return ""
else do l <- getLine
return (
:l)
getLine retorna una a
in de entrada-salida (mnada)
on valores de
String y simula la siguiente itera
in en un lenguaje imperativo
omo C:
La fun
in
tipo
71
har * getLine()
{
har
, *l = mallo
(sizeof(
har)*MAX_LINE_LENGTH);
int i = 0;
memset(l,MAX_LINE_LENGTH,0);
while ((
= get
h()) != '\n')
l[i++ =
;
return l;
}
As
omo se han des
ripto ejemplos de mnadas para manipular o simular estado,
sus apli
a
iones so mltiples y es posible enumerar:
Estado.
Entrada salida (mnada IO).
Contenedores. Ejemplos: listas, grafos, . . . .
Computa
iones que podran fallar: ex
ep
iones y bsquedas en
ontenedores
Maybe).
return x=[x
on
at (map f l).
l >>= f
es equivalente a
retorna la lista
se en-
uentra la versin en
astellano del tutorial A Gentle Introdu
tion to Haskell el
ual
des
ribe todos los detalles del lenguaje.
P LU S
a 1 y 2.
if
ondi in
e1 else e2 .
3. Denir la fun
in SUB la
ual
ompute la diferen
ia entre dos naturales. Ayuda:
usar PRED.
4. Dada la fun
in
N IL x.T RU E
N U LL
(retorna
72
T RU E
si su argumento es
N IL).
b ) Denir la lista
[1, 2, 3].
(x.x x)((x.x)y):
SKI.
15. Imprimir pos la salida estndar la lista de valores retornadas por la fun
in
anterior.
16. Proponer
ambios en la sintaxis y semnti
a del lenguaje kernel para
onvertirlo
en un lenguaje fun
ional puro.
73
Captulo 4
ref
(id, ref )
donde
id es
su identi ador
Es posible modi ar la referen ia de una elda, por eso se di e que las eldas son
74
mutables.
Una
elda representa una referen
ia o puntero en un lenguaje de programa
in
imperativa
omo Pas
al, C, C++ o Java.
En estos lenguajes una variable es mutable, es de
ir puede ser modi
ada. Una variable puede ser de un tipo bsi
o (entero,
ara
ter, real, . . . ), estru
turados (arreglos,
registros, et
) o una referen
ia a un valor.
Las variables de los lenguajes men
ionados arriba generalmente son mutables (ex
epto las
onstantes) y
on un al
an
e y tiempo de vida dependiente del
ontexto
(bloque) de su de
lara
in.
Las referen
ias, en estos lenguajes, son variables (tipadas)
uyos valores son dire
iones de memoria (de la
elda que
ontiene el valor). En algunos lenguajes (
omo
Java) sus valores referen
iados se deben
rear dinmi
amente mediante operadores espe
iales (ej: new ).
Una diferen
ia entre las referen
ias de C++ y Java es que en C++ son inmutables
y deben estar ini
ializadas, es de
ir no se pueden ha
er apuntar a otra
elda (o a null ),
por lo que en C++ son realmente alias de de otras variables.
De esta manera es posible denir una referen
ia
omo una abstra
in de un puntero, en el sentido que un puntero puede verse
omo un valor
uando una referen
ia
es un tipo abstra
to de datos (TAD) que en
apsula y o
ulta un puntero, el
ual slo
puede manipulado por sus opera
iones (asigna
in, referen
ia
in y desreferen
ia
in).
En general ambos tipos de datos son tipos de datos parametrizados sobre el tipo
de valores al que ha
en referen
ia.
Existen lenguajes,
omo Pas
al y C++ que
ontiene ambos tipos de datos: referen
ias y punteros. Otros,
omo Java slo tienen referen
ias.
75
{NewCell X C}:
es
X.
C.
Antes de poder denir la semnti
a de las nuevas opera
iones es ne
esario ampliar
el modelo de la mquina abstra
ta. Es ne
esario una nueva memoria, denominada
x : y , donde el
y puede ser
ualquier valor par ial. El identi ador interno juega el rol de dire in de memoria
(ST, , ).
A
ontinua
in se des
ribe la semnti
a de las opera
iones sobre
eldas, des
ribiendo el
omportamiento de la mquina
on
ada estado de eje
u
in involu
rando
las opera
iones bsi
as sobre
eldas.
bind(E(< y >), n)
en
para la elda.
.
4. Si la ligadura fall, generar un error.
E(< x >)
es determinado, ha er:
a ) Si
b)
76
Suspended.
Ex hange y
C
C:=X
se pueden denir
Las implementa
iones
ara
tersti
as de los lenguajes imperativos slo mantienen
la representa
in de la memoria
(id, ref )
si el lenguaje es interpretado.
En el
aso de un lenguaje
ompilado, los identi
adores se reemplazan
on la dire
in de memoria del valor referen
iado y un puntero o referen
ia es un valor que
ontiene una dire
in de memoria (la del valor referen
iado o una dire
in espe
ial
usada para denotar que no se ha
e referen
ia a algn valor en parti
ular,
omo el valor
null de Java).
En un programa
ompilado generalmente la memoria
valores de los tipos de datos denidos en el programa, es de
ir que los identi
adores
estn impl
itamente aso
iados a las dire
iones de memoria en que se alma
enarn
sus valores.
La in
lusin en la mquina abstra
ta de la memoria mutable
requiere que se
redenan los
on
eptos de al
anzabilidad y del re
lamo de
eldas para el re
ole
tor de
basura.
Deni in 4.1.1
Una variable
Si la variable x no es al
anzable
y) es posible eliminarlo
on seguridad.
Deni
in 4.1.2
ualquier
ontiene el par
x:y
(para
4.2. Aliasing
Dos variables son alias (sinnimos) si se reeren a la misma entidad (
elda).
Es obvio que en el modelo
on estado expl
ito es muy
omn que se produz
a
aliasing. El problema del aliasing es que
ompli
a el razonamiento sobre los programas,
ya que el
ambio a una variable puede afe
tar a la otra (alias) ya que denotan la misma
entidad.
En programas grandes es dif
il para el programador llevar la pista de las variables
que pueden ser alias en alguna instan
ia de eje
u
in.
Este es el prin
ipal motivo del porqu la abstra
iones de datos son ade
uadas en
el modelo
on estado expl
ito.
La idea bsi
a de la abstra
in de datos es el en
apsulamiento del estado, esto es,
el o
ultamiento del estado dentro de
omponentes. El estado slo puede ser modi
ado
a travs de sus opera
iones. Estas son las ideas bsi
as de los tipos abstra
tos de datos
(ADTs) y su objetivo es minimizar los efe
tos
olaterales de las opera
iones, ya que
ada valor slo se puede manipular por medio de sus opera
iones
orrespondientes.
77
4.3. Igualdad
En el modelo de
larativo se vio que la la igualdad requerida es la estru
tural ya
que tiene sentido que dos valores son iguales si poseen la misma representa
in.
En el modelo imperativo podemos tener el siguiente
aso:
X=\{NewCell 10}
Y=\{NewCell 10}
La
ompara
in
(entailment he k).
En
apsulamiento: debera ser posible o
ultar los detalles internos de
ada parte
(information hidding).
Composi
ionalidad: se deberan poder
ombinar las partes para formar otras.
Instan
ia
in/invo
a
in: debera ser posible
rear varias instan
ias a partir
de una misma deni
in. Este me
anismo permite la reutiliza
in de partes.
78
dimientos y sus instan ias son las invo a iones o llamados a pro edimientos.
parada. Sus deni iones son fun tores y sus instan ias mdulos.
Componentes on urrentes: un sistema on entidades independientes, intera tuando entre s por medio de mensajes.
1 Es bien
ono
ido la apli
a
in de la lgi
a de Hoare para razonar sobre programas
on estado
expl
ito.
79
Los sistemas basados en
omponentes se
onstruyen prin
ipalmente en base a
omposi
in: un nuevo
omponente
ombina instan
ias de otros.
La programa
in orientada a objetos provee me
anismos para la deni
in y uso de
omponentes,
on un me
anismo adi
ional para la deni
in de nuevos
omponentes:
la heren
ia.
La heren
ia permite denir un nuevo
omponente mediante la extensin de otros.
Estas extensiones pueden ser espe
ializa
iones, alternativas de implementa
in, entre
otras. Este me
anismo permite otra dimensin adi
ional para la deni
in in
remental
y jerrqui
a de
omponentes.
Se analizarn los detalles de la programa
in orientada a objetos en el
aptulo 7.
Por
opia
por valor
por valor-resultado
mos anteriores.
Denota
ionales
80
del parmetro a
tual. El parmetro puede usarse libremente. Este es el me
anismo usado por el lenguaje kernel utilizado.
Algunos lenguajes imperativos usan una pequea variante de este mtodo,
pasando la identidad (ej: dire
in de memoria) del parmetro a
tual. El
parmetro formal se a
ede (indire
tamente) usando esa identidad. En la
pr
ti
a, se a
ede al valor del parmetro usando dire
ionamiento indire
to.
Este me
anismo se
ono
e
omo pasaje variable o por dire
in.
por nombre:
del me
anismo anterior, donde la expresin (o fun
in) se evala una sola
vez. Las prximas referen
ias al parmetro formal retornarn el resultado
que se re
uerda.
a ) X = C := Y
b ) C := X
) X = C
2. Implementar la fun
in
Reverse L,
zando estado.
3. Implementar en el lenguaje kernel
on estado el tipo de datos Sta
k. Es
ribir un
ejemplo de su uso.
4. Determinar el tipo de pasaje de parmetros que usan los siguientes lenguajes:
a ) Pas
al
b) C
) C++
d ) Java
e ) Haskell
5. Dar esquemas en el lenguaje kernel
on estado para simular
ada uno de los
me
anismos de pasajes de parmetros des
riptos.
81
Captulo 5
Lenguajes de programa
in
imperativos
En este
aptulo se analizan algunos
on
eptos
omunes a varios lenguajes imperativos, en parti
ular senten
ias
omunes de
ontrol y tipos de datos generalmente
utilizados.
En la se
in 5.4 se ha
e una des
rip
in general del lenguaje C, el
ual es un punto
de partida para el estudio de varios lenguajes derivados
omo C++, Obje
tive C, Java
y C#.
Los lenguajes de programa
in imperativos generalmente tienen
onstru
iones sint
ti
as para realizar de
lara
iones (y parti
ularmente deni
iones) de entidades,
omo
variables,
onstantes, tipos de datos y pro
edimientos y fun
iones. Los lenguajes mo-
1 , on-
tienen senten
ias de
ontrol y
omputa
iones (asigna
in) y generalmente proveen
operadores bsi
os y me
anismos para
onstruir expresiones.
Generalmente los me
anismos de abstra
in que proveen son la abstra
in pro
edural y fun
ional y las deni
iones de nuevos tipos de datos.
1 La programa
in estru
turada se basa en el uso de senten
ias de
ontrol de ujo
on una semnti
a
bien denida y la prohibi
in del uso de
ontrol de ujo basado en instru
iones de saltos (goto).
82
begin s0 ; s1 ; . . . sn end
las uales
se eje utar en se uen ia. Los delimitadores de bloque mas usados son los pares
83
Sele in: senten ias de la forma if < ond>then <s1>else <s2>end y sus variantes ( lusulas
if
anidadas.
Estas senten
ias permiten implementar una espe
ie de tablas de despa
ho para diferentes grupos (bloques) de senten
ias. Mu
hos lenguajes requieren que
los valores de
ada
aso sea una
onstante, aunque algunos permiten que sean
expresiones evaluables en tiempo de eje
u
in.
Se uen iadores:
saltos (ej:
goto label)
label
puede ser una expresin la
ual deber ser evaluada dinmi
amente. Estos ltimos tipos de saltos se en
uentran en Fortran, algunas versiones de BASIC y
omo extensin al lenguaje C en el
ompilador C de GNU (g
).
Las senten
ias de salto generalmente restringen el destino a la abstra
in pro
edural que las
ontienen, lo
ual prohibe que se generen saltos intrapro
edurales.
Los saltos, aunque generalmente son senten
ias prohibidas en la programa
in
estru
turada, son tiles en
iertos
asos
uando se apli
a programa
in defensiva (
hequeos de argumentos y veri
a
iones de
ondi
iones esperables) lo
ual
produ
ira
digo dif
il de leer (por los mltiples anidamientos de
hequeos y
posiblemente repeti
in de
digo) y po
o e
iente.
Es
omn en
ontrar el uso del
tware de base.
re
upera
in de errores.
Estas t
ni
as
aen en desuso si el lenguaje provee ex
ep
iones.
2 En
el lenguaje C (y mu
hos de sus derivados), el
omando for puede tomar la forma de un while.
84
Algunos lenguajes,
omo por ejemplo C y sus derivados, proveen senten
ias de
saltos estru
turados, generalmente
ono
idos
omo es
apes. Ejemplos de este tipo
break
return en
varios lenguajes
omo C, Fortran, et .
5.3. Ex
ep
iones
Las ex
ep
iones son senten
ias estru
turadas para atrapar (
ontrolar el ujo de
eje
u
in) en la o
urren
ia de situa
iones ex
ep
ionales,
omo ex
ep
iones generadas
por el hardware (ej: divisin por
ero, o error de es
ritura en un ar
hivo) o por software
(ej: por in
umplimiento de una
ondi
in esperada o por el ven
imiento de una alarma
o timer).
Una forma muy
omn de las ex
ep
iones en mu
hos lenguajes de programa
in
modernos es la siguiente:
try
<bloque>
hi,
on
Ti,
1 i n.
nally <hd>.
Las ex
ep
iones permiten una mejor estru
tura
in del
digo en la programa
in
defensiva, lo
ual permite que el
digo sea mas legible sin perder e
ien
ia en la eje
u
in.
Si se produ
e una ex
ep
in durante la eje
u
in de un bloque que no atrapa la
ex
ep
in, su eje
u
in se interrumpe y se retorna a su invo
ante, para luego repetirse
el pro
eso. Esto se
ono
e
omo propaga
in de la ex
ep
in.
Como se puede apre
iar, la propaga
in de una ex
ep
in sigue la
adena dinmi
a
de invo
a
iones.
Si la propaga
in de una ex
ep
in al
anza al bloque ini
ial del programa, la ex
ep
in es atrapada por el manejador por omisin generado automti
amente por el
intrprete o
ompilador, el
ual generalmente, imprime un mensaje
orrespondiente a
la ex
ep
in o
urrida y luego naliza el pro
eso.
85
Es un lenguaje que tiene
ara
tersti
as de bajo y alto nivel, por lo que se
onsidera
un lenguaje de nivel intermedio. El lenguaje C ha sido ampliamente utilizado para el
desarrollo de software de base
omo sistemas operativos,
ompiladores e intrpretes de
lenguajes de programa
in, y mu
hsimos utilitarios.
Generalmente es la base de mu
hos sistemas de
omputa
in,
omo por ejemplo en
los sistemas tipo UNIX.
El nombre del lenguaje viene del he
ho que Rit
hie lo desarroll
omo una extensin
al lenguaje B.
AT&T desarroll UNIX es
rito
asi
ompletamente en C. Era la primera vez que se
un sistema operativo se es
riba en un lenguaje de programa
in de alto nivel. Hasta
enton
es, los sistemas operativos se es
riban en assembly. La posibilidad de
ontar
on
un sistema operativo es
rito en un lenguaje de alto nivel, tena grandes ventajas ya que
fa
ilitaba su
omprensin, mantenibilidad y portabilidad a diferentes arquite
turas.
En los
omienzos de los 80 se form el
omit para la estandariza
in del lenguaje C,
el
ual se publi
el Standard ANSI C en 1989, el
ual in
luye los
ontenidos mnimos
de su bibliote
a estndar.
En 1990 la International Organization for Standarization, publi
el estndar ISO
9899-1990, el
ual es pr
ti
amente un dupli
ado del ANSI 89.
C ha inuen
iado a mu
hos lenguajes de programa
in desarrollados posteriormente, los
uales lo extienden in
luyendo
on
eptos de programa
in orientada a objetos
(POO) y en algunos
asos eliminando algunas
ara
tersti
as no deseadas. Estos lenguajes se
ono
en
omo derivados de C y podemos men
ionar Obje
tive C, C++, Java,
C# y otros.
: f loat f loat
3 La
result =
ir
le_area(10.0);
printf("Area:%f\n",result);
return 0;
/* return pro
ess exit
ode */
4 ompatibles. El valor
retornado por main es tomado por el sistema
omo el
digo de naliza
in del pro
eso
(el
ual puede ser
onsultado por el pro
eso que lo
re).
La palabra void en el argumento de la fun
in main indi
a que la fun
in no tiene
argumentos. La palabra void usada
omo tipo de retorno en una fun
in signi
a que
no retorna valor alguno (es un pro
edimiento ).
Como se puede apre
iar en la gura 5.1, una fun
in tiene aso
iada una senten
ia
de bloque delimitada por llaves ({,} ).
Dentro de un bloque es posible realizar de
lara
iones (de variables,
onstantes, et
)
y a
ontinua
in se denen las a
iones (senten
ias) a eje
utar en el bloque.
Cada senten
ia debe nalizar
on un punto y
oma (;).
La dire
tiva del prepro
esador in
lude utilizada in
luye el ar
hivo de
abe
era
stdio.h, el
ual es provista por
ualquier
ompilador ANSI C,
ontiene las de
lara
iones
ne
esarias para realizar entrada-salida.
La fun
in printf permite imprimir (
on formato) valores por la salida estndar.
Mas adelante se entrar en mayor detalles
on respe
to a la entrada-salida en C.
El lenguaje C no
ontiene primitivas de entrada-salida. Todas las opera
iones de
entrada-salida se realizan por medio de fun
iones de bibliote
a.
4 Estndar que dene una interfa
e (system
alls) de un sistema operativo. Esta interfa
e est
denida en C
87
5.6. El
ompilador C
El
onjunto de herramientas en un entorno de desarrollo C bsi
amente
ontiene:
1. el pre-pro
esador: toma las dire
tivas en el ar
hivo fuente y las reemplaza por
su evalua
in (o expansin). Por ejemplo, en el programa de la gura 5.1
ada
referen
ia a PI es reemplazada (expandida) a 3.141516.
2. el
ompilador C: genera un ar
hivo
on
digo assembly a partir de un ar
hivo
fuente C.
3. el assembler : genera un ar
hivo objeto a partir de un ar
hivo fuente en lenguaje
make
dirige el
g
example1.
Esto generar (en
aso que no existan errores en el programa) un programa (ar
hivo
eje
utable) a.out, el
ual se podr eje
utar introdu
iendo el
omando
5 La funda
in GNU tiene
omo objetivo el desarrollo de un sistema operativo y apli
a
iones libres,
es de
ir sin restri
iones en las li
en
ias sobre su uso (http://www.gnu.org/).
88
./a.out
lo que indi
ar al shell que eje
ute el programa a.out que se en
uentra en el dire
torio
orriente (./).
La op
in del
ompilador (ag) -o <lename> permite que el programa de salida
tome otro nombre que a.out. El siguiente ejemplo muestra la
ompila
in del programa
anterior que genere el eje
utable
on el nombre de programa example1
g
example1.
-o example1
Si se en
uentra en la plataforma MS-WINDOWS el programa de salida deber tener
extensin .exe.
En los sistemas tipo UNIX (ej: GNU/Linux) se puede obtener mas informa
in
sobre las op
iones del
ompilador mediante el
omando
man g
(man es la abreviatura de manual ).
Dire tiva
Des rip in
#dene def
#ifdef symbol
b1
#else
b2
#endif
Expande
b1
b2
en otro aso.
En la dire tiva
#define
...
#define MAX_SIZE 1024
89
...
#define max(A,B) ((A>B)?A:B)
...
int x,y,z;
float delta,f,g;
...
x = max(y,z);
/* x = ((y>z)?y:z) */
delta = max(f,g) /* delta = ((f>g)?f:g) */
...
Cabe ha
er notar que una ma
ro no es equivalente a una fun
in. Una fun
in
es tipada (tipo de su resultado y sus argumentos), mientras que una ma
ro no. A
menudo los programadores C utilizan ma
ros para denir expresiones las
uales sern
utilizadas sobre diferentes tipos de datos, lo
ual permite implementar una forma de
polimorsmo paramtri
o ad-ho
(basado en sustitu
in textual).
Des rip in
har
int
short int
entero orto
long int
entero largo
oat
double
El lenguaje C es un lenguaje estti
amente tipado, es de
ir que se realiza el
hequeo de los tipos de los valores involu
rados en
ualquier opera
in en tiempo de
ompila
in.
C ofre
e un
onjunto de tipos de datos bsi
os que se muestran en la tabla 5.3. Mas
adelante ver el tipo de datos puntero, el
ual tambin es un tipo bsi
o, pero al que
se dedi
ar una se
in espe
a.
Adems de los nombres de los tipos bsi os men ionados, stos pueden ser pre edidos por la palabra reservada
negativos.
Cabe ha
er notar que el tipo
har en C es
onsiderado un tipo numri
o (generalmente se representa en un byte) y sus valores generalmente se
orresponden a algn
digo de
ara
teres estndar (ej: ASCII).
90
tipo (ej: int,
har, . . . ) . Se puede dar un valor ini
ial a una variable.
A modo de ejemplo, las siguientes de
lara
iones denen dos variables de tipo entero,
una de tipo
har y otra de tipo oat.
int x,y;
har
;
float f = 3.14;
Se debe notar que slo la variable f est ini
ializada.
onst.
Ejemplo:
enumera
iones las
uales son
onstantes simbli
as (de tipo entero).
6 La nota
in <x>denota que x es una
ategora sint
ti
a (los smbolos menor y mayor no deben
es
ribirse). Lo que apare
en entre
or
hetes, signi
a que es op
ional.
91
Ej:
enum dia_sem = {
La de
lara
in anterior dene un nuevo tipo de dato, aunque C toma sus valores
omo enteros. Las
onstantes simbli
as de una enumera
in toman valores por omisin
(default)
omenzando desde
ero (0). Es posible denir el valor de
ada
onstante o
dar el valor de la primera y as las dems toman valores subsiguientes.
Ej:
enum dia_sem = {
Las deni
iones de estru
turas pueden introdu
ir nuevos nombres de tipos. A modo
de ejemplo, la siguiente de
lara
in
stru
t person {
int id;
har name[31;
unsigned short age;
};
dene el tipo
stru t Person.
La senten ia
A modo de ejemplo,
un sinnimo o
donde
f es
return expression
f().
Cuando se al
anza el nal del bloque que
onstituye el
uerpo de una fun
in se
eje
uta un
7 Los
smbolos person y Person son diferentes, ya que C distingue mays
ulas de mins
ulas.
92
Las fun
iones pueden tener un nmero variable de argumentos, los
uales se denotan
on . . . (tres puntos seguidos). Esto permite denir fun
iones
omo por ejemplo
printf,
uyo perl es
al bloque, es de
ir que fuera del bloque las entidades de
laradas no pueden ser referen
iadas.
El ejemplo 5.4 muestra de
lara
iones lo
ales y globales en un programa. La variable g es global, es de
ir que puede referen
iarse en
ualquier parte del programa. La
variable lo
al
y el parmetro formal p son lo
ales en la fun
in f. La variable x es
slo visible dentro del bloque mas interno.
Esta separa
in de mbitos o ambientes es de gran ayuda para modularizar programas, permitiendo que slo se de
laren variables en los mbitos donde son ne
esarios,
sin permitir el a
eso en mbitos que no deberan
ono
er de su existen
ia.
Las de
lara
iones globales (variables,
onstantes y fun
iones) pueden ser usadas en
un mdulo externo (
liente) mediante de
lara
iones extern.
Una de
lara
in externa ha
e referen
ia a una entidad que ha sido denida en otro
mdulo. Ejemplo:
Una de
lara
in global que se quiera ha
er visible slo en el mdulo
orriente (ar
hivo fuente), deber ser pre
edida por stati
.
Las de
lara
iones de tipos no se pueden ha
er externas, es de
ir que en un ar
hivo
que se quiera referen
iar a un tipo de dato, se deber in
luir su deni
in, ya sea
93
int g;
/* variable global */
int f(float p)
{
har
;
...
{
int x;
}
g++;
x = 1;
/* x es lo
al a este bloque */
/* aqu pueden referen
iarse todas las variables */
/* ERROR, x no existe en este ambito */
94
para las variables lo
ales y parmetros formales
omo una estru
tura de pila (sta
k ) .
Cuando una fun
in es invo
ada, se
rea (reserva) en la memoria (tope de la pila)
un registro de a
tiva
in, el
ual
ontiene su
iente espa
io para
ontener los valores
del bloque prin ipal de la fun in), el registro se destruye por lo que las variables lo ales y los parmetros formales desapare en.
apare
iendo en la de
lara
in permanez
an vivas luego del retorno de la fun
in.
De todos modos di
has entidades no pueden ser referen
iadas fuera de su bloque
orrespondiente, es de
ir que su al
an
e no es modi
ado, pero sus valores permane
en
en la memoria para poder reutilizarse en la prxima a
tiva
in de ese bloque.
Estas variables generalmente no se alma enan en la pila (sta k), sino que se reserva espa io en el rea de memoria estti a en donde se alma enan las entidades globales.
5.17. Operadores
Los denominados operadores de un lenguaje de programa
in son la base de la
forma
in de las expresiones. Entre ellos generalmente en
ontramos operadores aritmti
os, rela
ionales, lgi
os, et
.
Un operador puede estar denido
omo injo (ej:
( ej:
x < y ),
prejo (ej:
x)
o sujo
x + +).
8 Una estru
tura de pila tiene una polti
a LIFO (Last In First Out, el ltimo en entrar es el
primero en salir).
9 Adems el mismo registro de a
tiva
in puede usarse para alma
enar valores temporarios durante
la evalua
in de alguna expresin.
95
Aritmti os
Des rip in
Manipuladores de bits
Des rip in
<<
>>
&
Rela ionales
Des rip in
==
igual (injo)
!=
distinto (injo)
<
menor (injo)
>
mayor (injo)
<=
>=
Lgi os
Des rip in
||
or (injo)
&&
or (injo)
not (prejo)
5.17.1. Asigna
in
C es un lenguaje
on un
onjunto de senten
ias de asigna
in muy ri
o, a diferen
ia
de otros lenguajes que slo
ontienen unas po
as o una ni
a senten
ia de asigna
in.
En el modelo de la programa
in imperativa la asigna
in es generalmente la ni
a
senten
ia que reamente produ
e una
omputa
in efe
tiva, ya que es la ni
a senten
ia
que realiza un
ambio de estado durante la eje
u
in de un programa.
Otro
aso en donde se produ
e un
ambio de estado es en el pasaje de parmetros,
lo que se ver mas adelante.
96
Operador
Des rip in
asigna in (ej: x = y + 1)
+=
-=
(ej: x -= y es equivalente a x = x - y)
*=
(ej: x *= y es equivalente a x = x * y)
/=
(ej: x *= y es equivalente a x = x / y)
%=
(ej: x %= y es equivalente a x = x % y)
x++
x
pos-de remento
++x
x
pre-de remento
x = ( y > 0 )? y+1 : z;
10 .
Las senten
ias de
ontrol
ontrol de ujo, generalmente se
lasi
an en senten
ias
se
uen
iales,
ondi
ionales, iterativas y otras.
10 Aunque
C mantiene el omando
goto L;
5.18.1. Se
uen
ia
La senten
ia que estable
e que sus
omponentes deben eje
utarse en se
uen
ia es
la senten
ia de bloque que ya se ha visto
on anterioridad.
Tanto las de
lara
iones
omo los
omandos que deben ir a
ontinua
in se eje
utan
en forma se
uen
ial de arriba ha
ia abajo.
Existen senten
ias las
uales pueden
ontener otras senten
ias. Generalmente, las
reglas sint
ti
as son que
ontienen una senten
ia (la
ual puede ser un bloque).
if
y la senten ia
swit h. La
primera permite eje
utar senten
ias en base al valor de verdad de una
ondi
in dada
(expresin booleana), mientras que la segunda permite eje
utar diferentes senten
ias
dados diferentes
asos determinados por el valor de una expresin.
El esquema sint
ti
o de la senten
ia
if
es la siguiente:
if ( x == y ){
x = y * z;
...
}
else
x = y;
El esquema sint
ti
o de la senten
ia
swit h es la siguiente:
donde la
lusula default es op
ional y los valores valor1, valor2, . . . , deben ser
onstantes de tipo entero.
Si en
ada
aso se omite la senten
ia
break,
swit
h ( x-y ) {
ase 5: x = y - 1;
break;
ase 8: y = z;
break;
}
for.
for:
for
es: se eje uta la ini ializa in, luego se veri a la ondi in,
for de C en una de las mas ompli adas de des ribir ya que tanto en
for omo se en uentran en otros lenguajes, omo por ejemplo, Pas al.
Ejemplo:
do {
<senten
ia>
} while ( <
ondi
ion> );
La primera (
La segunda
while ( x > 0 ) {
a = 1;
b = 2 * x;
}
...
do {
x++;
y--;
} while ( x < 100 && y > 10);
5.19.1. Arreglos
Un arreglo es una estru
tura homognea
ontiga en la memoria.
Si bien algunos lenguajes permiten denir arreglos de ms de una dimensin, C
slo permite denir ve
tores (arreglos de una dimensin).
11 Es
<type> ve
[N;
donde <type> es algn tipo bsi
o o estru
turado y N es una
onstante o variable
de tipo entero, la
ual dene su dimensin (el nmero de
omponentes). El siguiente
ejemplo dene una ve
tor de 10 reales en punto otante de doble pre
isin:
double ve
[N;
Cuando se de
lara un ve
tor en un parmetro formal de una fun
in, su dimensin
se omite.
Se debe notar que la dimensin de un ve
tor puede denirse en tiempo de eje
u
in,
ya que C permite que sea una variable y su valor en un momento espe
o slo puede
ser determinado durante la eje
u
in. Otros lenguajes (
omo FORTRAN 77 o Pas
al
estndar) requieren que su dimensin sea determinada en tiempo de
ompila
in por
lo que requieren que sea una
onstante.
Si bien su dimensin puede determinarse dinmi
amente (tiempo de eje
u
in),
una vez
reado, un ve
tor no puede
ambiar su dimensin. Los ve
tores de este tipo
se
ono
en
omo semidinmi
os.
Cada elemento de un ve
tor se puede a
eder por medio de su ndi
e en el ve
tor. El
ndi
e es una espe
ie de identi
ador (o nombre) unvo
o de
ada elemento. El primer
elemento de un ve
tor tiene ndi
e 0 (
ero) y el timo
N 1, (donde N
es si dimensin).
return sum;
void main(void)
{
double ve
tor[N;
/* definition of ve tor v */
double v[N[M;
lo
ual de
lara un ve
tor de dimensin N, en el
ual,
ada elemento es un ve
tor de
N xM
...
stru
t persona {
unsigned long dni;
102
har nombre[31;
unsigned short edad;
};
stru t persona p;
...
p.dni = 24456789;
p.edad = 31;
...
union u {
int value;
unsigned
har bytes[4;
};
u rep_int;
...
...
rep_int.value = -1;
for (i=0; i<4; i++)
printf("byte[i=%d%n", rep_int.bytes[i);
Como se puede apre
iar en el ejemplo, los
ampos de una unin se a
eden de la
misma manera que los de una estru
tura.
5.20. Punteros
Los punteros son datos bsi
os del lenguaje. Sus valores representan dire
iones de
memoria de otras entidades (variables o valores). El tipo de datos puntero es un tipo
parametrizado ya que son tipados, esto es, un puntero apunta a entidades de un tipo
103
determinado.
La sintaxis de la de
lara
in de un puntero tiene la forma
tipo de los valores apuntados por el puntero
ptr.
T * ptr,
donde
es el
referen
ia
in (operador &) : el operador prejo & apli
ado a una variable, retorna su dire
in de memoria, la
ual puede ser asignado a pun puntero de un
tipo
ompatible
on di
ha variable.
p.
...
{
int v = 5; int * p1 = &v;
int p2;
p2 = p1;
/* asigna
ion (
opia) entre punteros */
(*p1)++;
/* el valor de v es in
rementado (6) */
printf("El valor de v es: %d\n", *p2);
}
...
...
int avg(float v[, int dim)
{
int i; float a
um = 0.0;
104
}
...
{
float ve
[N;
a = avg(ve
,N);
...
El programa de arriba mere
e algunas a
lara
iones.
la de
lara
in del parmetro formal
la dimensin del parmetro a
tual tiene que ser pasado
omo parmetro, ya que
el parmetro formal no tiene informa
in sobre su dimensin.
La gura 5.5 muestra una forma posible de representa
in de la memoria de la
de
lara
in de la forma
T v[N.
v[0]
v[1]
v[N1]
...
int avg(float *v, int dim)
{
int i; float a
um = 0.0;
105
}
...
{
float ve
[N;
a = avg(ve
,N);
...
Un anlisis de este ltimo programa muestra que:
la expresin
v.
*(v+i)
apunta a su
la dire in alma e-
base del ve
tor mas uno, lo
ual no sera una referen
ia a un valor del ve
tor, ya
que un entero generalmente se representa en ms de un byte (es
omn que en una
arquite
tura de 32 bits se represente en 4 bytes).
enteros,
el
del puntero.
Efe
tivamente la aritmti
a de punteros tiene en
uenta el tamao de su tipo base.
El programa anterior podra re
orrer el ve
tor utilizando solamente punteros, tal
omo
se muestra a
ontinua
in.
...
int avg(float *v, int dim)
{
int *p; float a
um = 0.0;
for (p=v; p < v+dim; p++)
a
um += *p;
return a
um / dim;
}
...
{
float ve
[N;
a = avg(ve
,N);
...
106
}
Esto muestra que hay una rela
in muy estre
ha
on los ve
tores y punteros.
Una variable de tipo ve
tor de elementos de tipo T se representa
omo un bloque
ontigo de elementos de tipo T mas un puntero (
onstante) a la dire
in base
del bloque.
La diferen
ia entre un puntero y una variable de tipo ve
tor es que la variable es
un puntero
onstante, es de
ir, que no puedo modi
ar su dire
in base,
uando
un puntero
omn es modi
able.
Esta de
isin de representa
in tiene sus ventajas y desventajas. Como ventajas
podemos men
ionar su simpli
idad y e
ien
ia tanto en representa
in
omo en a
eso
a
omponentes. Como desventajas es f
il de ver que al no disponer de la dimensin
en el des
riptor de un ve
tor, su manejo queda bajo la total responsabilidad del programador.
Esto es in
onveniente, ya que las fun
iones que toman
omo parmetros ve
tores,
su de
lara
in en s no es
lara (ej: f(int *v) /* es un puntero o un ve
tor? */). Los
strings, que son ve
tores de tipo
har, sufren
Los strings, al ser ve
tores, no son tratados
omo los tipos bsi
os, esto es, no pueden asignarse (se tiene que ha
er elemento a elemento) y generalmente es se manipulan
mediante fun
iones de bibliote
a (ver la interfa
e del ar
hivo de
abe
era
string.h.
Otra desventaja de este manejo de los ve
tores es que los programadores novatos
en el lenguaje a menudo se
onfunden que la de
lara
in de un puntero dene un ve
tor.
La representa
in de los ve
tores de C es mu
has ve
es la
ausa de problemas de
seguridad en mu
has apli
a
iones de red,
omo lo son los ataques por desborde de
buers (buer-overow) que se basan en ha
er que
ierto
digo del programa
opia
datos fuera del rango de algn arreglo.
Esto permite desarrollar t
ni
as de inye
in de
digo.
de la forma
T f(args) tiene
el tipo
T (*f)(args).
Esto signi
a que el nombre de una fun
in es un puntero (
onstante), lo que permite usar a los nombres de las fun
iones
omo valores en expresiones (involu
rando
punteros).
A
ontinua
in se muestra un ejemplo del uso de punteros a fun
iones.
...
int square(int n)
{
return n*n;
}
107
int main(void)
{
int (*ptr_square)(int) = square;
int sq;
sq = ptr_square(5);
...
mallo .h.
La bibliote
a estndar del lenguaje provee dos fun
iones para manipula
in de
variables heap.
unsigned int).
p.
void free(void p)
libera el
mallo retorna
un puntero a
void,
es ne esario
ha
er un
ambio de tipo (
ast) para que el
ompilador, al
hequear los tipos no reporte
un error.
12
12 Notar que no es ne
esario
onvertir un puntero de tipo T a un puntero a void, pero s a la inversa.
Esto muestra que el tipo void representa un tipo unin de todos los tipos denibles.
108
de
lara
iones de sus
omponentes y los exporta al exterior para otros mdulos que lo
usen (
lientes).
Un mdulo
ontiene una des
rip
in de su interfa
e y su implementa
in. Algunos
lenguajes ofre
en
onstru
iones sint
ti
as para la deni
in de mdulos (
lases de
Haskell, Units de obje
t Pas
al o Delphi, et
).
El lenguaje C no ofre
e ninguna sintaxis para la deni
in de mdulos. Un mdulo se
orresponde
on una unidad de
ompila
in (ar
hivo objeto o bibliote
a). Un
mdulo que requiera a
eder a
omponentes de otro mdulo, deber de
lararlos antes
de su uso. Esas de
lara
iones debern ser pre
edidas por la palabra reservada
extern,
lo
ual le di
e al enlazador (linker) que las deni
iones de esos
omponentes (tipos,
variables,
onstantes o fun
iones) no estn en el mdulo
orriente, sino que estn en
otro mdulo (el
ual deber ser in
ludo en los respe
tivos
omandos de
ompila
in o
enlazado).
La
onven
in usada en programas C es que las de
lara
iones de los
omponentes
que exporta
ada mdulo se in
luyen en un ar
hivo de
abe
era,
on sujo
.h.
Estas
de
lara
iones se denen
omo externas ya que su nalidad es la de ser in
luidas en los
mdulos
lientes.
La implementa
in de un mdulo se es
ribe en un ar
hivo
on sujo
. .
Uno de los in
onvenientes de este esquema, el
ual se basa simplemente en la in
lusin textual de
digo, es que un ar
hivo de
abe
era podra in
luirse ms de una vez
en un mdulo
nes o deni
iones de los mismos identi
adores. Para evitar esto, la pr
ti
a habitual
es proteger a
ada ar
hivo de
abe
era
on dire
tivas del prepro
esador para dete
tar
y evitar de
lara
iones repetidas.
La dire
tiva
symbol
est denido. Por lo tanto un patrn
omnmente utilizado en los a
hivos de
abe
era
es
#ifndef S
#define S
/* de
larations */
#endif
A
ontinua
in se muestra un ejemplo de un ar
hivo de
abe
era (interfa
e).
/* File: list.h */
#ifndef LIST_H
#define LIST_H
13 El ar
hivo f1.h podra in
luir a f2.h y el programador podra in
luir expl
itamente ambos en
otro ar
hivo de
abe
era.
109
typedef stru
t n {
int value;
stru
t n * next;
} list_node;
typedef stru
t {
list_node * first, * last;
int items;
} list;
extern list * list_new(void);
extern void * list_insert(list *l, int value, int pos);
...
#endif
La implemena
in se muestra a
ontinua
in.
/* File: list.
*/
#in
lude <mallo
.h>
typedef stru
t n {
int value;
stru
t n * next;
} list_node;
typedef stru
t {
list_node * first, * last;
int items;
} list;
list * list_new(void)
{
list * result = (list *) mallo
(sizeof(list));
result->first = result->last = NULL;
result->items = 0;
return result;
}
void * list_insert(list *l, int value, int pos)
{
...
}
/* Auxiliar fun
tion (see stati
modifier) */
stati
list_node * goto_pos(list *l, int pos)
{ ...
110
Captulo 6
Manejo de la memoria
En este
aptulo se des
ribirn los me
anismos mas
omnmente utilizados en la
implementa
in e
iente del manejo de la memoria de los lenguajes de programa
in.
y la memoria de eldas
1 Un lenguaje estru
turado a bloques
ontiene
onstru
iones sint
ti
as (bloques)
on sus propios
ambientes. Los bloques pueden ser anidadas y
ada bloque interno hereda el ambiente de su bloque
ontenedor.
111
Manejo de la memoria
process memory
heap
CPU registers
Flags
stack
Stack Pointer
Frame Pointer
Program Counter
static data
others...
code segment
Sta
k: rea de alman
enamiento en las que se lleva el
ontrol de las a
tiva
iones
de las subrutinas (dire
iones de retorno) y en la mayora de los lenguajes de
programa
in modernos se lleva informa
in de
ontrol adi
ional para a
eso
a ambientes lo
ales y no lo
ales y adems se alma
enan las variables lo
ales y
valores de los parmetros a
tuales de las subrutinas a
tivas.
En
ada invo
a
in a una subrutina se
onstruye un registro de a
tiva
in. En
ada retorno de una fun
in el registro de a
tiva
in del tope se elimina dejando
en el tope en el estado anterior a la invo
a
in (su invo
ante).
Mas abajo de des
ribe en mas detalle el manejo del sta
k.
Heap: mantiene bloques de memoria que representan datos del programa
reados dinmi
amente, esto es,
reados por opera
iones del tipo new (de Pas
al,
C++, Java, et
), mallo
de C o valores
reados impl
itamente
omo el lenguaje
utilizado aqu o lenguajes fun
ionales
omo Haskell o ML.
Los bloques del heap son liberados expl itamente (opera iones omo delete, free,
112
Manejo de la memoria
program ounter
SUBROUTINE S1(X,Y)
INTEGER X,Y,Z
...
END
x
y
Z
SUBROUTINE S2(X)
REAL R; INTEGER X
...
END
...
PROGRAM P
CHARACTER S(4)
...
END
X
R
S(0)
S(1)
S(2)
S(3)
2 El
Manejo de la memoria
base pointer 3 .
3 En
la arquite tura Intel IA32, utilizada en la mayora de las PCs a tuales el registro usado es el
114
Manejo de la memoria
Valores temporales
SP
Variables locales
FP
SP=Stack Pointer
FP=Frame Pointer
ha
e apuntar al tope del sta
k. Esta dire
in ser usada
omo dire
in base
dentro del registro de a
tiva
in.
115
Manejo de la memoria
7. Se
ontina
on la eje
u
in del resto de las instru
iones del
uerpo de la rutina.
Los valores temporarios produ
idos por la evalua
in de expresiones
omplejas
pueden apilarse en el tope del sta
k.
8. Comienzo de las a
iones de retorno de la subrutina: se eliminan las variables
lo
ales. Nuevamente esto se realiza simplemente moviendo el tope del sta
k (sta
k
pointer).
9. Se desapila y re
upera el frame pointer del registro de a
tiva
in anterior (invo
ante).
10. Se eje
uta el retorno (ej: instru
in RET ), la
ual desapila el
ontenido del tope
del sta
k y se lo asigna al program
ounter.
11. El
ontrol vuelve al invo
ante, el
ual debe eliminar los valores de los parmetros
a
tuales (modi
ando el tope del sta
k). En el
aso que se haya invo
ado a una
fun
in, se desapilar el valor retornado.
12. El invo
ante
ontina
on su eje
u
in.
Es importante notar que
ada subrutina tiene que realizar
iertas a
iones en la
entrada (a
iones 1 a 6) y durante la salida o retorno (a
iones 8 a 10). Estas a
iones
se implementan
on dos o tres instru
iones de mquina y se denominan prembulo y
eplogo, respe
tivamente.
Algunas arquite
turas (ej: Intel IA32[7) proveen instru
iones de mquina para
El link estti
o implementa en forma e
iente la unin de ambientes , ya que representa el
onjunto de ambientes de un bloque
omo una lista enlazada.
El a
eso a una variable no lo
al deber seguir la
adena estti
a hasta a
eder al
primer registro de a
tiva
in que
orresponda al bloque que de
lar tal variable.
En los lenguajes estru
turados a bloques,
omo Pas
al y Oz, un a
eso a una entidad no lo
al requiere que se reali
en
116
es la
Manejo de la memoria
diferen
ia de niveles entre el bloque
orriente y el bloque mas inmediato que de
lar
la entidad. El
osto es lineal.
Para evitar que los programas re
orran parte de una lista en
ada a
eso a entidades
no lo
ales, generalmente se utiliza un display.
El display es un arreglo el
ual
ontiene un puntero a la dire
in base de un registro
de a
tiva
in por
ada mbito (nivel) estti
o del programa.
M
niveles
estaticos
nivel corriente = 2
Display
static links
Stack
Programa
La gura 6.4 muestra el uso de un display para un programa estru
turado a bloques
on al
an
e estti
o. La gura muestra que el programa se en
uentra eje
utando el
bloque
R,
Q.
Se debe notar que, en este ejemplo, la
adena dinmi
a (invo
a
iones) no se
orresponde
on la
adena estti
a. El display permite el a
eso a entidades no lo
ales
on
osto
onstante, ya que se a
ede a la dire
in base del registro de a
tiva
in
orrespondiente, mediante un desplazamiento dentro del display.
Este desplazamiento puede
omputarse estti
amente, es de
ir, en tiempo de
ompila
in.
Durante el retorno, se a
tualiza el nivel
orriente del display. Si el nivel del bloque
al que se retorna es igual al
orriente (
omo en el
aso del retorno de
R a Q, en la gura
6.4) se restaura el puntero del nivel
orriente del display
on el salvado en el registro
de a
tiva
in de la rutina que est retornando.
Los dems
asos se dejan
omo ejer
i
ios al le
tor.
117
Manejo de la memoria
...
Var p,q:^integer;
begin
new(p);
p^ := 100;
q := p;
...
end
...
dispose(q);
En el ejemplo, un valor numri
o es
reado (allo
ated ) en el heap mediante el pro
edimiento nativo
q
...
q
...
q
...
100
...
100
100
...
...
heap
stack
a) new(p)
stack
heap
heap
stack
c) q := p
b) p^ = 100
heap
stack
d) dispose(q)
Basura : se produ
e
uando un valor en el heap no puede ser referen
iado porque
no hay forma de referen
iarlos (las referen
ias o punteros a l ya no existen).
Por ejemplo, si el ejemplo anterior se omitiera la senten
ia
dispose(q), luego de
118
Manejo de la memoria
Este tipo de errores es bastante dif
il de dete
tar porque el programa puede
tener el
omportamiento esperado, pero a medida que avan
e su eje
u
in ir
onsumiendo el heap hasta que en algn momento la opera
in de allo
ation
falle.
Se di
e que un programa que genera basura tiene memory leaks (lagunas de
memoria).
write p;
dispose(q), hubiese la
ation de bloques en el heap. El manejador del heap
ontiene dos listas, una que
memoriza los bloques asignados y otra que registra los libres. La gura 6.6 muestra
una representa
in del heap.
Free list
Allocated list
HEAP
6 El error es generado por el sistema operativo ya que el pro
eso est tratando de a
eder a un
segmento (bloque) de memoria sin permiso.
119
Manejo de la memoria
Hay lenguajes que permiten que los bloques del heap tengan tamao uniforme,
omo por ejemplo en Lisp y Haskell. Esto permite que el manejo del heap sea muy
simple.
El heap se divide en n bloques y en realidad no importa qu bloque se asigne en
un requerimiento pues son todos iguales.
Otros lenguajes, donde los valores pueden tener representa
iones de diferentes tamaos (
omo es el
aso de registros o arreglos), el heap tendr que ser manejado
omo
una estru
tura heterognea, es de
ir puede tener bloques de diferentes tamaos. Esto
a
arrea una
ompli
a
in extra en el manejo, ya que
ada bloque deber tener al
menos un des
riptor de su tamao (adems de su dire
in).
En este esquema, ini
ialmente el heap tiene un ni
o gran bloque disponible.
El manejo del heap
on bloques de diferentes tamaos a
arrea el problema de la
fragmenta
in del heap. Esto quiere de
ir que a medida que se van realizando requerimientos y libera
in de bloques de diferentes tamaos en el heap, van quedando hue
os
entre los bloques en uso que podran ser menor que el tamao de un prximo bloque
requerido, por lo que este ltimo requerimiento no podra ser satisfe
ho.
Existen dos posibles solu
iones a este problema:
1.
Compa
ta
in total: este pro
eso movera los bloques en el heap para re
onvertir los mltiples bloques libres en uno solo. El problema de la
ompa
ta
in
total es que hay que modi
ar las referen
ias ya que los bloques fueron movidos.
2.
bloque. Al momento de liberar un bloque, si ste tiene bloques adya
entes libres,
se fusionan en un solo bloque. Esto es mas e
iente y generalmente en la pr
ti
a
fun
iona muy bien.
120
Manejo de la memoria
En
ada
opia de referen
ias, esto es en las opera
iones de asigna
in y pasaje
de parmetros, los
ontadores
orrespondientes se a
tualizan.
A modo de ejemplo, en una asigna
in de la forma
p := q
(donde
son
p,
q.
Cada vez que una referen
ia naliza su tiempo de vida (porque naliza la eje
u
in del ambiente en que fue de
larado), el
ontador de referen
ias se de
rementa.
Si el
ontador lleg a
ero, signi
a que el bloque ya no puede ser referen
iado,
por lo tanto puede liberarse en forma segura.
Se debe notar que en el lenguaje kernel utilizado aqu en in
remento del
ontador
se debera implementar en la opera
in primitiva Bind. Se deja
omo ejer
i
io la
redeni
in de la semnti
a de la mquina abstra
ta para el uso de
ontadores
de referen
ias.
7 se dispare
un pro
eso, el re
ole
tor de basura al
ual se en
argar de dete
tar los bloques
basura para luego re
uperarlos.
una lausura de los bloques al anzados dire tamente . Este algoritmo deber tener en uenta que di ha rela in de al anzabilidad puede ser li a.
Manejo de la memoria
El segundo paso (sweep) se en
arga de tomar los bloques no mar
ados y adi
ionarlos a la lista de bloques libres. Obviamente los bloques no mar
ados son
inal
anzables desde las referen
ias del programa, por lo que son basura.
Genera ionales:
mas viejas. Esto permite que se haga una re
ole
in par
ial (o in
remental) de
la basura lo que permite que el tiempo de eje
u
in del re
ole
tor no sea larga y
el programa no sufra largas pausas.
Copia:
el heap en dos partes. Una parte es la regin a
tiva. Cuando una soli
itud no
puede ser satisfe
ha, el re
ole
tor
opia todos los bloques al
anzables de la regin
a
tiva a la otra, la
ual pasa a ser la nueva regin a
tiva. Durante el pro
eso de
opia se puede ha
er la
ompa
ta
in de los bloques. La regin anterior queda
ompletamente disponible para la prxima
opia.
Esta t
ni
a tiene la ventaja que realiza una sola pasada pero
omo desventaja,
aprove
ha la mitad del heap.
Un problema adi
ional a resolver
on el manejo automti
o de la memoria es el
uso de programas externos. Por ejemplo, un programa podra tener una estru
tura de
datos que puede ser a
edida de una bibliote
a externa al lenguaje. En este es
enario,
si la estru
tura fuese re
lamada por el manejador de la memoria, sera un error. Otro
ejemplo sera que un programa tenga referen
ias a datos externos. Esos datos no podran ser re
lamados
uando ya no estn en uso ya que el lenguaje no puede manejar
el heap del programa (o bibliote
a) externa.
Estos
asos generalmente se solu
ionan de dos maneras posibles. Las bloques de
memoria lo
al referen
iados externamente se mar
an y no se re
laman. Los datos externos referen
iados por el programa tienen aso
iados proxies, los
uales realizan el
re
lamo al programa externo
uando el proxi en s sea re
lamado. Esta opera
in generalmente se
ono
e
omo naliza
in.
Mu
hos lenguajes de programa
in brindan me
anismos para la naliza
in. Es
el
aso de los destru
tores de C++ (los
uales son invo
ados automti
amente en la
destru
in de un objeto, ya sea automti
amente
uando ste reside en el sta
k o
por la opera
in
delete)
122
Captulo 7
Programa
in orientada a
objetos
En este
aptulo se des
ribirn los prin
ipales
on
eptos de la programa
in orientada a objetos (OOP). Se estudiarn
on
eptos tales
omo objetos,
lases, heren
ia,
dynami
binding, polimorsmo y genere
idad.
Se extender el lenguaje kernel para soportar los
on
eptos men
ionados y se dar
su semnti
a formal en la mquina abstra
ta.
7.1. Objetos
Una fun
in (o varias)
on una memoria interna (estado) se denomina un objeto.
Se ver que los objetos son muy tiles. A modo de ejemplo, la gura 7.1 muestra la
implementa
in de un objeto Counter.
lo
al C in
C={NewCell 0}
fun {In
}
C := C + 1
C
end
fun {Read}
C
end
end
Figura 7.1: Implementa
in de un objeto Counter
La senten ia
123
Esto se llama en
apsulamiento, ya que la variable est o
ulta al resto del programa
y slo puede ser manipulado por una interfa
e, las fun
iones
In y Read.
La separa
in entre interfa
e e implementa
in es fundamental para realizar abstra
iones de datos. Esto permite que los programas se abstraigan de la implementa
in
de los objetos y slo tengan que respetar su interfa
e. Este me
anismo es es
en
ial para
una ade
uada modulariza
in en la programa
in en gran es
ala.
7.2. Clases
En la se
in anterior se ha denido un objeto. Cmo es posible
rear ms objetos
omo
Counter?
Para ello es ne
esario una fbri
a (fa
tory ) de objetos. Las
lases en la OOP juegan
el papel de fbri
as de objetos. Una
lase tambin dene un mdulo: una implementa-
de tipo
In
NewCounter
(objetos):
C1 = NewCounter
C2 = NewCounter
{Browse C1.In
}
{Browse C2.Read}
Se extender el lenguaje n
leo
on estado para dar soporte sint
ti
o a la programa
in orientada a objetos,
omo se muestra en la gura 7.3.
124
<statement> ::=
|
<
lass-des
> ::=
<method>
::=
<expr>
::=
|
|
<attr_init> ::=
<meth_head> ::=
<arg>
Las extensiones al lenguaje n
leo ser una abstra
in lingusti
a ya que se ver
omo se puede representar una
lase y sus
ara
tersti
as espe
as.
La gura 7.4 muestra un ejemplo de la
lase
lass Counter
attr val;
meth init(Value)
val := Value
end
meth in
(Value)
val := val + Value
end
meth get
val
end
end
Figura 7.4: Ejemplo de una
lase.
Counter
Counter
en el len-
se representa omo un
registro
on dos
ampos: una lista de atributos y otro registro
uyos
ampos se ligan a
referen
ias de los pro
edimientos
orrespondientes. Este ltimo registra los mtodos.
New. A
ontinua
in
Counter y su utiliza
in.
lo
al
pro
{Init M S}
init(Value)=M in (S.val) := Value
end
pro
{In
M S}
in
(Value)=M in (S.val) := (S.val) + Value
end
pro
{Get M S}
get = M in (S.val)
end
in
Counter =
(attrs:[val methods:m(init:Init in
:In
get:Get))
end
Figura 7.5: Ejemplo de una
lase.
in (x),
apli a in se denomina el objeto destino (target). En otros lenguajes populares orientados a objetos omo C++, Java, Eiel, et , es omn la nota in
obje t.method.
Es importante notar que en esta forma de representar
lases y objetos, una apli
a
in se implementa por medio de un me
anismo de mensajes
odi
ados en forma
de registros. La de
odi
a
in del mensaje se logra por medio de pattern mat
hing en
ada pro
edimiento.
Para poder entender la semnti
a
ompleta de este ejemplo, a
ontinua
in se
muestra la deni
in del operador
New.
Obj
on un argumento. Este
pro edimiento representa el objeto y su argumento el mtodo (mensaje) a ser invo ado. Cuando se invo a
Obj
126
Obj
de mensajes, esto es, rela
iona un mensaje
on un pro
edimiento que implementa el
mtodo
orrespondiente. El mtodo destino es el rtulo del registro que
odi
a el
mensaje.
New
Init).
in ializa in (
New retorna un
pro edimiento).
El estado del objeto est o ulto por las reglas de al an e lexi ogr o.
Atributos: denidos por la palabra attr. Un atributo es una
elda que alma
ena
parte del estado del objeto.
En la terminologa de la OOP, un atributo se
ono
e generalmente
omo una
variable de instan
ia o
ampo (eld member en C++).
stati
de
Java o C++.
Los atributos podrn ser a
edidos y modi
ados por los mtodos de la
lase.
Algunos lenguajes permiten que se a
edan a los atributos desde otros objetos,
si es que son visibles. Algunos lenguajes,
omo Eiel, ven a los atributos
omo
fun
iones de
onsulta (query), por lo que los atributos pueden ser slo ledos
desde otros objetos, si la visibilidad lo permite.
la palabra
meth. Un
Propiedades: de
larados
on la palabra prop. Una propiedad modi
a el
omportamiento de los objetos. Una propiedad puede
rear un
errojo (lo
k) en
ada objeto
reado, til en
on
urren
ia. La propiedad
final afe ta a
la heren-
Otros lenguajes de POO tienen algunos de estos me
anismos
omo modi
adores
de la de
lara
in de
ada
lase, mtodo o atributo.
127
por instan
ia : un atributo puede tener un valor ini
ial en
ada instan
ia, lo que
requiere que debern ser ini
ializados
on valores pasados
omo parmetros del
mtodo de ini
ializa
in.
por
lase : un atributo podr tener el misno valor ini
ial para todas las instan
ias
de la
lase. En su de
lara
in se debe dar su valor in
i
ial, luego del smbolo
(dos puntos).
Por ejemplo: attr
ity : Ro Cuarto
En la mayora de los lenguajes OO, la ini
ializa
in de objetos se realiza por medio
de mtodos u opera
iones espe
iales denominados
onstru
tores.
M}
{Obj
{Counter in (6)}
{Obj M}
donde
es una
variable. Esto da una gran exibilidad, ya que los registros pueden ser
reados
dinmi
amente, es posible
rear mensajes de la misma forma.
Tambin es posible denir mtodos
on un nmero jo o variable de argumentos.
Un mtodo
on un nmero variable de argumentos (usando el smbolo
...) es a eptado
a
in.
Un argumento puede ser usado op
ionalmente en una invo
a
in, ya que es posible
denir un valor por omisin (default)por
ada argumento en el en
abezado de un
mtodo, tal
omo lo muestra el siguiente ejemplo.
128
meth !A(x)
% body
end
Esto es posible ya que las
lases se
onstruyen dinmi
amente.
Finalmente, es posible denir el mtodo
omo un m-
todo por defe
to en el
aso que el mensaje falle en el mat
hing
on los dems. Si este
mtodo existe en una
lase, sus instan
ias a
eptarn
ualquier mensaje.
El
ompilador de Oz, trata de optimizar las invo
a
iones. En el
aso de que el mensaje sea estti
o,
rea un llamado tan rpido
omo una invo
a
in a un pro
edimiento,
sino
ompila a una llamada general sobre el objeto. Esta ltima instru
in usa una
t
ni
a llamada memoriza
in o
at
hing. La primera invo
a
in es lenta, pero las
siguientes se realizan muy rpido porque el mtodo ya se en
uentra en la
a
h.
129
7.4. Heren
ia
Las
lases son una unidad de modulariza
in y tabin denen nuevos tipos de datos.
Esta dualidad es fundamental para denir abstra
iones de datos en forma in
remental.
La heren
ia es un me
anismo para denir nuevas
lases a partir de otras existentes.
Una
lase
A.
A,
autom-
Adems en la deni in de
B,
es
A.
B es la sub
lase
de
(inmediata).
from en la deni in
de una
lase.
En presen
ia de heren
ia mltiple la rela
in de heren
ia entre
lases puede modelarse
omo un grafo dirigido a
li
o.
Deni in 7.4.1
lass A {
...
meth m
{self m1 ...}
end
meth m1
...
end
...
end
lass B from A
...
meth m1
...
{A,m ...}
end
...
end
130
tipo
B,
y la siguiente apli a in
el ompilador no
puede asumir a qu mtodo invo
ar espe
amente ya que puede ser sobrees
rito en
alguna sub
lase, por lo que deber generar
digo para que la determina
in del mtodo a invo
ar se reali
e dinmi
amente (en tiempo de eje
u
in). Esto se
ono
e
omo
m1
A.
m1
de la lase
por el
ompilador o intrprete
omo una llamada re
ursiva. Para realizar la invo
a
in
deseada, se deber indi
ar expl
itamente al mtodo
denota
omo
{A,m1 ...}.
m1
de la lase
A.
En Oz esto se
Esta ltima forma de invo
a
in se puede determinar estti
amente, ya que expl
itamente se denota a qu mtodo espe
o se desea invo
ar. En esta forma de
invo
a
in se utiliza ligadura estti
a (stati
binding).
En Java se utiliza la palabra reservada
super
En otros lenguajes de programa
in, una invo
a
in puede omitir el objeto destino
(target), en
uyo
aso se interpreta
omo que el objeto destino de la invo
a
in es
this (en
C++, Java, et ),
self ),
target. Todas las invo a iones on destino impl ito se realizan sobre el parmetro
self.
1 Creador
o1
vt
m1_A(...)
VT_A
...
m2_A(...)
o2
vt
m2_B(...)
VT_C2
o3
vt
...
...
o2
La gura 7.6 muestra un es
enario de esta implementa
in, donde los objetos
son instan
ias de una
lase
redenido el mtodo
m2.
o3
B en
o1 y
la ual se ha
Este mtodo es uno de los ms usados en lenguajes que soportan objetos y heren
ia,
omo Java, C#, Eiel y otros.
Uno de los prin
ipales problemas
on esta implementa
in es el tamao de las tablas, ya que en sistemas grandes,
on
ientos de
lases, el tamao de las tablas puede
al
anzar tamaos
onsiderables en memoria. En presen
ia de heren
ia mltiple, el tamao es un problema an mayor.
frozen (en
Eiel).
132
final
(en
feature permite
Obje t.
ANY,
C++ no tiene esa semnti
a, por lo
ual permite al programador disear su propia
jerarqua de
lases partiendo desde su propia
lase raz.
de una lase
Punto.
tru
tural puede tener sentido, ya que es razonable pensar que un
r
ulo
ontiene un
punto (su
entro). Desde el punto de vista de tipos de datos, justamente lo inverso es
razonable: es posible pensar que un punto es un
r
ulo de radio
ero.
El ejemplo anterior muestra la di
ultad de disear
orre
tamente jeraquas de
lases. La visin mas ade
uada es la visin de tipos, ya que la heren
ia es una rela
in
133
es-un, es de
ir que una instan
ia de una
lase derivada, tambin es
ompatible (es del
tipo) de su super
lase. El tipo de datos de una
lase in
luye los subtipos
orrespodientes a sus sub
lases, por lo que la super
lase es un tipo mas general, mientras que sus
sub
lases denen subtipos.
La visin de
lases
omo tipos satisfa
e la propiedad de sustitu
in, es de
ir que
ada opera
in que a
ta sobre objetos de un tipo dado, tambin a
ta sobre instan
ias
de sus subtipos (sub
lases). Mu
hos lenguajes de POO,
omo C++, Java, Smalltalk,
et
, estn diseados para esta visin.
El lenguaje Eiel, est diseado para soportar ambas visiones.
7.7. Polimorsmo
Es posible denir la heren
ia en trminos de un sistema de tipos en base a una
rela
in tipo-subtipo. Esto permite implementar abstra
iones polimr
as - pro
edimientos, fun
iones y estru
turas de datos (
ontenedores) - ya que una abstra
in que
se basa en una
lase
A,
Ao
El polimorsmo basado en heren ia requiere que las opera iones tomen referen ias o punteros a objetos, en lugar de obje tos por opia. Esto permite implementar
A toma el
A o alguno de sus derivados. Este
Deni in 7.8.1
Deni in 7.8.2
134
Las
lases abstra
tas permiten denir moldes de las sub
lases y delega en ellas la
responsabilidad de
ompletar su implementa
in.
Uno de los prin
ipales objetivos de las t
ni
as de programa
in orientada a objetos
es la reutiliza
in de
digo, lo
ual se logra maximizando las abstra
iones (an la
pro
edural).
Una
lase abstra
ta puede tener implementados mu
hos de sus mtodos, los
uales
sern reutilizados en las subl
ases.
A
ontinua
in se muestra el uso de
lases abstra
tas.
get_state().
self
en
o2 se
self.
realiza sobre
135
otherwise.
En delega in,
self
los mtodos a tan sobre el estado del objeto que ha ini iado la delega in.
7.10. Reexin
Un sistema (u objeto) es ree
tivo si ste puede inspe
ionar parte de su estado
de eje
u
in dinmi
amente. La reexin puede ser puramente instrospe
tiva, es de
ir slo podr leer su estado interno, o intrusiva, es de
ir que puede modi
ar su estado.
La ree
in puede ha
erse a bajo o alto nivel. En el primer
aso, podra ser que es
posible ver los elementos de la pila semnti
a
omo
lausuras (ambientes). Un ejemplo
del segundo
aso podra ser que es posible ver la memoria
omo un ve
tor de enteros.
Algunos lenguajes modernos permiten instrope
in,
omo en Java y Eiel. Otros
lenguajes mas dinmi
os ofre
en reexin intrusiva, ya que es posible agregar, modi
ar y eliminar
omponentes de objetos dinmi
amente,
omo por ejemplo en Python
y Ruby.
Otros lenguajes
omo C++, permiten una reexin muy limitada. Slo permite
inspe
ionar el tipo de un objeto si se utiliza RTTI (Run Time Type Information ).
136
mensajes de las invo a iones, introdu ir me anismos de toleran ias a fallas o introdu ir
aspe
tos .
Las meta
lases, en lenguajes
omo Smalltalk, Ruby o CLOS (Common Lisp Obje
t
System) dan una gran exibilidad para implementar sistemas que son muy exibles en
tiempo de eje
u
in ya que permiten pr
ti
amente la
onstru
in y modi
a
in de
objetos y de sus jerarquas en tiempo de eje
u
in.
Los lenguajes que no disponen de meta
lases, se denominan orientados a
lases (y
tal vez no ne
esariamente a objetos). Lenguajes
omo C++, Java O Eiel, no proveen
meta
lases, aunque las
ara
tersti
as y me
anismos provistos por meta
lases pueden
ser provistos por mtodos de
lases espe
as (
omo
o algunos mtodos de la
lase
Obje t de
INTERNALS
MEMORY
de Eiel)
Java.
El proye
to Open C++ [8 tiene
omo objetivo proveer de me
anismos de meta
lases
para C++ por medio de un pre-
ompilador de meta
lases (que genera
lases C++).
New
En la mayora de los lenguajes orientados a objetos es posible denir varios
onstru
tores. Alguno de ellos se invo
ar (expl
itamente o impl
itamente) durante la
rea
in de un objeto.
En algunos lenguajes,
omo C++ y Java, los
onstru
tores deben tener el mismo
nombre de la
lase y no retornan ningn valor (ni siquiera
void).
En ese aso, un
delete).
virtual ya que puede ser invo
ado en
un
ontexto polimr
o donde se requiere determinar el destru
tor (mtodo)
orrespondiente en forma dinmi
a.
Los lenguajes que proveen amnejo automti
o de la memoria,
omo Eiel o Java,
permiten que las
lases redenan un mtodo provisto en la
lase base del lenguaje. Por
2 La programa
in orientada a aspe
tos permite modi
ar el sistema de eje
u
in para introdu
ir
omputa
iones en puntos espe
os de un programa dado sin modi
arlo, es de
ir ha
erlo por fuera.
137
C hereda
in
onvenientes:
1.
oni
tos de nombres de miembros de
lases : en el
aso que las super
lases tengan
algn miembro
on nombre
omn.
2. problema del rombo : si dos (o ms)
lases, sean
A.
C,
se da el problema que
hereda por
138
B)
que se hereda de
virtual,
tal omo se
lass
lass
lass
lass
A
B
C
D
{...};
: virtual publi
A {...};
: publi
A {...};
: publi
B, publi
C {...};
lass A
feature {ANY}
attr:T
m(x:INTEGER)
...
end
lass B
inherith A
...
end
...
end
lass C
inherith A
rename m as m_of_A
end
...
end
lass C
inherith B
indefine attr1
end
inherith C
end
end
139
el ompilador (java ):
byte ode
la mquina virtual (java virtual ma
hine o jvm ): que se en
arga de
argar, enlazar y eje
utar
lases. La mquina virtual es un intrprete del lenguaje assembly
virtual java byte
ode. Cada plataforma
on soporte para Java debe implementar
su propia jvm.
Java es un lenguaje estti
amente tipado (al igual que C++),
on
lases, objetos
pasivos y threads. A diferen
ia de C++, los valores en java pueden ser enteros, reales
en punto otante,
ara
teres (uni
ode), lgi
os (booleans) y referen
ias a objetos.
No es posible de
larar objetos dire
tamente, sino referen
ias a objetos, lo que ha
e
que el me
anismo de pasaje de mensajes sea por valor (las referen
ias se pasan por
valor).
Una variable de
larada tiene un valor ini
ial predenido para
ada tipo de dato (a
diferen
ia de C++).
Soporta asigna
in simple de atributos utilizando la palabra
valente a los objetos onstantes de C++. La misma palabra puede utilizarse para
self
se denomina
this,
thread
orriente.
Las
lases pueden
ontener atributos (llamados elds en la terminologa Java) y
mtodos.
Cada deni
in de atributos o mtodos puede tener propiedades (las
uales pre
eden a la de
lara
in) de las siguientes
ategoras:
visibilidad:
omo
private
on anterioridad.
main. Esto
grama Java podra tener mu
hos puntos de ini
io, dependiendo de la
lase por
la
ual se de ini
io al programa.
3 Esto
.
Una diferen
ia
on C++, es que este permite al programador sobre
argar
asi la
lass Int {
private int value;
publi
Int(int value) { this.value = value; }
publi
int get_value() { return value; }
publi
set_value(int v) { value = v; }
publi
set_value(Int other) { value = other.get_value(); }
}
lass Example {
publi
void sqrt(Int n)
{
n.set_value( n.get_value() * n.get_value(); )
}
7.14.1. Heren
ia
Java soporta heren
ia simple, aunque es posible simular la heren
ia mltiple usando
interfa
es.
La heren
ia se expresa por la palabra
extends (equivalente
al
from).
Una interfa
e es una des
rip
in de un proto
olo. Contiene de
lara
iones de mtodos (no atributos) sin denir (sin
uerpo).
Las interfa
es se pueden heredar (in
lusin textual) y una
lase puede implementar
una interfa
e.
Esto ltimo se reeja en la de
lara
in de una
lase utilizando la palabra
4 Salvo
implements.
No se deben
onfundir a las interfa
es
on
lases abstra
tas. Una
lase abstra
ta generalmente tiene una implementa
in par
ial (de sus mtodos) y puede tener
atributos. Una interfa
e no tiene estado.
A diferen
ia de C++, la semnti
a del sistema de objetos es ligadura dinmi
a (la
ade
uada), por lo que no ha
e falta de
larar a qu mtodos se les puede apli
ar un
tipo de ligadura.
En el
aptulo 8 se mostrarn ejemplos de heren
ia ya que analizarn los me
anismos de soporte a la
on
urren
ia en Java.
ia
in.
Tambin se
ono
e a la genere
idad
omo polimorsmo estti
o
ontrastando
on
el polimorsmo basado en heren
ia, tambin llamado polimorsmo dinmi
o.
Mas all de sus diferen
ias, lo interesante es que ambos me
anismos se pueden
ombinar, lo que da
omo resultado un polimorsmo mas general.
Si bien la genera
idad no es ex
lusiva a la OOP, se des
ribe aqu ya que varios
lenguajes de programa
in de este paradigma lo soportan,
omo por ejemplo, C++,
Java, Eiel y otros.
A modo de ejemplo, a
ontinua
in se muestra el uso de la
lase
ARRAY
de la
lass A
...
ve
1:ARRAY[INTEGER
ve
2:ARRAY[STRING
...
end
lass ARRAY [T
...
rep:NATIVE_ARRAY[T
...
end
En C++ las deni
iones genri
as se denominan templates. Estos lenguajes proveen en su bibliote
a estndar un
onjunto de deni
iones genri
as tanto
omo algoritmos (fun
iones)
omo
lases, las
uales generalmente representan estru
turas de
datos
omnmente usadas
omo pilas, listas,
onjuntos, et
. Estas estru
turas de datos
142
typename T donde T es
add(5,x)
asumiendo que
La de lara in
pair<string,int>address;
genera una instan
ia de la
lase (o estru
tura)
pair
on
first
de tipo
string
143
find, et .
sort, a umulate,
otros.
Estos
ontenedores utilizan iteradores (iterators) para el a
eso a los elementos que
ontienen.
Un iterador es una abstra
in de un puntero, estn denidos
omo
lases genri
as y denen al menos operadores
omo
())
144
lass Counter
attr val
meth init(V)
val := V
end
meth in
(V)
val := val + V
end
end
New,
145
...
super.m();
...
Justi
ar la respuesta.
6. Implementar en Java, C++, Eiel y Ruby el TAD lista (heterognea). Denir
una
lase abstra
ta y al menos dos implementa
iones: sobre arreglos y nodos
enlazados.
Mostrar ejemplos de uso.
7. Modi
ar la
lase lista de C++ para alma
enar valores de un tipo T
on
reto
(no de sus derivados).
8. Expli
ar
omo se puede resolver el problema del rombo (
on heren
ia mltiple)
en C++ y Eiel.
9. Dar un ejemplo de
mo se puede implementar un diseo
on heren
ia mltiple
en Java.
10. En lenguajes
omo C++ o Java, podemos hablar de mensajes o son en realidad
invo
a
iones a pro
edimientos? Justi
ar la respuesta.
11. Des
riba las ventajas y desventajas de manejar las invo
a
iones a mtodos
omo
mensajes versus invo
a
iones a pro
edimientos.
12. Es
ribir un programa en C++ que ordene los argumentos que pueda re
ibir
desde la lnea de
omandos durante su invo
a
in. Deber usar los algoritmos
de la STL (Standard Template Library)
13. Es
ribir un programa que sume y multiplique los elementos de un ve
tor. Los
elementos debern estar alma
enados en un objeto de tipo
utilizar el algoritmo genri
o
a umulate.
bintree<T>,
ve
tor<int>. Deber
la
ual
ontenga las
preorder-iterator,
rbol.
Un iterador es una abstra
in de un puntero y debe mnimamente denir los
siguientes operadores:
operator==(): operador de
operator++():
ompara in (igualdad).
146
operator*():
operador de
ref_ ount_ptr
ontadores de referen
ias. Cuando el ltimo puntero a un objeto dado est por
destruirse, ste deber destruir al objeto apuntado.
147
Captulo 8
Con
urren
ia
En este
aptulo se abordan
on
eptos sobre eje
u
in
on
urrente de varias unidades de eje
u
in.
Algunos programas, se pueden es
ribir ms f
ilmente
omo un
onjunto de a
tividades que eje
utan independientemente. Tales programas se denominan
on
urrentes.
Programas que intera
tan
on el ambiente
omo agentes (o servi
ios), interfa
es
gr
as de usuario (GUIs), sistemas operativos, et
, se es
riben naturalmente
omo
un sistema
on
urrente.
Cada una de esas a
tividades eje
utndose en forma
on
urrente puede intera
tuar, en algn punto del programa,
on otras. Por ejemplo, pueden
ompartir
iertos
re
ursos (variables, ar
hivos, et
) y en mu
hos
asos es ne
esario un me
anismo de
sin
roniza
in para el a
eso a los mismos.
Los programas se es
riben siguiendo alguna lgi
a de
omportamiento de sus partes,
omo por ejemplo, siguiendo diseos
liente-servidor o produ
tor-
onsumidor.
Los modelos de eje
u
in
on
urrentes pueden
lasi
arse en dos esquemas:
1. memoria
ompartida (shared memory) :
ada a
tividad o mdulo
on
urrente del
sistema a
ede a un rea de memoria
omn. El me
anismo natural de
omuni
a
in entre las a
tividades es el uso de variables
ompartidas. En este modelo,
ada a
tividad se denomina
omnmente un hilo (thread) de eje
u
in.
2. pasaje de mensajes (message passing) : las a
tividades tienen su propia rea de
memoria y se
omuni
an por medio de mensajes, los
uales se envan por
anales
148
Con urren ia
{ByNeed P X},
los am-
Ahora la mquina soportar mltiples pilas semnti
as, por lo que un estado de
eje
u
in ser un par
(M ST, ),
donde
M ST
([< s >, ], )
1 La
Con urren ia
dor (s
heduler).
La mquina termina su eje
u
in si todas las pilas semnti
as estn en estado -
nalizadas (terminated).
La semnti
a de la senten
ia thread se dene
omo
({[thread
<s>end,E]
donde el operador
+ ST }
M ST , ) ({[(<s>,E)]}
ST
M ST , )
es la on atena in
La eje
u
in de una senten
ia thread
rea un estado donde el
uerpo del thread se
eje
uta en el
ontexto de una nueva pila semnti
a.
El administrador de la memoria requiere ser extendido:
Una pila semnti
a terminada (terminated) puede ser eliminada.
Una pila semnti
a bloqueada puede re
lamarse si es que su
ondi
in de a
tiva
in depende de una variable inal
anzable. Es f
il de ver que una pila semnti
a
en estas
ondi
iones nun
a podr pasar al estado a
tivo (runnable).
En este modelo toman importan
ia las senten
ias bloqueantes o suspendibles. En el
modelo se
uen
ial, una senten
ia al bloquearse tiene
omo efe
to la suspen
in de la
eje
u
in de la mquina, ya que dispona de una ni
a pila semnti
a.
En el modelo
on
urrente, una pila semnti
a puede pasar a estado suspendido
(por ejemplo en una senten
ia
if
en el futuro la mquina podr eje
utar otra senten
ia (de otra pila semnti
a) que
ligue tal variable, lo que har que la pila anterior pase al estado runnable nuevamente.
Este es un me
anismo de sin
roniza
in entre threads y se
ono
e
omo variables
data ow o data driven ya que se basa en el ontrol de ujo de datos de las variables.
150
Con urren ia
de senten
ias de diferentes threads de eje
u
in en
ada paso. Estas opera
iones realizadas a gran velo
idad, tal
omo lo pueden ha
er las
omputadoras a
tuales, pueden
dar la ilusin de eje
u
in simultnea de los diferentes threads.
Esta forma de eje
u
in se
uen
ial de senten
ias de diferentes threads en
ada
i
lo,
se denomina inter
ala
in (interleaving).
Un sistema de
omputa
in
on varias mquinas, operando simultneamente, permitir eje
u
in realmente simultnea o en paralelo, por lo que estos sistemas se denominan sistemas paralelos.
En ambos sistemas de
omputa
in (ni
a o mltiples mquinas), el orden de las
omputa
iones de los diferentes threads o programas est
ontrolada por el sistema, no
por el programador o usuario, por lo que lleva a que la eje
u
in sea no determinsti
a.
El no determinismo en el orden de eje
u
in de las senten
ias, puede ha
er que los
resultados de un programa sean diferentes en dos trazas de eje
u
in distintas. En el
modelo
on
urrente de
larativo, sto no puede su
eder, ya que las variables toman un
ni
o valor (no pueden ser modi
adas), por lo que se
ono
e
omo determinismo no
observable.
Dado un programa
on
urrente, sus pasos de eje
u
in forman un orden
ausal, el
ual es un orden par
ial (a diferen
ia de un programa se
uen
ial que forma un orden
total).
Deni in 8.1.1
I1
I2
si
T2
Ia
Ib
Ic
I1
Ia
Ib
I1
Ic
I2
Ia
I1
Ib
Ic
I2
sj
si ambas
I2
T1
Ia
Ib
Ic
a) Orden causal
...
b) Posibles ordenes (interleaving)
T1 y T2 y algunas
posibles se
uen
ias dadas por interleaving. La rela
in de orden
ausal del ejemplo,
puede des
ribirse por extensin
omo
Deni in 8.1.2
in ( onstraint).
151
restri -
Con urren ia
Deni in 8.1.3
Deni in 8.1.4
c1
y ada restri in
c, values(x, c)
c.
ontiene el
c2
son
x, values(x, c1 ) = values(x, c2 ).
En el modelo
on
urrente de
larativo pueden o
urrir dos
osas para todas las eje
u
iones posibles de un programa:
1. puede no terminar, o
2. puede terminar par
ialmente (
omputar valores par
iales) y di
hos valores son
lgi
amente equivalentes.
Esto impli
a que el no determinismo en el orden de las eje
u
iones de las senten
ias del programa
on
urrente, no es visible, ya que siempre se obtienen resultados
equivalentes.
152
Con urren ia
La segunda ausa estable e que el s heduler debe determinar un intervalo de tiempo mximo de eje u in para ada thread. Este intervalo se denomina time sli e o
Threads
(concurrencia cooperativa)
Procesos
(concurrencia competitiva)
Figura 8.2: Pro
esos o tareas y threads
Para dar algn grado de
ontrol sobre la eje
u
in de los threads en un programa,
generalmente los sistemas de threads ofre
en algunas fun
iones sobre threads. Oz ofre
e
el mdulo
Thread que ontiene las opera iones sobre threads (entre otras) que se listan
en la tabla 8.3.
153
Con urren ia
Opera in
Des rip in
{Thread.this}
{Thread.state T}
{Thread.suspend T}
Suspende al thread T
{Thread.resume T}
A tiva al thread T
{Thread.preempt T}
{Thread.terminate T}
{Thread.wait T}
8.3.1. Corrutinas
Una
orrutina es un thread no interrumpible. Una
orrutina abandona la
pu en
forma voluntaria.
Las
orrutinas tienen dos opera
iones fundamentales:
Spawn P:
8.3.2. Barreras
Una barrera (barrier) es una opera
in de
ontrol de eje
u
in
on
urrente que
permite estable
er un punto de en
uentro (punto de sin
roniza
in) de diferentes
omponentes
on
urrentes (threads o pro
esos). Una barrera permite estable
er un punto
de eje
u
in que requiere que otros
omponentes al
an
en antes de poder
ontinuar.
Una barrera tambin se
ono
e
omo rendezvous.
...
{Barrier [X1 X2 ... Xn}
Figura 8.4: Ejemplo de una barrera (rendezvous).
La gura 8.4 muestra un ejemplo de una barrera usando variables data-ow, donde
el pro
edimiento
...Xn estn
Barrier suspende al thread orriente hasta que las variables X1, X2,
ligadas.
Las barreras generalmente denen puntos de sin ronoza in en base a requerimientos del omputa in del programa: dada una barrera, el thread no puede ontinuar
154
Con urren ia
{ByNeed P Y},
la ual tiene
{ByNeed P Y}.
E(< y >)
memoria de triggers
2. si
es
a la
uerpo)
y,
trig(x, y)
y
En la a
tiva
in de un trigger
1. Eliminar
trig(x, y)
trig(x, y)
o se est ligando a
y.
de la memoria de triggers
y > y}).
argumento ligado a
y.
x
y
es al anzable si
trig(x, y)
es al anzable.
trig(x, y) ,
el trigger
trig(x, y)
se
155
Con urren ia
La abstra
in lingsti
a
trminos de
ByNeed.
dene a la fun in
en
Lazy streams:
innita, (una lista
uya
ola est dada por una variable no ligada). Las tuberas
(pipes) de los sistemas tipo Unix son un ejemplo de streams. Es
omn en algunos lenguajes fun
ionales que se denan listas por
omprensin, las
uales se
evaluarn en forma perezosa.
Operadores de alto orden:
omo iteradores o ltros que apli
an una fun
in
a
ada elemento de una lista, la
ual se va
onstruyendo bajo demanda.
siempre debern
ompletarse las opera
iones antes de los ven
imientos
orrespondientes.
Las apli
a
iones de tiempo real duro,
omo por ejemplo, apli
a
iones de
ontrol en
veh
ulos, equipos mdi
os, sistemas de
omuni
a
iones, et
, requiere soporte tanto de
hardware
omo de software (sistema oeprativo).
Las apli
a
iones de tiempo real blando no tienen ven
imientos estri
tos y pueden
implementarse usando las siguientes opera
iones (denidas en el mdulo
{Delay I}:
Time):
rosegundos.
156
mi-
Con urren ia
{Alarm I U}:
(a
unit
mi rosegundos.
{Time.time}: retorna el nmero de segundos desde una fe ha dada (ej: el omienzo del ao orriente).
variable
X).
eje uta
En este
aso una de las dos opera
iones de ligadura deber fallar (la que se eje
ute
despus). Por esto el thread en el
ual falle la opera
in de bind deber disparar una ex
ep
in, dndole la opertunidad al thread de re
uperarse, si es que atrapa la ex
ep
in.
Un problema adi
ional surge
on eje
u
in por ne
esidad. Cul debera ser el
omportamiento de un disparo de un trigger y la
omputa
in de la fun
in involu
rada
falla?
Si la variable a ligar
on el resultado de la fun
in no se liga, el thread que demanda
el valor de la fun
in no lograr su objetivo. Si la eje
u
in de la fun
in aso
iada al
trigger falla, a qu valor debera ligarse la variable a aso
iar al resultado de la fun
in?
Una solu
in posible es ligar la variable a ligar
on el retorno de la fun
in a un
valor espe
ial.
El valor espe
ial podra ser
annotCal ulate.
por alguna fun in primitiva de la mquina abstra ta. Esa fun in se denominar
FailedValue.
pro
{ByNeed2 P X}
{ByNeed
pro
{$ X}
try
Y in {P Y} X=Y
at
h E then X={FailedValue E}
end
end
X
}
end
El pro
edimiento
sula la ex ep in en un valor
157
Con urren ia
Deni in 8.6.1
1 , 2 . . . y 1 , 2 . . .,
i y j , si en
ada traza de
j .
respe tivamente, un
entre
dataow : ( on evalua in estri ta). Las opera iones que requieren un valor, debern esperar hasta que el valor est disponible.
impl
ita : los puntos de sin
roniza
in no son visibles en el texto del programa,
omo en el modelo de
on
urren
ia de
larativa des
ripto hasta ahora.
expl
ita : los puntos de sin
roniza
in son visibles en el programa y generalmente
toman la forma de opera
iones que implementan
errojos (lo
ks) o monitores,
omo se des
riben en la se
in 8.7.
x.
158
Con urren ia
lo
al X in
X := 0
thread X := X + 1 end
thread X := X * 2 end
{Browse X}
end
Figura 8.5: Ejemplo una
ondi
in de
arrera.
El problema es que varios threads pueden estar a
tualizando una misma variable y,
omo en el ejemplo mostrado, pueden o
urrir
ondi
iones de
arrera (ra
e
onditions).
La situa
in mostrada en el programa ha
e que no sea posible es
ribir un invariante
on pre
isin ya que en un punto de programa dado, el valor de una variable puede
ser in
ierto.
lass Sta
k
attr S
attr top
meth Push(V) S := V|S top := top + 1 end
meth Pop(?V) in lo
al S1 in S = V|S1 S := S1 top := top - 1 end
end
Figura 8.6: Ejemplo una
ondi
in de
arrera.
terminada. Nuevamente, se deja al le
tor el ejer
i
io, dar una se
uen
ia de eje
u
in
que invalide dado.
Para poder espe
i
ar invariantes mas pre
isos en un programa, se requiere que se
introduz
an puntos de sin
roniza
in, es de
ir que se se
uen
ializen
iertas opera
iones
o que se garanti
en que
iertas se
uen
ias de senten
ias, sobre
iertos datos
ompartidos, no puedan ser interrumpidas por el s
heduler. Estos bloques de se
uen
ias que
deben eje
utarse sin interrup
in se
ono
en
omo regiones
rti
as y se di
e que deben eje
utarse en forma atmi
a (
on respe
to a los dems threads que a
eden a los
mismos re
ursos o variables).
La programa
in
on
urrente
on estado
ompartido
onsiste prin
ipalmente en el
re
ono
imiento y sin
roniza
in de las regiones
rti
as.
El re
ono
imiento de regiones
rti
as requiere que se indentiquen puntos del programa en el que podran o
urrir
ondi
iones de
arrera. Esta a
tividad es realmente
dif
il,
omo se puede apre
iar en las listas de errores reportandos en proye
tos de
software
omo sistemas operativos, servidores de bases de datos, et
.
159
Con urren ia
Semforos: un semforo, inventados por Dijkstra, es una variable (de tipo entera) espe ial protegida (ADT), el ual puede ser manipulada por tres opera iones:
si es que su valor
V(s):
que les dio Dijkstra, por Proberen (probar) y Verhogen (in rementar), respe tivamente.
P c(s)
V c(s)
Monitores:
realizadas sobre
s.
wait)
signal).
y noti a in
de ondi iones (
Transa iones:
tes .
2 Un
lo
k reentrante permite que se aniden lo
ks por parte del mismo thread, sin bloquearlo.
160
Con urren ia
{NewLo
k L}:
{IsLo
k L}:
rea un nuevo lo k
retorna
L.
true si L refern ia un lo k.
lo k X then <s>end:
protege a la senten ia
lo k y unlo k y algunas opera iones de ontrol sobre thThread.wait y Thread.resume) es posible implementar todos los dems
Asin rni o:
su eje
u
in. Generalmente un pro
eso que lee datos del
anal deber esperar
(bloquear) hasta que el
anal
ontenga al menos un mensaje.
Este me
anismo generalmente requiere que el
anal disponga de un buer.
Asin
rni
o: un pro
eso que desee enviar un mesaje deber esperar a que otro
pro
eso reali
e una le
tura por el otro extremo. Este me
anismo de pasaje de
mensajes a
ta tambin
omo me
anismo de sin
roniza
in.
161
Con urren ia
NewPort S P:
Send X P:
X por el
puerto
S.
P.
lo
al P S in
{NewPort S P}
thread for I in {Generator} do {Send I P} end end
thread for M in S do {Browse M} end end
end
Figura 8.7: Ejemplo de produ
tor-
onsumidor
on mensajes y puertos.
.
La senten
ia
para el puerto,
Bind(E(<y>),n) y
E(<y>):E(<x>) a ,
1. si la ondi in de a tiva in de
siguientes pasos:
E(<x>) (E(<x>)
es determinada) es falsa
3. si
ontiene el par
E(<x>):z, enton es
ha er
z' en la memoria ,
E(<x>):z en
on E(<x>):z',
lista de la forma E(<y>)|z',
Bind(z',z)
162
Con urren ia
163
Con urren ia
Los proto olos llamados web servi es son proto olos al estilo RPC o RMI, generalmente implementados sobre el proto olo HTTP, el ual fue diseado para la World
8.9. Deadlo
k
El uso de me
anismos de sin
roniza
in en el modelo
on
urrente
on estado, trae
problemas adi
ionales en el diseo e implementa
in de programas
on
urrentes.
Es posible es
ribir un programa en el
ual varios
omponentes a
ediendo, en forma
ontrolada por me
anismos de sin
roniza
in, a
iertos re
ursos podra al
anzar un
estado en el
ual dos o ms threads o pro
esos podran quedar esperndose mutuamente
para a
eder a los re
ursos.
Este estado que imposibilita el progreso de
omponentes de un sistema
on
urrente
se
ono
e
omo deadlo
k (abrazo mortal).
La gura 8.8 muestra un esquema de un programa en el que podra o
urrir deadlo
k.
T1 = thread
...
lo
k X in
... (1)
lo
k Y in
...
end
...
end
T2 = thread
...
lo
k Y in
... (2)
lo
k X in
...
end
...
end
El thread
thread
ex lusin mutua:
ursos.
164
Con urren ia
no quita de re ursos: ningn thread o pro eso puede quitar en forma ompulsiva un re urso a otro thread.
espera ir ular:
requerimientos de re
ursos que tratan de a
eder los threads y los re
ursos que
estn reteniendo. Esta rela
in puede modelarse
omo un grafo.
El programador de apli
a
iones, generalmente no tiene
ontrol sobre las tres primeras
ondi
iones, ya que la primera es un requermiento para una solu
in
orre
ta
del problema y las dos siguientes son
ondi
iones impuestas por el sistema.
Por lo tanto, generalmente, deber es
ribir los programas de tal forma para evitar
la espera
ir
ular.
Esto se puede lograr si
ada thread a
ede a los re
ursos en un determinado orden,
perdiendo tal vez, algn grado de
on
urren
ia por el bloqueo temprano de re
ursos
on respe
to a su uso
on
reto.
Runnable.
Thread
o implementando
run(),
el
ual har de senten
ia ini
ial a eje
utarse
uando se ini
ie el nuevo thread.
Cada objeto que sea un thread puede ser (o
omportarse
omo) un monitor.
Una senten
ia (bloque) puede ha
erse atmi
a usando la palabra reservada
syn hronized.
Esta keyword tambin puede ser apli
ada en la deni
in de un mtodo, lo que ha
e
que el mtodo se eje
ute dentro del monitor del objeto. Esto no ha sido una de
isin
muy a
ertada en el diseo del lenguaje, ya que
digo (ej: un mtodo) no sin
ronizado
puede a
eder a los atributos del objeto sin
ontrol del monitor.
Un monitor en un objeto Java soporta las opera
iones
wait() y notify()3.
Estas opera iones slo son posibles dentro de un monitor, es de ir en digo pro-
syn hronize.
tegido por
wait():
1. El thread
orriente se suspende.
2. El thread es
olo
ado en la
ola de threads suspendidos del objeto (wait
set).
3. Se libera el lo
k sobre el objeto.
3 Tambin
existe la opera
in notifyAll(), la
ual desbloquea a todos los threads en ese monitor.
165
Con urren ia
notify():
1. Un thread
2.
T se
3.
T ontina
La opera in
notifyAll() ha e
lo mismo que
notify(),
i5
----> T3
i3 / i4
---->/----> T2
i0 / i1 i2
---->/---->---->
T1
a ) Dar el orden
ausal (orden par
ial de eje
u
in de las instru
iones).
b ) Dar todos las posibles trazas de eje
u
in dadas por el interleaving.
2. Eje
utar manualmente, siguiendo la semnti
a del lenguaje
on
urrente de
larativo del siguiente programa:
lo
al X,Y in
X = 1
thread fun {$}
Y = X
X+1
end
end
thread fun {$} Y end end
{Browse X Y}
end
3. Implementar en Oz un pro
edimiento
ha er esperar (blo-
se om-
166
Con urren ia
on un ero.
b ) Correr dos (o ms) instan ias del programa en forma se uen ial (ej:
; prog) y
) Correr dos (o ms) instan ias del programa en forma on urrente (ej:
& prog) y
prog
prog
167
Con urren ia
obje
ts.
12. Implementar un programa
on
urrente en Oz
on estado que
ontenga al menos
dos threads realizando a
iones sobre una instan
ia de la
lase
Sta k denida en
este
aptulo. Utilizar lo
ks para atomizar las opera
iones sobre el sta
k.
13. Implementar en Oz y Java una
lase
Semaphore
Produ er
Consumer
que representen
Buffer.
lass Buffer
int[ buf;
int first, last, n, i;
publi
void init(int size) {
buf=new int[size;
n=size; i=0; first=0; last=0;
}
publi
syn
hronized void put(int x) {
while (i<n) wait();
buf[last=x;
last=(last+1)%n;
i=i+1;
notifyAll();
}
publi
syn
hronized int get() {
int x;
while (i==0) wait();
x=buf[first;
first=(first+1)%n;
i=i-1;
notifyAll();
return x;
}
}
15. Qu su
edera si en la
lase
Buffer
168
Con urren ia
16. Modi
ar el programa Java del produ
tor-
onsumidor usando los semforos denidos anteriormente.
17. El problema de los lsofos
omensales es un problema
lsi
o para el estudio
de deadlo
ks. Existen
momento y luego toman dos tenedores que se en
uentran al lado del plato y
omen, para nalmente dejar los tenedores nuevamente en la mesa.
Cada lsofo tiene un plato y hay
169
Captulo 9
1 , Pro-
hoi
e produ
e un aumento exponen
ial del espa
io de bsqueda en bus
a de solu
iones. Es muy pr
ti
a
uando el espa
io de bsqueda es pequeo, no obstante suelen
utilizarse t
ni
as apropiadas de optimiza
in, bsqueda utilizando heursti
as o introdu
iendo restri
iones
uando el espa
io de bsqueda es
onsiderable.
set de alternativas. Si la elegida llega a fallar enton
es elige otra del
onjunto.
Cada vez que ha
e una ele
in determina lo que se llama un punto de ele
in.
Un punto de ele
in es una parte de la mquina abstra
ta que en
apsula la
1 Un
informa
in ne
esaria para poder retro
eder (ba
ktra
king ) en la eje
u
in y
elegir otra alternativa.
Fail. Indi
a que la alternativa es erronea. Un fail es eje
utado impl
itamente
uando se intenta ligar dos valores in
ompatibles (ej. 3=4).
Ejemplo:
hoi
e va eligiendo las alternativas en el orden que ellas son en
ontradas (de izquierda
a dere
ha). Cuando un fail es eje
utado, se produ
e un retro
eso de la eje
u
in a
la ltima alternativa elegida del
hoi
e, el
ual elige la proxima alternativa, y asi
su
esivamente. Esta estrategia puede ser ilustrada
on un arbol de busqueda (ver gura
9.1).
171
172
Modularidad : permite que se puedan eje
utar mas de un programa rela
ional
on
urrentemente.
fun {SolveOne F}
L={Solve F}
in
if L==nil then nil else [L.1 end
end
fun {SolveAll F}
L={Solve F}
pro
{Tou
hAll L}
if L==nil then skip else {Tou
hAll L.2} end
end
in
{Tou
hAll L}
L
end
Ejemplos:
173
fun {Digit}
hoi
e 0 [ 1 [ 2 [ 3 [ 4 [ 5 [ 6 [ 7 [ 8 [ 9 end
end
{Browse {SolveAll Digit}}
Devuelve: [0 1 2 3 4 5 6 7 8 9
174
<s>
T (< s >).
La deni in de pro edimientos son tradu idas en deni iones de predi ados. Las ex ep iones no son tradu idas.
X=Y <s>
<s> X=Y
if X==Y then s else fail end
175
X = Y T (s),
opera
ionales son muy diferentes. Es
ribir un programa lgi
o
onsiste de 2 partes:
es
ribir la semanti
a lgi
a y enton
es elegir una semnti
a opera
ional para esta. El
arte de la programa
in lgi
a es ha
er un buen balan
eo entre una simple semnti
a
lgi
a y una e
iente semnti
a opera
ional.
Ejemplo: Deterministi
Append
fun {Append A B}
ase A
of nil then B
[ X|As then X|{Append As B}
end
end
Tradu
ido a un pro
edimiento:
176
la misma sintaxis, las opera
iones determinsti
as realizan
l
ulos fun
ionales,
mientras que las no deterministi
as
l
ulos rela
ionales.
9.3. Prolog
Es un lenguaje de programa
in ideado a prin
ipios de los aos 70 en la universidad
de Aix-Marseille por los profesores Alain Colmerauer y Phillipe Roussel. Ini
ialmente se trataba de un lenguaje totalmente interpretado hasta que, a mediados de los
70, David Warren desarroll un
ompilador
apaz de tradu
ir Prolog en un
onjunto de instru
iones de una mquina abstra
ta denominada Warren Abstra
t Ma
hine
(WAM). Desde enton
es Prolog es un lenguaje semi-interpretado.
Los programas en Prolog se
omponen de
lusulas de Horn que
onstituyen reglas
del tipo 'modus ponens'. No obstante, la forma de es
ribir las
lusulas de Horn es al
ontrario de lo habitual. Primero se es
ribe el
onse
uente y luego el ante
edente. El
ante
edente puede ser una
onjun
in de
ondi
iones que se denomina se
uen
ia de
objetivos. Cada objetivo se separa
on una
oma y podra
onsiderarse similar a una
llamada a pro
edimiento de los lenguajes imperativos. En Prolog no existen instru
iones de
ontrol.
Su eje
u
in se basa en dos
on
eptos: la uni
a
in y el ba
ktra
king.
Gra
ias a la uni
a
in,
ada objetivo determina un sub
onjunto de
lusulas sus
eptibles de ser eje
utadas. Cada una de ellas se denomina punto de ele
in. Prolog
sele
iona el primer punto de ele
in y sigue eje
utando el programa hasta determinar
si el objetivo es verdadero o falso. En
aso de ser falso entra en juego el ba
ktra
king,
que
onsiste en desha
er todo lo eje
utado situando el programa en el mismo estado
en el que estaba justo antes de llegar al punto de ele
in. Enton
es se toma el siguiente punto de ele
in que estaba pendiente y se repite de nuevo el pro
eso. Todos los
objetivos terminan su eje
u
in bien en xito ('verdadero'), bien en fra
aso ('falso').
Smbolos de Variables :
representan objetos
ualesquiera del universo. Comienzan siempre
on mays
ulas. Ejemplos de variables son: L, L2, Persona, _ (variable annima). Una
variable puede estar ligada
uando existe algn objeto representado por ella, o
no ligada en
aso
ontrario.
177
Atomos :
Las estru
turas de tipo predi
ado tambin se denominan tomos. Se di
e que un
tomo es
errado
uando sus argumentos son variables ligadas, y que no lo es
uando tiene un argumento sin ligar.
Listas :
Una lista est formada por un primer elemento (head ) mas una lista (tail ).
Ejemplos:
tas y reglas.
Un he
ho es algo que siempre es verdadero en un determinado universo. La sintaxis
de los he
hos y las preguntas es la misma. Ejemplo:
Programa 1:
1.es_padre(tera
h, abraham).
2.es_padre(tera
h, na
hor).
3.es_padre(tera
h, haran).
4.es_padre(abraham, isaa
).
5.es_padre(haran, lot).
6.es_padre(haran, mil
ah).
7.es_padre(haran, yis
ah).
8.es_madre(sarah, isaa
).
9.es_hombre(tera
h).
10.es_hombre(abraham).
11.es_hombre(na
hor).
12.es_hombre(haran).
13.es_hombre(isaa
).
14.es_hombre(lot).
15.es_mujer(sarah).
16.es_mujer(mil
ah).
17.es_mujer(yis
ah).
x : suma(0, x, x).
178
Equivale a un onjunto de he hos de base omo seran: suma(0, 1, 1), suma(0, 2, 2), et .
PREGUNTA
SIGNIFICADO
?es_padre(abraham,isaa ).
es padre Abraham de
S, pues en uentra
RESPUESTA
Isaa ?
un he
ho que lo
satisfa
e.
?es_padre(abraham,lot).
es padre Abraham
No,
de Lot?
? es_padre(haran,X).
es padre Haran de X?
Las reglas son estru
turas
omplejas
ompuestas por varios tomos. Constan de
dos pares: una
abeza, formada por slo tomo; y un
uerpo, en el que pueden apare
er
varios tomos. Adems de las reglas entran en juego los operadores lgi
os que son
la
onjun
in (representada por las
omas que separan los tomos del
uerpo ), y la
disyun
in, que puede es
ribirse de 2 maneras: separando
on punto y
oma los tomos
del
uerpo, o poniendo
ada miembro de la disyun
in en una
lusula aparte.
Ejemplo:
Una regla que expresa la rela
in de ser hijo es: es_hijo(X,Y) :- es_padre(Y,X),
es_hombre(X). que se leera de la forma:'para todo X e Y, X es hijo de Y si Y es padre
de X y X es hombre',
on lo que sirve para denir una nueva rela
in a partir de otras.
NOTA: Esta regla representa la frmula: xy((es_padre(y, x) es_hombre(x))
es_hijo(x, y)). De igual forma se deniran otras rela
iones mediante reglas: es_hija(X,Y):es_padre(Y,X),es_mujer(X). es_abuelo(X,Z):- es_padre(X,U), es_padre(U,Z).
El smbolo (:-) se lee
omo una impli
a
in lgi
a, pero al revs, es de
ir, si el
uerpo de la
lusula es verdadero enton
es la
abeza es verdadera. Podramos enton
es
es
ribir los he
hos
omo:
179
Debemos rearmar que en Prolog todo es predi
ado, ya que los operadores lgi
os
lo son. As podramos es
ribir en nota
in preja: :-(A,B), en lugar de A:-B.
Con estas tres nuevas rela
iones entre objetos y los he
hos de base del Programa 1
se puede
rear el siguiente Programa 2.
Programa 2:
18.es_hijo(X,Y):- es_padre(Y,X), es_hombre(X).
19.es_hija(X,Y):- es_padre(Y,X), es_mujer(X).
20.es_abuelo(X,Z):- es_padre(X,Y), es_padre(Y,Z).
Algunas
onsultas que se pueden efe
tuar al programa 2 son:
? es_hijo(lot,haran).
Respuesta: S, este he
ho puede dedu
irse, ya que segn la regla
18 es equivalente a preguntar:
?es_padre(haran,lot),es_hombre(lot).
? es_hija(X,haran).
180
Los predi ados y fun iones se denominan literales y pueden ser de dos tipos: litera-
yun
in ( |), y
onjun
in. Esta ltima no se representa expl
itamente pero
uando
tenemos un
onjunto de
lusulas, stas estn rela
ionadas impl
itamente mediante
onjun
in.
No se ne
esitan mas
one
tivas lgi
as dado que el impli
a y
oimpli
a pueden defnirse
en trminos de los anteriores.
AB
A|B.
Hay un tipo de
lusulas que resulta espe
ialmente ade
uado para la prueba de
teoremas
on el prin
ipio de resolu
in. Son las
lausulas de Horn. Se denen
omo
aquellas
lusulas que tiene
omo mximo un literal no negado. De ello se desprende
que hay dos tipos de
lusulas de Horn :
En
abezadas: tienen un literal no negado. En prolog son las
lusulas que usamos
para expresar las reglas y los he
hos.
No en
abezadas: todos sus literales son negados. En prolog las utilizamos para
formular las preguntas, o di
ho de otra forma, son los teoremas que queremos
probar (:
es_hija(X, haran).).
o hiptesis y las que se van obteniendo de ellas, teoremas o resolventes, de los
uales
pueden ser utilizados para obtener nuevos resolventes. Hay dos
asos parti
ulares de
esta ley:
A B
de
y de
y de
se deriva
(modus ponens).
Esto ha
e que el prin
ipio de resolu
in fun
ione bien
omo mtodo de redu
in
al absurdo. As, dado un
onjunto
onsistente de axiomas, se puede probar un teorema
(nuestro objetivo, que es una
lusula sin en
abezar) negndolo en el punto de partida y pro
ediendo a llevar a
abo la resolu
in de dos en dos
lusulas, eliminando
de ambas los literales que '
oin
idan',
on la ni
a diferen
ia de que en una de las
lusulas el literal ha de estar armado y en la otra negado, o tal
omo se en
ontrara
en prolog, que en una
lusula se en
uentre a la izquierda del :- (
abeza ), y en la otra a
181
la dere
ha (
uerpo ). Esta '
oin
iden
ia' de dos literales uno armado y el otro negado,
se denomina
uni a in
ARON (y)|HIJO(y, x)
ARON (juan)
uni a in.
182
Este razonamiento puede resumirse de la siguiente manera: para probar la existen
ia de algo, suponer lo
ontrario y usar modus ponens y la regla de elimina
in del
uanti
ador universal, para en
ontrar un
ontra ejemplo al supuesto. El objetivo es
onvertido en un
onjunto de tomos a ser probados. Para ello, se sele
iona un literal
del objetivo
p(t1, ..., tn) : A1, ...An para enp(s1, ..., sn) y p(t1, ..., tn), es de
ir, una sustitu
in
p(t1, ..., tn) sean idnti
os. Tal sustitu
in se
ono
e
omo
uni ador.
original, por los tomos de la
lusula sele
ionada, apli
ando a todos los tomos obtenidos de esta manera.
El paso de
omputa
in bsi
o, puede verse
omo una regla de inferen
ia puesto
que transforma frmulas lgi
as y se denomina prin
ipio de resolu
in SLD.
Observar que generalmente, la
omputa
in de estos pasos de razonamiento no
es determinista:
ualquier tomo de la meta puede ser sele
ionado y pueden haber
varias
lusulas del programa que uniquen
on el tomo sele
ionado. Otra fuente
de indeterminismo es la existen
ia de uni
adores alternativos para dos tomos. Esto
sugiere que es posible
onstruir mu
has solu
iones (algunas ve
es, una
antidad innita
de ellas). Por otra parte, es posible tambin que el tomo sele
ionado no unique
on
ninguna
lusula en el programa. Esto indi
a que no es posible
onstruir un
ontra
ejemplo.
Uni
a
in
Para denir la uni
a
in formalmente son ne
esarias algunas deni
iones previas:
Deni in 9.3.1
Una
(1 i n).
c = es_padre(Y, X), es_hombre(X), y la
in s = {Y haran, X lot}, la pregunta obtenida al apli
ar s a c ser:
c s = es_padre(haran, lot), es_hombre(lot).
la variable vi por el trmino ti
Deni in 9.3.2
s ,
s s de la siguiente forma:
s = {v1 t1, v2 t2, . . . , vn tn}
in
Si
sustitu-
s = {w1 t 1, w2 t 2, . . . , wn t n},
183
enton es
s y s' se veri a: (c s) s = c (s s ).
iones
p(X, f (Z)).
c1
c1 y c2,
c2'. Por
ejemplo, dado
s1 = {X a, Y f (a), Z a}
s tal que c1 s = c2 s,
c1 = p(a, Y ) y dado c2 =
es una sustitu in
ya que
s2 = {X a, Y f (f (a)), Z f (a)}
c1
c2:
c1 s1 = c2 s1 = p(a, f (a)).
ya que
c1 s2 = c2 s2 = p(a, f (f (a))).
on alguna otra
la
Existe un algoritmo para de
idir si dos tomos son uni
ables (esto es, si existe
para ellos algn uni
ador). Este algoritmo siempre termina. Si los tomos son uni
ables el algoritmo devuelve el umg de ellos, en otro
aso, devuelve 'fra
aso'.
En el algoritmo se utiliza la no
in de '
onjunto de disparidad' de dos tomos, denido
omo el
onjunto formado por los dos trminos que se extraen de di
hos tomos
a partir de la primera posi
in en que dieren en un smbolo. Por ejemplo, el
onjunto
de disparidad de
de disparidad de
f racaso
Algoritmo:
g := set va
io
fra
aso := falso
184
c1
c2
Salida: el umg
de
c1
c2
que
El pro
eso
ontinuar de igual forma hasta obtener la pregunta va
a (lo que
orresponde a un xito ), o una pregunta para la
ual no exista resolvente
on ninguna senten
ia del programa (lo que
orresponder a un fra
aso ). Esta estrategia de resolu
in
que sigue PROLOG se denomina
La se uen ia de
?es_hijo(lot, haran).
es_hijo(lot, haran)
185
s.
En
ada paso del pro
eso de resolu
in se obtiene un uni
ador ms general (umg ).
La
omposi
in de todos estos uni
adores da lugar a las ligaduras que han tomado
las variables nalmente para llegar a la respuesta. En el ejemplo:
g1, g2
Si de este
Z = haran.
186
que restringido
que restringido a
Z = milcah; Z = yiscah
rel :- a, b, !,
.
rel:- d.
Se indi
a al interprete que solo busque la primera solu
in que en
uentre para las
sub
onsultas
b.
En ambio para
187
rel
188
irresponsable.
no(P) :- P, !, fail.
no(P).
Append
nodetermi-
nisti
a (usar la senten
ia
hoi
e ) que se
omporte logi
amente
orre
ta para
ualquier patron de inputs y outputs (help: todos los parmetros deben ser
de salida).
e ) Problema de las
posi
iones de
nreinas.
que las
b)
pertenece[L, L1]. L
L1.
elimina(X, Y S, ZS]. ZS
a)
tos de la lista
est en la lista
189
A.
de
Y S.
d)
e)
Interseccin, unin
f ) Problema de las
dif erencia
si la lista
Ys
es el resultado de insertar el
de onjunstos.
nreinas.
190
Bibliografa
[1 Peter Van Roy and Seif Haridi. Con
epts, Te
hniques and Models of Computer
http://www.open ++.org.
191
ndi
e de guras
1.1.
13
1.2.
. . . . . . . . . . . . . . . . . . . . .
15
1.3.
17
2.1.
. . . . . . . . .
24
2.2.
26
2.3.
26
2.4.
28
2.5.
29
2.6.
32
. . . . . . . . . . . . . . . . . .
2.7.
40
2.8.
. . . . . . . . . . . . . . . . . . . . . . . . .
41
5.1.
Ejemplo de un programa C
. . . . . . . . . . . . . . . . . . . . . . . . .
5.2.
. . . . . . . . . . . . . . . . . . .
87
89
5.3.
90
5.4.
94
5.5.
. . . . . . . . . . . . . . . .
6.1.
6.2.
6.3.
6.4.
6.5.
. . . . . . . . . . . . . . 117
6.6.
. . . . . . . . . . . . . . . . . . . . . . . 119
7.1.
7.2.
. . . . . . . . . . . . . . . . . . . 123
7.3.
. . . . . . . . . . . . . . . . . 124
7.4.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
7.5.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
7.6.
7.7.
. . . . . . . . . . . . . . . . . . . . . 132
7.8.
. . . . . . . . . . . . . . . . . . . . . . . 141
192
NDICE DE FIGURAS
7.9.
NDICE DE FIGURAS
. . . . . . . . . . . . . . . . . . . . . . . . . 144
8.1.
8.2.
8.3.
8.4.
8.5.
. . . . . . . . . . . . . . . . . . . . . 159
8.6.
. . . . . . . . . . . . . . . . . . . . . 159
8.7.
8.8.
9.1.
. . . . . . . . . . . . . . . . . . . . . . . . . 153
. . . . . . . . . . . . . . . . . . . 154
. . . . . . . . . . . 164
9.2.
9.3.
9.4.
9.5.
. . . . . . . . . . . . . . . . . . . . . . . 186
193
ndi e de uadros
194
ndi e de algoritmos
195