Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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!
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
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)