Está en la página 1de 42

conceptos

fundamentales de
lenguajes impera3vos
Paradigmas de la Programacin
FaMAF 2017
captulo 7.
(adicionales: 4.4. y 5.)
basado en lminas de John Mitchell y Vitaly Shma3kov
paradigma impera3vo
un paradigma de programacin es una
conguracin frecuente (y feliz) de
caracters3cas de lenguajes de programacin
el paradigma impera3vo es el ms an3guo y el
que estuvo siempre ms pegado a la mquina
tradicionalmente se ha opuesto al paradigma
funcional, pero la mayor parte de lenguajes
integran ideas de ambos paradigmas
(ver 4.4, no entra en el examen pero es lindo)
un minilenguaje Turing-completo
variables enteras, valores, operaciones
asignacin
if
Go To

slide 3
conceptos fundamentales
operacin bsica: asignacin
la asignacin tiene efectos secundarios: cambia
el estado de la mquina!
sentencias de control de flujo
condicionales y sin condicin (GO TO), ramas,
ciclos
bloques, para obtener referencias locales
parametrizacin
elementos bsicos
definiciones de tipos
declaraciones de variables (normalmente,
tipadas)
expresiones y sentencias de asignacin
sentencias de control de flujo (normalmente,
estructuradas)
alcance lxico y bloques, para poder tener
variables con referencias locales
declaraciones y definiciones de procedimientos
y funciones (bloques parametrizados)

slide 5
elementos bsicos
definiciones de tipos
declaraciones de variables (normalmente,
tipadas)
expresiones y sentencias de asignacin
sentencias de control de flujo (normalmente,
estructuradas)
alcance lxico y bloques, para poder tener
variables con referencias locales
declaraciones y definiciones de procedimientos
y funciones (bloques parametrizados)

slide 6
declaraciones de variables
las declaraciones tipadas restringen los
posibles valores de una variable en la ejecucin
del programa
jerarqua de tipos built-in o personalizada
inicializacin
uso de memoria: cunto espacio de memoria
reservar para cada tipo de variable?
C en 32-bit : char = 1 byte, short = 2 bytes, int = 4
bytes, char* = 4 bytes

slide 7
ubicacin y valores de variables
al declarar una variable la estamos ligando a una
ubicacin en memoria, de forma que el nombre de la
variable es el identificador de la ubicacin en memoria
la ubicacin puede ser global, en la pila o en el heap
l-valor: ubicacin en memoria (direccin de memoria)
r-valor: valor que se guarda en la ubicacin de
memoria identificada por el l-valor
asignacin: A (objetivo) = B (expresin)
actualizacin destructiva: reescribe la ubicacin de memoria
identificada por A con el valor de la expresin B
qu pasa si la variable ocurre en ambos lados de la asignacin?
semntica de copia vs. referencia
semntica de copia: la expresin se evala
a un valor, que se copia al objetivo
lenguajes imperativos
semntica de referencia: la expresin se
evala a un objeto, cuyo puntero se copia
al objetivo
lenguajes orientados a objetos

slide 9
elementos bsicos
definiciones de tipos
declaraciones de variables (normalmente,
tipadas)
expresiones y sentencias de asignacin
sentencias de control de flujo (normalmente,
estructuradas)
alcance lxico y bloques, para poder tener
variables con referencias locales
declaraciones y definiciones de procedimientos
y funciones (bloques parametrizados)

slide 10
variables y asignacin
en la parte derecha de una asignacin est el
r-valor de la variable, en la parte izquierda
est su l-valor
x := 1 significa guardemos 1 como r-valor de la
ubicacin sealada por el l-valor ligado a x
x := x+1 significa obtengamos el r-valor que
encontramos en el l-valor ligado al identificador
de variable x, summosle 1, y guardemos el
resultado como r-valor de la ubicacin sealada
por el l-valor ligado a x
slide 11
variables y asignacin
una expresin que no tenga un l-valor no
puede aparecer en la parte izquierda de una
asignacin
qu expresiones no tienen l-valor?
1=x+1, ++x++
a[1] = x+1 ?
el r-valor de un puntero es el l-valor de otra
variable (el valor de un puntero es una
direccin)
las constantes slo tienen r-valor
las funciones slo tienen l-valor
slide 12
l-valor y r-valor en C: punteros
&x devuelve el l-valor de x
*p devuelve el r-valor de p
Si p es un puntero, esto es el l-valor de otra
variable

