Professional Documents
Culture Documents
Paradigmas
de
la
Programacin
FaMAF
2016
programa:
sintaxis
y
semn&ca
un
programa
es
la
descripcin
de
un
proceso
dinmico
sintaxis:
texto
del
programa
semn*ca:
cosas
que
hace
una
denicin
precisa
del
signicado
de
un
programa
correcto
sintc&camente
y
a
nivel
de
&pos
lenguaje
objeto
y
metalenguaje
el
metalenguaje
es
el
que
usamos
para
hablar
de
un
lenguaje
objeto
necesitamos
un
lenguaje
para
hablar
de
la
semn&ca
de
los
lenguajes
de
programacin
semn&ca
delimitacin
de
la
semn&ca
de
los
lenguajes
de
programacin
algunas
observaciones
sobre
computabilidad
(captulo
2
de
Mitchell,
no
es
necesario
leerlo
pero
puede
resultarles
interesante
y
es
cor&to)
los
programas
pueden
denir
funciones
parciales
algunos
de
sus
valores
pueden
indenidos
(p.ej.,
si
no
terminan)
algunos
de
sus
valores
pueden
ser
errores
delimitacin
de
la
semn&ca
de
los
lenguajes
de
programacin
intui&vamente,
una
funcin
es
computable
si
hay
algn
programa
que
la
computa
problema:
denicin
dependiente
de
la
implementacin
de
un
lenguaje
de
programacin
concreto,
con
sus
limitaciones
y
par&cularidades
queremos
una
denicin
independiente
(libre!)
de
lenguaje
como
denir
la
clase
de
funciones
computables?
una
clase
de
funciones
matem&cas:
las
funciones
recursivas
parciales
(Church)
las
que
se
pueden
computar
con
una
mquina
idealizada,
abstracta:
la
mquina
de
Turing
cinta
innita,
dividida
en
celdas
un
cabezal
de
lectura
escritura
un
controlador
de
estado
nito
si
se
puede
expresar
en
lambda
clculo
diferentes
aproximaciones
a
la
semn&ca
lambda
clculo
semn&ca
denotacional
semn&ca
operacional
lambda
clculo
apartado
4.2.
de
Mitchell
(no
va
a
entrar
en
el
examen)
lambda
clculo
sistema
matem&co
que
ilustra
conceptos
de
lenguajes
de
programacin
notacin
para
denir
funciones
sistema
de
prueba
para
probar
ecuaciones
entre
expresiones
reglas
de
clculo
(reducciones
lambda)
lambda
clculo:
funciones
una
funcin
es
una
regla
para
encontrar
un
valor
a
par&r
de
un
argumento
los
operadores
de
ligado
ligan
una
variable
en
un
determinado
alcance
x.x
abstraccin
lambda
de
la
funcin
iden&dad
x.(f(gx))
otra
abstraccin
lambda
(x.x)5
una
aplicacin
lambda
clculo:
reduccin
la
reduccin
es
equivalencia
ecuacional
con
direccin
M
N
signica
que
en
un
paso
de
computacin,
la
expresin
M
se
puede
evaluar
a
la
expresin
N
cuando
no
se
pueden
aplicar
ms
reducciones,
se
llega
a
la
forma
normal
lambda
clculo:
ejemplo
de
reduccin
(f.x.f(fx))(y.y+1)2
(x.(y.y+1)((y.y+1)x)2
(x.(y.y+1)(x+1))2
(x.(x+x+1))2
(2+1+1)
3+1
4
lambda
clculo
provee
la
base
para
muchos
conceptos
de
lenguajes
de
programacin
especialmente
adecuado
para
lenguajes
funcionales
captura
la
esencia
del
ligamiento
de
variables
es
un
&po
de
semn&ca
operacional
diferentes
aproximaciones
a
la
semn&ca
lambda
clculo
semn&ca
denotacional
semn&ca
operacional
semn&ca
denotacional
apartado
4.3
de
Mitchell
semn&ca
denotacional
semn&ca
matem&ca
para
programas,
desarrollada
a
nes
de
los
1960
por
Christopher
Strachey
y
Dana
ScoZ
el
signicado
de
un
programa
es
una
funcin
matem*ca,
de
estados
a
estados,
no
un
algoritmo
un
estado
es
una
funcin
que
representa
los
valores
en
memoria
en
un
momento
determinado
durante
la
ejecucin
de
un
programa
mo&vacin
precisin:
matem&ca
en
lugar
de
lenguaje
natural
signicado
puro,
abstrayndose
de
detalles
de
implementacin:
evitar
par&cularidades
de
mquinas
y
lenguajes
especcos
anlisis
de
programas
prueba
de
programas
(sistema
de
&pos,
ujo
de
control)
correc&tud
de
compilador
comparacin
de
lenguajes
no
slo
para
impera&vos:
tambin
se
usa
para
funcionales
en
principio,
cualquier
programa
impera&vo
se
puede
escribir
como
un
programa
funcional
puro
(en
otro
lenguaje)
hZp://en.wikibooks.org/wiki/Haskell/
Denota&onal_seman&cs
&l
para
determinar
la
correc&tud
de
un
programa
op&mizacin
y
anlisis
est&co
no
sirve
para
calcular
&empo
de
ejecucin
o
requerimientos
de
memoria,
para
eso,
mejor
usar
semn&ca
operacional,
en
la
que
se
modelan
los
estados
de
la
mquina
y
las
transiciones
paso
a
paso
asociadas
a
un
programa,
(p.ej.,
reducciones
de
lambda
clculo)
composicionalidad
el
signicado
de
un
programa
se
determina
a
par&r
de
su
texto
composicionalmente
muy
pegado
al
rbol
sintc*co
cada
expresin
&ene
una
denotacin
sucientemente
detallada
para
dar
cuenta
de
su
comportamiento
en
contextos
mayores
resulta
&l
para
hacer
op*mizaciones
sin
cambios
semn&cos
(sus&tuciones,
etc.)
composicionalidad
y
rbol
por
induccin
sobre
la
estructura
del
rbol:
la
semn&ca
de
una
expresin
compuesta
se
construye
composicionalmente
de
la
de
las
expresiones
ms
simples
que
componen
su
rbol
(NO
es
un
algoritmo)
semn&ca
denotacional
de
nmeros
binarios
e ::= n | e+e | e-e
n ::= b | nb
b ::= 0 | 1
el
rbol
de
la
expresin
e
se
escribe
[[e]]
semn&ca
denotacional
de
nmeros
binarios
(2)
denimos
el
signicado
E[[e]]
de
una
expresin
e,
basada
en
su
rbol
sintc&co
[[e]]:
E[[0]] = 0
E[[1]] = 1
E[[nb]] = E[[n]] * 2 + E[[b]]
E[[e1+e2]] = E[[e1]] + E[[e2]]
E[[e1-e2]] = E[[e1]] - E[[e2]]
semn&ca
denotacional
de
nmeros
binarios
(3)
el
valor
del
rbol
sintc&co
de
[[e1+e2]] es
la
suma
de
los
valores
de
los
rboles
[[e1]]
y
[[e2]] esto
no
es
una
denicin
circular
porque
los
rboles
[[e1]] y
[[e2]] son
ms
chicos
que
[[e1+e2]].
expresiones
con
variables
e ::= v | n | e+e | e-e
n ::= d | nd
d ::= 0|1|2|3|4|5|6|7|8|9
v ::= x | y | z | ...
el
valor
de
una
variable
depende
del
estado
de
la
mquina
el
estado
de
la
mquina
es
una
funcin
de
variables
a
nmeros
E[[e]](s)
es
el
valor
de
e en
el
estado
s
E[[x]](s) = s(x)
E[[0]](s) = 0
E[[1]](s) = 1
E[[nd]](s)= E[[n]](s)*10+E[[d]](s)
E[[e1+e2]](s)= E[[e1]](s)+E[[e2]](s)
semn&ca
de
estados,
comandos
estado
=
variables
valores
comando
=
estado
estado
Formalizing the Type System
M ( Skip s, State ) =
semntica de asignacin
evaluar una expresin y asignarla a la
variable
ejemplo: x=a+b
M ( Block b, State )
= if b =
= M ((Block )b2...n , M ((Statement )b1 , )) if b = b1b2 ...bn
ejemplo de semntica de bloque
b1 = !fact = fact * i;!
bloque
b2 =! i = i 1;!
M(b,) = M(b2,M(b1,))
= M(i=i-1,M(fact=fact*i,))
= M(i=i-1,M(fact=fact*i,{<i,3>,<fact,1>}))
=M(i=i-1,{<i,3>,<fact,3>})
={<i,2>,<fact,3>}
semntica de ciclo
los ciclos se componen de una expresin
test y un cuerpo de sentencia
M ( Loop l , State )
= M (l , M (l.body, )) if M (l.test , ) is true
= otherwise
definicin recursiva
ejemplo de ciclo
estado inicial: ={<N,3>}
fact=1;
i=N;
while (i>1) {
fact = fact * i;
i = i -1;
}
despus de las dos primeras sentencias,
= {<fact,1>,<N,3>,<i,3>}
ejemplo de ciclo
= {<fact,1>,<N,3>,<i,3>}
M(while(i>1) {}, )
= M(while(i>1) {}, M(fact=fact*i; i=i-1;, )
= M(while(i>1) {}, {<fact,3>,<N,3>,<i,2>})
= M(while(i>1) {}, {<fact,6>,<N,3>,<i,1>})
= M()
={<fact,6>,<N,3>,<i,1>}
Defining Meaning of Arithmetic
Expressions for Integers
First let s define ApplyBinary, meaning of binary operations:
slide 55
registros de activacin o marcos de pila
(Activation Records o stack frames)
guardan la informacin de un bloque:
variables locales
control link al que ha llamado al activation
record, para reubicar el puntero de entorno
variables temporales y resultados intermedios
entran y salen de la pila (stack), eso hace
que puedan usarse llamados anidados,
recursivas
slide 56
activation direcciones de
memoria ms bajas
frame de la
funcin que activation frame de la
llama funcin que llama
argumento 1
argumento 2 lo escribe la
activation funcin que
frame de la direccin de retorno llama
funcin que puntero de marco guardado
es llamada frame pointer
registros guardados
lo escribe la
variables locales funcin que
stack pointer es llamada
almacenamiento temporal
espacio para el
siguiente activation
frame que se llama direcciones de
memoria ms altas
slide 58
pila
de
ejecucin:
ejemplo
espacio para espacio para espacio para espacio para
variables globales variables globales variables globales variables globales
espacio para espacio para espacio para
xey xey xey
espacio para
z
{ { {
int x=0; int x=0; int x=0; {
int y=x+1; int y=x+1; int y=x+1; int x=0;
{ { { int y=x+1;
int z=(x+y)*(x-y); int z=(x+y)*(x-y); int z=(x+y)*(x-y); {
}; }; }; int z=(x+y)*(x-y);
} } } };
}
pila
de
ejecucin:
resultados
intermedios
pila
de
ejecucin:
otro
ejemplo
fact(3)
1. apila un registro, llama a fact(2)
2. esta llamada apila otro registro, llama a fact(1)
3. esta llamada apila otro registro, de forma que
hay tres registros en la pila
4. cuando se termina de ejecutar el bloque del
registro ms reciente, se saca ese registro de la
pila
5. y as sucesivamente hasta que la pila queda vaca