You are on page 1of 64

semn&ca

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

Approach: write a set of function


specifications that define what it means
to be type safe
Basis for functions: Type Map, tm
tm = { <v1,t1>, <v2,t2>, <vn,tn>}
Each vi represents a variable and ti its type
Example:
int i,j; boolean p;
tm = { <i, int>, <j, int>, <p, boolean> }
Declarations
How is the type map created?
When we declare variables

typing: Declarations Typemap


i.e. declarations produce a typemap
More formally n
typing(Declarations d) = < d .v, d .t >
i =1
i i

i.e. the union of every declaration variable name and type

In Java we implemented this using a HashMap


Semantic Domains and States
Beyond types, we must determine semantically
what the syntax means
Semantic Domains are a formalism we will use
Environment, = set of pairs of variables and memory
locations
= {<i, 100>, <j, 101>} for i at Addr 100, j at Addr 101
Memory, = set of pairs of memory locations and the
value stored there
= {<100, 10> , <101, 50>} for Mem(100)=10, Mem(101)=50
State of the program, = set of pairs of active
variables and their current values
= {<i,10>, <j, 50>} for i=10, j=50
semntica de estados
entorno, = conjunto de pares de variables y
posiciones en memoria
= {<i, 100>, <j, 101>} para i en Addr 100, j en Addr 101
memoria, = conjunto de pares de posiciones en
memoria y el valor que se aloja en cada una de ellas
= {<100, 10> , <101, 50>} para Mem(100)=10, Mem(101)
=50
estado del programa, = conjunto de pares de
variables con variables activas y sus valore actuales
= {<i,10>, <j, 50>} para i=10, j=50
ejemplo de estado
x=1; y=2; z=3;
en este punto = {<x,1>,<y,2>,<z,3>}
notacin: (y)=2
y=2*z+3;
en este punto = {<x,1>,<y,9>,<z,3>}
w=4;
en este punto = {<x,1>,<y,9>,<z,3>, <w,4>}

tambin se pueden tener expresiones; por


ejemplo (x>0) = true
unin que sobreescribe (modify)

un cierto tipo de transformacin de estados


X Y = reemplaza los pares <x,v> cuyo primer
miembro se corresponde con un par <x,w> de Y
por <x,w> y aadimos a X los otros pares de Y
ejemplo: 1 = {< x,1 >, < y,2 >, < z,3 >}
2 = {< y,9 >, < w,4 >
1 2 = {< x,1 >, < y,9 >, < z,3 >, < w,4 >}
semntica de Skip
Skip

M ( Skip s, State ) =
semntica de asignacin
evaluar una expresin y asignarla a la
variable

ejemplo: x=a+b

= {< a,3 >, < b,1 >, < x,88 >}


M ( x = a + b; , ) = U {< x, M (a + b, ) >}
= {< a,3 >, < b,1 >, < x,4 >}
semntica del condicional
M (Conditional c, State )
= M (c.thenbranch , ) if M (c.test , ) is true
= M (c.elsebranch, ) otherwise

If (a>b) max=a; else max=b


= {< a,3 >< b,1 >}
M (if (a > b)max = a; else max = b; , )
= M (max = a; , ) if M (a > b, ) is true
= M (max = b; , ) otherwise;
semntica del condicional (2)

= {< a,3 >< b,1 >}


M (if (a > b)max = a; else max = b; , )
= M (max = a; , ) since M (a > b, ) is true
= U {< max,3 >}
= {< a,3 >, < b,1 >, < max,3 >}
semntica de bloque
una secuencia de sentencias

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:

ApplyBinary : Operator Value Value Value


ApplyBinary (Operator op,Value v1 ,Value v 2 )
= v1 +v 2 if op = +
= v1 v 2 if op =
= v1 v 2 if op = *
v1
= floor sign(v1 v 2 ) if op = /

v
2
Denotational Semantics for Arithmetic
Expressions

Use our definition of ApplyBinary to expressions:


M : Expression State Value
M ( Expression e, State )
=e if e is a Value
= (e) if e is a Variable
= ApplyBinary (e.op ,
M (e.term1, ),
M (e.term2, )) if e is a Binary

Recall: op, term1, term2, defined by the Abstract Syntax


term1,term2 can be any expression, not just binary
Arithmetic Example
Compute the meaning of x+2*y
Current state ={<x,2>,<y,-3>,<z,75>}

Want to show: M(x+2*y,) = -4


x+2*y is Binary
From M(Expression e, State ) this is
ApplyBinary(e.op, M(e.term1, ), M(e.term2,))
= ApplyBinary(+,M(x,),M(2*y,))
= ApplyBinary(+,2,M(2*y,))
M(2*y,) is also Binary, which expands to:
ApplyBinary(*,M(2,), M(y,))
= ApplyBinary(*,2,-3) = -6

Back up: ApplyBinary(+,2,-6) = -4


Java Implementation

Value M(Expression e, State state) {


if (e instanceof Value) return (Value)e;
if (e instanceof Variable) return (Value)(state.get(e));
if (e instanceof Binary) {
Binary b = (Binary)e;
return applyBinary(b.op, M(b.term1, state),
M(b.term2, state);
}
...

Code close to the denotational semantic definition!


diferentes aproximaciones a la
semn&ca
lambda clculo
semn&ca denotacional
semn&ca operacional
semn&ca operacional
apartado 7. 2 de Mitchell
apartado 4.3. de la gua de lectura
semn&ca operacional
una representacin abstracta de la ejecucin
de un programa, como secuencia de
transiciones entre estados (en una mquina
abstracta)
los estados son una descripcin abstracta de
la memoria y estructuras de datos
las transiciones siguen la estructura de la
sintaxis
una mquina abstracta
una mquina abstracta
una mquina abstracta
informacin en la mquina abstracta
separa memoria de cdigo y de datos
contador de programa: direccin de memoria con la instruccin
que se est ejecuntando
puntero de entorno: valores de las variables en una parte del
cdigo
lenguajes no estructurados por bloques: la memoria de
datos es no estructurada, los valores de las variables son
visibles desde todo el cdigo
lenguajes estructurados por bloques: pila de ejecucin o
stack. Cuando el programa entra en un nuevo bloque, se
agrega a la pila un ac*va*on record con espacio para las
variables locales del bloque, y el puntero de entorno
apunta al nuevo ac&va&on record. Cuando el programa sale
del bloque, se re&ra el ac&va&on record de la pila y el
puntero de entorno se restablece a su ubicacin anterior.
pila de ejecucin
los registros de activacin se guardan en la
pila
cada nuevo bloque apila (push) un nuevo
registro de activacin en la pila
cada vez que se termina un bloque se saca
(pop) el registro de arriba de la pila
la pila tiene todos los registros que son activos
en un determinado momento de la ejecucin,
con el que se us ms recientemente en la
punta

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

You might also like