You are on page 1of 43

Repaso Clase anterior

Los lenguajes de programacin trabajan con entidades


Variables
Unidades
Sentencias

Las entidades tienen atributos


Los atributos deben tener un valor antes de usar la
entidad
El momento de asociar un valor a un atributo se lo llama
binding o ligadura
Ligadura esttica
Ligadura dinmica

Concepto de estabilidad

Repaso Clase anterior


Diferentes momentos de binding

Definicin del lenguaje


Implementacin
Compilacin
Ejecucin

Entidad Variable
Atributos:
Nombre
Alcance
Esttico
Dinmico

Tipo
L-valor
Tiempo de vida

R-valor

Repaso Clase anterior


Diferentes momentos de binding

Definicin del lenguaje


Implementacin
Compilacin
Ejecucin

Entidad Variable
Atributos:
Nombre
Alcance
Esttico
Dinmico

Tipo
L-valor
Tiempo de vida

R-valor

Repaso Clase anterior


Alias: Dos nombres que denotan la misma entidad en el
mismo punto de un programa.

distintos nombres

1 entidad

Dos variables son alias si comparten el mismo objeto


de dato en el mismo ambiente de referencia.
El uso de alias pude llevar a programas de difcil
lectura y a errores.
x
0

int x = 0;
int *i = &x ;
int *j = &x ;

10
j

*i = 10;

Efecto lateral: modificacin de una variable no local

Concepto de Sobrecarga
Sobrecarga
1 nombre
int i,j,k;
float a,b,c;
..
i=j+k;
a = b + c;

distintas entidades

Qu sucede con el operador + (nombre)?..

Los tipos permiten que se desambige en compilacin.


Sobrecarga: un nombre esta sobrecargado si:
En un momento, referencia mas de una entidad y
Hay suficiente informacin para permitir establecer la
ligadura unvocamente.
1 nombre

1 entidad
No hay ambigedad

Concepto de Sobrecarga y Alias


Sobrecarga
1 nombre

distintas entidades

Alias
distintos nombres

1 entidad

SEMANTICA OPERACIONAL
UNIDADES DE PROGRAMA

UNIDADES
Los lenguajes de programacin permiten que un programa este
compuesto por unidades.
UNIDAD

accin abstracta

En general se las llama rutinas


PROCEDIMIENTOS

FUNCIONES

un valor

Analizaremos las caractersticas sintcticas y semnticas de las


rutinas y los mecanismos que controlan el flujo de ejecucin entre
rutinas con todas las ligaduras involucradas.
Hay lenguajes que SOLO tienen funciones y simulan los
procedimientos con funciones que devuelven void. Ej.: C, C++,
Python, etc

<nombre, alcance, tipo, l-value, r-value>


Nombre:
String de caracteres que se usa para invocar a la
rutina. (identificador)
El nombre de la rutina se introduce en su declaracin.
El nombre de la rutina es lo que se usa para invocarlas.

declaracin

invocacin

La llamada debe estar dentro


del alcance del nombre de la
rutina

<nombre, alcance, tipo, l-value, r-value>


Alcance:
Rango de instrucciones donde se conoce su
nombre.
El alcance se extiende desde el punto de su declaracin hasta
algn constructor de cierre.
Segn el lenguaje puede ser esttico o dinmico.

Activacin: la llamada puede estar solo dentro del


alcance de la rutina

En lenguaje C
El alcance de uno es de
dnde se declara al final
del archivo

La funcin E
dos
puede
INCORRECTO.
La
funcin
dos
NOespuede
alcance
de
dos
desde
CORRECTO.
invocar a la funcin uno porque esta en

ser invocado por


la funcin
uno porque
dnde
se declara
hasta NO
el
su alcance.
esta en su alcance.
final del archivo

<nombre, alcance, tipo, l-value, r-value>


Alcance (cont.) :
Ambiente de referencia de la rutina:
-Local: entidades declaradas dentro de la rutina (visibles dentro de la
rutina)
-No local: referencias a entidades declaradas en otras unidades cuyo
alcance es visible en la rutina
Toda variable no locales que pueda ser referenciada por cualquier
unidad en el programa se llaman variables globales.