Qu valores 3enen p y x?
l-valor y r-valor en C: funciones
elementos bsicos
definiciones de tipos
declaraciones de variables (normalmente,
tipadas)
expresiones y sentencias de asignacin
sentencias de control de flujo
(normalmente, estructuradas)
alcance lxico y bloques, para poder tener
variables con referencias locales
declaraciones y definiciones de procedimientos
y funciones (bloques parametrizados)

slide 15
flujo de control estructurado
se piensa como secuencial
las instrucciones se ejecutan en el orden en el que estn
escritas
en algunos casos soporta ejecucin concurrente
un programa es estructurado si el flujo de control es
evidente en la estructura sintctica del texto del
programa
til para poder razonar intuitivamente leyendo el texto del
programa
se crean construcciones del lenguaje para patrones comunes
de control: iteracin, seleccin, procedimientos / funciones...

slide 16
estructura de control en Fortran
10 IF (X .GT. 0.000001) GO TO 20
11 X = -X
IF (X .LT. 0.000001) GO TO 50
20 IF (X*Y .LT. 0.00001) GO TO 30
X = X-Y-Y
30 X = X+Y
...
50 CONTINUE
X=A
Y = B-A
GO TO 11 cdigo espague3!

una estructura parecida puede aparecer en ensamblador


slide 17
debate histrico sobre GO TO
Dijkstra, GO TO Statement Considered
Harmful
Letter to Editor, Comm. ACM, March 1968
Knuth, Structured Prog. with Go To
Statements
se puede usar goto, pero de forma
estructurada
las reglas sintcticas fuerzan un buen estilo
de programacin? ayudan?
slide 18
elementos bsicos
definiciones de tipos
declaraciones de variables (normalmente,
tipadas)
expresiones y sentencias de asignacin
sentencias de control de flujo (normalmente,
estructuradas)
alcance lxico y bloques, para poder tener
variables con referencias locales
declaraciones y definiciones de procedimientos
y funciones (bloques parametrizados)

slide 19
estilo moderno
construcciones estndar que estructuran los
saltos
if then else end
while do end
for { }
case
agrupan el cdigo en bloques lgicos
se evitan saltos explcitos (excepto retorno de
funcin)
no se puede saltar al medio de un bloque o
funcin
slide 20
iteracin
Definida

Indefinida
la terminacin depende de un valor dinmico
(calculado en tiempo de ejecucin)
cmo saber de forma est3ca
(antes de ejecucin) si el
programa va a terminar?
slide 21
construcciones de iteracin en C
while (condition) stmt;
while (condition) { stmt; stmt; ; }
do stmt while (condition);
do { stmt; stmt; ; } while (condition);
for (<initialize>; <test>; <step>) stmt;
una forma restringida de while, lo mismo que
<initialize>; while (<test>) { stmt; <step> }
for (<initialize>; <test>; <step>) { stmt;
stmt; ; }
y en lenguajes de scripting tenemos foreach
slide 22
escapar de un ciclo en C

slide 23
re-entrada forzada a un ciclo en C

slide 24
lenguajes con estructura de
bloques
bloques anidados con variables locales
se declaran nuevas variables
{ int x = 2; en los bloques anidados
{ int y = 3;
bloque bloque variable local
exterior x = y+2;
interior
} variable global
}

manejo de memoria
al entrar al bloque reservamos espacio para variables
al salir del bloque se puede liberar parte o todo el
espacio
slide 25
bloques en lenguajes comunes
C, JavaScript * { }
Algol begin end
ML let in end
dos formas de bloques
Inline
bloques asociados con funciones o
procedimientos

* JavaScript functions provides blocks

slide 26
modelo de mquina simplificado
Registros Cdigo Datos

Stack

Contador de
programa

Puntero de Heap
entorno

slide 27
manejo de memoria
el stack tiene los datos sobre entrada y
salida de bloques
el heap tiene datos de diferente lifetime
el puntero de entorno (environment)
apunta a la posicin actual en el stack
al entrar a un bloque: se aade un nuevo
activation record al stack
al salir de un bloque: se elimina el activation
record ms reciente del stack

slide 28
alcance y lifetime
alcance: regin del texto del programa donde
una declaracin es visible
lifetime: perodo de tiempo en que una ubicacin
de memoria es asignada a un programa

{ int x = ;
ejemplo:
{ int y = ;
la declaracin ms interior de x tapa a
{ int x = ;
la ms exterior (hueco en el
.
alcance)
};
el life3me de la declaracin exterior
};
};
incluye el 3empo en el que el bloque
interior se ejecuta
slide 29
activation records
para cada bloque se usa un activation record
estructura de datos que se guarda en la pila de
ejecucin
tiene lugar para variables locales
{ int x=0; apilar record con espacio para x, y
ijar valores de x, y
int y=x+1;
apilar record para bloque interno
{ int z=(x+y)*(x-y); jar valor de z
}; desapilar record para bloque interno
desapilar record para bloque externo
};