Variable global
Ref. no local
Ref. local

Respecto al bloque
interno del main

<nombre, alcance, tipo, l-value, rvalue>


Tipo:
El encabezado de la rutina define el tipo de los
parmetros y el tipo del valor de retorno (si lo hay).
Signatura: permite especificar el tipo de una rutina
Una rutina fun que tiene como entrada parmetros e tipo
T1, T2, Tn y devuelve un valor de tipo R, puede
especificarse con la siguiente signatura
fun: T1xT2x....Tn R
Un llamado a una rutina es correcto si esta de acuerdo al
tipo de la rutina.
La conformidad requiere la correspondencia de tipos
entre parmetros formales y reales.

<nombre, alcance, tipo, l-value, r-value>


Ejemplo:
/* sum es una funcion que suma los n primeros naturales,
1 + 2 + + n; suponemos que el parametro n es positivo */

int sum(int n)
{
int i, s;
s = 0;
for (i = 1; i <= n; ++i)
s+= i;
return s;
}

El tipo de la funcin sera:


sum: enteros

enteros

sum es una rutina con un parmetro entero que devuelve un entero


i = sum(10)
i = sum (5.3)

con i entero ser correcta


ser incorrecta

<nombre, alcance, tipo, l-value, r-value>


l-value: Es el lugar de memoria en el que
se almacena el cuerpo de la rutina.
r-value: La llamada a la rutina causa la
ejecucin su cdigo, eso constituye su rvalor.
esttico: el caso mas usual. (sum)
dinmica: variables de tipo rutina.
Se implementan a travs de punteros a rutinas

<nombre, alcance, tipo, l-value, r-value>


r-valor: Ejemplo de variables rutinas (binding dinmico)

Definicin de variable puntero a funcin


Asignacin de variable puntero a funcin

Invocacin funcin

El uso de punteros a rutinas permite una poltica dinmica de invocacin de rutinas

Definicin vs Declaracin
Algunos lenguajes (C, C++, Ada, etc) hacen
distincin entre Definicin y Declaracin de las
rutinas
/* sum es una funcion que suma los n primeros naturales,
1 + 2 + + n; suponemos que el parametro n es positivo */

int sum(int n)
Encabezado
{
int i, s;
s = 0;
for (i = 1; i <= n; ++i)
s+= i;
return s;
}

Declaracin

Definicin
Cuerpo

Definicin vs Declaracin
Si el lenguaje distinguen entre la declaracin y la
definicin de una rutina permite manejar
esquemas de rutinas mutuamente recursivas.
int A(int x, int y);
float B(int z)
{
int w, u;

w = A(z, u);
};
int A(int x, int y)
{
float t;.....
t = B(x);.....
}

declaracin de A
defincin de B
es visible
defincin de A

Definicin vs Declaracin
Otro ejemplo: en Pascal uso de forward

Comunicacin entre rutinas


Ambiente no local
Parmetros
Diferentes datos en cada llamado
Mayor legibilidad y modificabilidad.

Parmetros formales: los que aparecen en la


definicin de la rutina
Parmetro reales: los que aparecen en la
invocacin de la rutina. (dato o rutina)

Ligadura entre parmetros


formales y reales
Mtodo posicional: se ligan uno a uno
routine S (F1,F2,,Fn) Definicin
call S (A1, A2,.. An)
Llamado
Fi se liga a Ai para i de 1 a n.
deben conocerse las posiciones

Variante: combinacin con valores por defecto


C++:
distancia()
distancia(10)

int distancia (int a = 0, int b = 0)


distancia (0,0)
distancia (10,0)

Ligadura entre parmetros


formales y reales
Mtodo por nombre: se ligan por el nombre
deben conocerse los nombres de los formales
Ada: procedure Ejem (A:T1; B: T2:= W; C:T3);
Valor por defecto

Si X, Y y Z son de tipo T1, T2 y T3


Ejem (X,Y,Z)
asociacin posicional
Ejem (X,C => Z)
X se liga a A por posicin,
B toma el valor por defecto W
C se liga a Z por nombre
Ejem (C =>Z, A=>X, B=>Y)
se ligan todos por nombre

REPRESENTACION EN
EJECUCION
La definicin de la rutina especifica un proceso
de computo.
Cuando se invoca una rutina se ejecuta una
instancia del proceso con los particulares
valores de los parmetros.
instancia de la unidad: es la representacin de
la rutina en ejecucin.
segmento de cdigo
instrucciones de la unidad
se almacena en la memoria
de instruccin C
contenido fijo

registro de activacin
datos locales de la unidad
se almacena en la memoria
de datos D
contenido cambiante

Procesador Abstracto SIMPLESEM


ip
Segmento
de cdigo

Memoria de Cdigo

Registro de
activacin

Memoria de Datos

Procesador Abstracto - Utilidad


El procesador nos servir para comprender que
efecto causan las instrucciones del lenguaje al
ser ejecutadas.
Semntica intuitiva.
Se describe la semntica del lenguaje de
programacin travs de reglas de cada
constructor del lenguaje traducindolo en una
secuencia de instrucciones equivalentes del
procesador abstracto

Procesador Abstracto SIMPLESEM


Memoria de Cdigo: C(y) valor almacenado en la ysima celda de la
memoria de cdigo. Comienza en cero
Memoria de Datos: D(y) valor almacenado en la ysima celda de la
memoria de datos. Comienza en cero
y representa el l-valor, D(y) o C(y) su r-valor
Ip: puntero a la instruccin que se esta ejecutando.

se inicializa en cero en cada ejecucin se actualiza cuando


se ejecuta cada instruccin.

Direcciones de C
Ejecucin:

obtener la instruccin actual para ser ejecutada (C[ip])

incrementar ip

ejecutar la instruccin actual

Procesador Abstracto Instrucciones


SET: setea valores en la memoria de datos
set target,source
copia el valor representado por source en la direccin representada
por target
set 10,D[20]
copia el valor almacenado en la posicin 20 en la posicin 10.
E/S: read y write permiten la comunicacin con el exterior.
set 15,read
el valor ledo se almacenara en la direccin 15
set write,D[50] se transfiere el valor almacenado en la posicin 50 .
combinacin de expresiones
set 99, D[15]+D[33]*D[4] expresin para modificar el valor

Procesador Abstracto
Instrucciones (Cont.)
JUMP: bifurcacin incondicional
jump 47
la prxima instruccin a ejecutarse ser la que este almacenada en
la direccin 47 de C
JUMPT: bifurcacin condicional, bifurca si la expresin se evala
como
verdadera
jumpt 47,D[13]>D[8]
bifurca si el valor almacenado en la celda 13 es mayor que el
almacenado en la celda 8
direccionamiento indirecto:
set D[10],D[20]
jump D[30]
Ip= 5 posicin 5 en C

10

30

20

30

Procesador Abstracto - Memoria

ip

Elementos en ejecucin
Punto de retorno
Es una pieza cambiante de informacin que debe ser
salvada en el registro de activacin de la unidad
llamada.

Ambiente de referencia
Ambiente local: variables locales, ligadas a los
objetos almacenados en su registro de activacin
Ambiente no local: variables no locales, ligadas a
objetos almacenados en los registros de activacin
de otras unidades

Estructura de ejecucin de los


lenguajes de programacin

Esttico
Basado en pila
Dinmico

ESTATICO: espacio fijo


El espacio necesario para la ejecucin se
deduce del cdigo
Todo los requerimientos de memoria
necesarios se conocen antes de la ejecucin
La alocacin puede hacerse estticamente
No puede haber recursin