May need space for variables and intermediate results like (x+y), (x-y)
Activation Record para bloque inline

control link
control link
puntero al record anterior en
variables locales la pila
apilar un record en la pila
resultados intermedios fijar el nuevo control link
para que apunte al viejo
control link puntero de entorno
fijar el puntero de entorno al
variables locales nuevo record
resultados intermedios
desapilar un record de la
pila
seguir el control link del
puntero de record actual para reasignar
el puntero de entorno
entorno
ejemplo
{ int x=0;
control link
int y=x+1;
x 0
{ int z=(x+y)*(x-y);
y 1
};
};
control link
z -1
x+y 1
x-y -1

puntero de
entorno
slide 32
elementos bsicos
definiciones de tipos
declaraciones de variables (normalmente,
tipadas)
expresiones y sentencias de asignacin
sentencias de control de flujo
(normalmente, estructuradas)
alcance lxico y bloques, para poder tener
variables con referencias locales
declaraciones y definiciones de
procedimientos y funciones (bloques
parametrizados)
slide 33
abstraccin procedural
un procedimiento es un alcance parametrizado con
nombre
el programador se puede abstraer de los detalles de
implementacin, enfocndose en la interfaz
funciones que retornan valores
x = (b*b - sqrt(4*a*c))/2*a
funciones que NO retornan valores
procedimientos (Ada), subrutinas (Fortran), funciones
vacas / mtodos (C, C++, Java)
tienen efectos secundarios visibles, cambian el estado de
algn valor de datos que no se define dentro de la funcin
strcpy(s1,s2)
slide 34
activation records para funciones
informacin de bloque ( frame ) asociada a
cada llamada de funcin:
parmetros
variables locales
direccin de retorno
ubicacin para el valor de retorno al finalizar la
funcin
control link al activation record de quien la llam
registros guardados
variables temporales y resultados intermedios
(no siempre) access link al padre esttico de la
funcin
slide 35
esquema de activation record

control link
direccin de retorno
ubicacin del cdigo a
direccin de retorno ejecutar cuando retorna la
funcin
direccin de resultado direccin de resultado de
retorno
parmetros
direccin donde se guardar
variables locales el valor que retorna la
funcin, se encuentra en el
resultados intermedios activation record del bloque
que llama a la funcin
Parmetros
ubicaciones con los datos del
puntero de bloque que llama a la funcin
entorno
ejemplo
funcin
control link
fact(n) = if n<=1 then 1
direccin de retorno else n * fact(n-1)
direccin de resultado direccin de resultado de
retorno: ubicacin donde
parmetros
poner fact(n)
variables locales parmetro: el valor de n
resultados intermedios que asigna la secuencia
de llamada
resultados intermedios:
puntero de ubicaciones con los
entorno valores de fact(n-1)
slide 37
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 38
Typical x86 Activation Record

frame pointer

stack pointer

slide 39
pila de ejecucin
los registros de activacin se guardan en la pila
cada nueva llamada apila un activation record
cada llamada finalizada desapila el activation
record de la punta
la pila tiene todos los records de todas las llamadas
activas en un momento de la ejecucin, siendo el
record de la punta la llamada ms reciente
ejemplo: fact(3)
apila un activation record a la pila, llama a fact(2)
esta llamada apila otro record, y llama a fact(1)
esta llamada apila otro record, lo cual resulta en
tres activation records en la pila
llamada de funcin
fact(k) fact(3)
Control link Control link
direccin de resultado direccin de resultado
n k n 3
fact(n-1) fact(n-1)
fact(2) Control link
Environment
direccin de resultado
pointer
n 2
fact(n-1)
fact(1) Control link
fact(n) = if n<= 1 then 1
direccin de resultado
else n * fact(n-1)
n 1
omitimos la direccin de retorno fact(n-1)
slide 41
retorno de funcin
fact(3) Control link fact(3) Control link
direcciones direccin de resultado direccin de resultado
altas
n 3 n 3
fact(n-1) fact(n-1) 2
fact(2) Control link fact(2) Control link
direccin de resultado direccin de resultado
n 2 n 2
fact(n-1) 1 fact(n-1) 1
fact(1) Control link
direccin de resultado fact(n) = if n<=1 then 1
direcciones n 1
bajas else n * fact(n-1)
fact(n-1)

También podría gustarte