BASADO EN PILA:
espacio predecible
El espacio se deduce del cdigo. Algol-60
Programas ms potentes cuyos requerimientos de
memoria no puede calcularse en traduccin.
La memoria a utilizarse es predecible y sigue una
disciplina last-in-first-out.
Las variables se alocan automticamente y se
desalocan cuando el alcance se termina
Se utiliza una estructura de pila para modelizarlo.
Una pila no es parte de la semntica del lenguaje, es
parte de nuestro modelo semntico.

DINAMICO: espacio impredecible


Lenguajes con impredecible uso de memoria.
Los datos son alocados dinmicamente solo
cuando se los necesita durante la ejecucin.
No pueden modelizarse con una pila, el
programador puede crear objetos de dato en
cualquier punto arbitrario durante la ejecucin
del programa.
Los datos se alocan en la zona de memoria
heap

C1: lenguaje

simple

Sentencias simples
Tipos simples
Sin funciones
Datos estticos de tamao fijo
un programa = una rutina main()
Declaraciones
Sentencias

E/S: get/print

enteros
reales
arreglos
estructuras

C1
main()
{
int i, j;
get(i, j);
while (i != j)
if (i > j)
i -= j;
else
j -= i;
print(i);
}

0
1

celda para i
celda para j

Zona DATOS
Registro de
activacin

C1
Cmo sera el CDIGO?

main()
{

Zona CDIGO

int i, j;
get(i, j);
while (i != j)
if (i > j)
i -= j;
else
j -= i;
print(i);
}

0 set 0,read
1 set 1,read
2 jumpt 8 , D[0] = D[1]
3
4
5
6
7

jumpt 6 , D[0]<= D[1]


set 0, D[0] - D[1]
jump 7
set 1,D[1] D[0]
jump 2

8 set write, D[0]


9 halt

C1

C
0

0 set 0,read
1 net 1,read
2 jumpt 8, D[0] = D[1]
3
4
5
6
7
8

jumpt 6, D[0]<= D[1]


set 0, D[0] - D[1]
jump 7
set 1,D[1] D[0]
jump 2

set write, D[0]


9 halt

D
0
1

celda para i
celda para j

Registro de
activacin

C2: C1 + rutinas internas


Definicin de rutinas internas al main
Programa =
datos globales
declaraciones de rutinas
rutina principal
datos locales
se invoca automticamente en ejecucin

C2
Rutinas internas
disjuntas: no pueden estar anidadas
no son recursivas

Ambiente de las rutinas internas


datos locales
datos globales

rutinas

main

C2
int i = 1, j = 2, k = 3;
alpha()
1
{
2
int i = 4, j= 5; global
3

i+=k+j;
};
beta()
4
{
alpha
5
int k = 6;

i=j+k;
alpha();
beta
6
};
main()
{

Qu RA
beta();
}
Datos?

Todo esttico

i
j

3
i
j

6
7

se alocan en la zona de

int i = 1, j = 2, k = 3;

C2: call-return
Cmo cambia la informacin en la zona
de Datos?

alpha()
{int i = 4, l = 5;

i+=k+l; };
beta()
{int k = 6;

i=j+k;alpha(); };
main()

14
15

set 6,16
jump 100

18

125
4
12

49
50
58

set 4, D[4]+D[2]+D[5]

99
100

jumpt D[3]

122
123
124

set 0,D[1] + D[7]


set 3,125
jump 50
jump D[6]

seg.c
main 0

seg.c
alpha

seg.c
beta

4
5

16

beta();
}

r.act.
global

retorno

i
l
retorno

r.act.
alpha
r.act.
beta

Guarda el punto de retorno

C2: rutinas compiladas separadas


file 1
int i = 1, j = 2, k = 3;
extern beta();
main()
{...
beta();
} ...
file 2
extern int k;
alpha() {...}
file 3
extern int i, j;
extern alpha();
beta() { }

alpha();...

0
.
.
40

0
1

0
.
.
49

0
1

0
.
.
49

0
1

relativas

C2
El compilador no puede ligar variables
locales a direcciones absolutas
Tampoco variables globales
Linkeditor:
encargado de combinar los mdulos
ligar la informacin faltante

C2 y C2 no difieren semnticamente

You might also like