Вы находитесь на странице: 1из 77

Diapositiva 1

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 2

Arquitecturas de traducción
Front-end:
del lenguaje de alto nivel al
lenguaje intermedio

Código intermedio
(ensamblador, p-code, byte-code, etc.)

Back-end:
del lenguaje intermedio al
código binario

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 3

Proceso de traducción
G3. AEF.
Código fuente Análisis lexicográfico
Tokenización

G2. AP.
Código “tokenizado” Análisis sintáctico
Árboles

Árboles sintácticos Análisis semántico Formales e informales.


Comportamientos.
Estáticas y dinámicas.

Árboles decorados Generador de código


Optimización
¿Compilado? z := (2*a*y+b)*(2*a*y+c)
¿Interpretado? t := 2*a*y;
¿Pseudo-compilado? z := (t+b)*(t+c);

for (k = 1; k < a + b; k++)


Código de máquina x=k*b
t = a + b;
for (k = 1; k < t; k++)
¿Errores semánticos?

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 4

Compilador nativo
programa

Análisis lexicográfico

tokens Código objeto


(bibliotecas
estáticas)
Tabla de símbolos Análisis sintáctico
Nombre
Token asociado árboles
Información de tipo
Alcance Análisis semántico
Dirección
Inicialización intermedio

Optimización
Código objeto
objeto (bibliotecas
Generación de dinámicas)
código máquina
Enlace (linker)

ejecutable

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 5

Traductor de un paso
U1
Facilidad de uso Análisis caracteres
lexicográfico
Aplicaciones sencillas

Poca optimización
Tabla de
símbolos
Traducción rápida

Etapas de análisis y
generación unificadas
Análisis Análisis
Código objeto semántico sintáctico
ineficiente

código objeto
Generador ejecutable
Gestión de
errores
errores

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 6

Intérprete puro
Facilidad de uso Traductor a caracteres
representación
Permiten interactuar interna
con el estado del … Tabla de
programa Número de símbolos
instrucción
instrucción

Sin optimización etiqueta

Analizan y ejecutan
un enunciado por vez número

Las instrucciones se siguiente Evaluador datos


Numeran o etiquetan instrucción instrucciones

Requieren de un
entorno para ejecutar
Gestión de
errores resultado de la
errores ejecución

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 7

Pseudocompilador o intérprete parcial


Lenguajes modernos caracteres
Traductor

Traducen a un pseudo-
código de máquina
Código
(por ej. P-code, byte-
intermedio
code, …)

Multiplataforma

Intérprete por software Just-in-time


o hardware compiler
datos
Requieren intérprete Código de máquina
para la ejecución (VM),
pero es muy pequeño Intérprete

errores resultado de la ejecución

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 8

Compiladores e Intérpretes

Analizador Compiladores e intérpretes


Pre-procesador
(léxico y sintáctico) tienen similares front-end
pero diferentes back-end

Programa Árbol de
fuente análisis

Compilador
Traductor Intérprete Intérprete parcial
Código
ensamblador
Programa Entorno de Byte code
ejecución
Enlazador

Código de
máquina

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 9

Semántica de enunciados

<enunciado> ::= <declarativo> | <asignación> | <control> | <I/O>

bifurcación, repetición, llamada a subrutina, salto

<bloque> ::= <delimitador> { <enunciado> <separador> }* <delimitador>


| <enunciado>

<asignación> ::= <variable> <asignador> <expresión>

• Características
– Enunciado vs. Operador
– Múltiple
– Inputs. Pasaje de argumentos. Retorno de valores
– inicialización vs. Asignación

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 10

Semántica de enunciados

<bifurcación> ::= si <expr_lógica> entonces <bloque>

<bifurcación> ::= si <expr_lógica> entonces <bloque> sino <bloque>

• Características
– Doble
– Múltiple
– Selector de casos
– Opción de descarte
– Esquemas de anidamiento
– Transferencia incondicional
– Rótulos

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 11

Semántica de enunciados

<iteración> ::= mientras <expr_lógica> hacer <bloque>

<iteración> ::= repetir <bloque> hasta <expr_lógica>

<iteración> ::= para <inicial> hasta <final> [<incremento>] hacer <bloque>

• Características
– Esquemas de anidamiento
– Ciclos finitos e infinitos
– Modificación interna de parámetros
– Evaluación inicial y final

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 12

Semántica de datos
Implementación

Direcciones de Descriptores Almacenamiento


memoria (conjunto de atributos) binario

Abstracción mediante Estáticos Dinámicos Formatos


variables
-nombre …
-tipo -tipo
-dirección -dirección
-valor -valor
-tiempo de vida -tiempo de vida
-alcance -alcance

Dato Descriptor y Dato Descriptor Dato

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 13

Declaración de variables
Sea: int A;
A = 21;
• Modelo imperativo: genera tres objetos
nombre ubicación valor
A FFA0 9B76 21

Vinculados al ingresar al Vinculados mediante


ámbito de existencia la asignación

• Modelo declarativo: genera dos objetos


nombre valor
A 21

Vinculados en el momento de
la invocación

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 14

Implementación de datos
Los objetos de datos siempre son de algún tipo, lo que implica que tienen asociados
• Valores
• Operaciones (f: tipo x tipo tipo)
• Representación de su almacenamiento
Equivalencia de tipo
• Estructural
• Por nombre (alias)
Verificación
• Calcular o inferir tipos y validar expresiones
• Estática o dinámica
Variables vs. Constantes
• Segmento de datos vs. segmento de código

Primitivos
• Atómicos sin estructura interna compleja
• Operaciones implementadas por hardware

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 15

Sistema general de tipos


Entero

Estándar Carácter

Lógico
Ordinal
Enumerado
Definido x usuario
Escalar
Sub-rango

Punto fijo
No-ordinal Real
Tipo Puntero
Punto flotante
Arreglo Cadena

Registro
Estructurado
Archivo

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 16

El tipo entero
• Formato de representación
– Tipo entero (máximo 2n-1 - 1 y mínimo -2n-1)
– Negativos por complemento 2
– Tamaños habituales con/sin signo 1, 2, 4, 8 bytes
– Operaciones más simples que los flotantes
• Rango con signo: -2147483648 a +2147483647
-2147483648 10000000 00000000 00000000 00000000
2147483648 10000000 00000000 00000000 00000000
• Rango sin signo: 0 a 4294967295
2147483648 10000000 00000000 00000000 00000000
-1 11111111 11111111 11111111 11111111
4294967296 00000000 00000000 00000000 00000000
4294967295 11111111 11111111 11111111 11111111

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 17

El tipo real
• Características
– Flotante estándar representado con 32 bits
– Punto flotante (IEEE 754)
– No exactos (simple y doble precisión)
– Tamaños habituales 4, 8 bytes
– Operaciones más lentas que los enteros
• Formato de representación
(-1)S * 2 (E – B) * (1 + (M/2N)) donde 0 <= M < 1
N cantidad de bits para M (23 or 52)
B es 127 (32-bits) o 1023 (64-bits)

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 18

Implementación de la semántica del tipo real


• Valores particulares
E=255, M <> 0 inválido E=255, M = 0 infinito
0<E<255 2{E-127}*(1+(M/ 223)) E=0, M <> 0 2 -126 *(M / 223)
E=0, M=0 0
Ejemplos de flotantes de 32 bits
0.3333333333333333 0 01111101 01010101010101010101011
0.3; 0 01111101 00110011001100110011010
Reconstruido: 0.3000000119209289600
Ejemplo
1.0 0 01111111 00000000000000000000000
• Comparaciones erróneas: == o !=
Solución: establecer un e = 0.001 (x - 3.0) < e || (3.0 - x) < e

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 19

Implementación de otros tipos

Enteros sin signo • Sólo positivos

• Precisión exacta
• Almacenamiento poco eficiente
Decimal o punto fijo Ej. 1234.567 => 1234567 con S=3
• Cantidad de decimales fija
En C/C++ los operadores &&,
||, ! están asociados a los
tipos numéricos
Lógico • 1 bit o 1 byte
En C/C++ se trata como un
tipo numérico
• ASCII (1 byte)
Carácter • UNICODE (2 bytes)

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 20

Tipo de datos puntero


Características
1. Tamaño puntero vs. objeto apuntado
2. Información de tipo asociada
3. Restricciones de dónde apuntar Objeto de
dato
4. No son un enteros • dirección de
memoria • valor

Puntero
Operaciones
1. Asignar una dirección de memoria
2. Obtener una dirección de memoria
3. Referenciar una dirección de memoria
4. Comparar direcciones de memoria
5. Aritmética de punteros
6. Uso de cast

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 21

Asignación de punteros

A y B variables puntero: A  B

A: 7.2 A:

B: 0.4 B: 0.4

A una variable puntero a puntero y B puntero: A  B


A: B: 7.2

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 22

Uso de punteros en C/C++

Operadores * y & siempre se colocan a la izquierda de una variable

x *y z Nombres
Direcciones (250) (254) (258)
12
30 250 17 Valores
int x, *y, z;
x = 12; * Indica que la variable es un puntero que guardará
un valor de dirección de memoria
y = &x;
& obtener el valor de la dirección de
z = *y + 5; memoria de la variable
* a la derecha de la asignación
Recuperar el valor apuntado por la variable puntero
*y = 30;
* a la izquierda de la asignación
Guardar valor en el lugar indicado por el puntero

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 23

Conceptos sobre tipos de datos


• Sistema de tipos +
– Mecanismo para definir tipos
Ada
– Conjunto de reglas para determinar
• Equivalencia Java / C#
• Compatibilidad
Fortran
• Inferencia
• Verificación de tipos (type checking) C/C++
– Violación de la reglas (type clash)
– Lenguajes fuertemente tipeados JS
• Tipos estáticos
– Lenguajes débilmente tipeados ASM
• Tipos dinámicos
-

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 24

Conceptos sobre tipos de datos


• Conversión de tipos
– Implícita = Coerción
– Explícita = cast (molde)
– Pérdida de datos (desbordamiento de la máscara de bits)
– Pérdida de precisión (truncamiento y redondeo)

• Polimorfismo
– Un mismo operador aplicado a diferentes tipos

• Subtipos
– A es subtipo de B A⊂B
– Mismo conjunto de operaciones y formato de representación
– Dominio de valores diferente

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 25

Operadores y Expresiones
• Operadores Tabla de jerarquía/asociatividad en C
– Precedencia
I-D () [] -> .
– Asociatividad D-I ++ -- + - ! ~ (tipo) * & sizeof
– Sobrecarga I-D * / %
I-D + - Sean
• Caracter I-D << >> int a, *b, Z = 1, X = 4, Y = 2;
– tratamiento como enteros I-D < <= > >= a = 4;
I-D == != b = &a;
• Cadena I-D &
Árbol de expresión
I-D ^
– tipo predefinido I-D | ++*b vs. *++b
– arreglos I-D && ++Z * Z++
I-D || Z + (Y == 0 ? X : X / Y)
• Relacionales y lógicas D-I ?:
– evaluación x cortocicuito D-I = += -= *= /= %= &= ^= |= <<= >>=
I-D ,
• Aritméticas
– errores de redondeo vs. truncamiento (desbordamiento)
– bit de signo

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 26

Tipos estructurados

Grupo de datos del mismo o diferentes tipos

Homogéneos Heterogéneos

Enumerados
Arreglos Registros Listas

Archivos
Multidimensionales
Unidimensionales

Campos de bits

Uniones

Lineales

Árboles
Anillos

Grafos
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 27

Implementación del tipo cadena


Estático

Longitud fija

Longitud variable c/ límite

Longitud variable s/ límite

Longitud fija c/ delimitador

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 28

Arreglos unidimensionales
Conjunto homogéneo de datos gestionado como un bloque

• Características
Dimensión: Entero > 0
Sub => L1 ≤ Sub < L1 + Dim

• Cálculo de direcciones
int x[8];
L-value: x[5] = 15;
L-value y R-value: x[2] = x[5]; Suponemos enteros de 2 bytes
L-value(x[k]) => DB + k * tTipo

• Subíndices con rango


Sea x[L1..U1] : TIPO donde L1 = 2 y U1 = 9
Espacio = (U1 - L1 + 1) * tTipo
L-value(x[k]) => DB + (k – L1) * tTipo = (DB – L1 * tTipo) + k * tTipo
L-value(x[k]) => OV + k * tTipo

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 29

Arreglos bidimensionales
Características
Dimensiones: Entero > 0
Subíndices => L1 ≤ Sub1 < L1 + Dim1, L2 ≤ Sub2 < L2 + Dim2
Tamaño: Dim1 * Dim2 * tTipo
Cálculo de direcciones 0 1 2
0
int x[4][3]; 1
2 7
x[2][1] = 7; 3

L-value(x[i][j]) => DB + i * D + j * tTipo


D = dimensión_columna * tTipo
… …

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 30

Arreglos bidimensionales
Subíndices con rango
A[L1:U1, L2:U2] : TIPO Espacio = (U2 - L2 + 1) * (U1 - L1 + 1) * tTipo
D = (U2 - L2 + 1) * tTipo D = cte
L-value(A[i, j]) = DB + D * (i - L1) + tTipo * (j - L2)
DB + D * i – L1 * D + tTipo * j – L2 * tTipo
OV = DB - L1 * D - L2 * tTipo
L-value(A[i, j]) = OV + D * i + tTipo * j
[0,2]
… …
[-1,2] [-1,4] [1,4]

X : array [-1..2, 2..4] of byte


2 3 4
Tamaño: (4 – 2 + 1) * (2 - (-1) + 1) * 1 3*4*1 12 bytes -1
D: (4 – 2 + 1) * 1 3 0
OV: 100 - (-1) * D – 2 * 1 100 + 1 * 3 – 2 * 1 100 + 3 – 2 101 1
2
X[1,4]: 101 + 1 * 3 + 4*1 108

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 31

Implementación general
Almacenamiento
a) Estático (datos conocidos en la compilación: D, Tt y VO)
int N = 5;
float v[N];
for (int i = 0; i < N; i++)
v[i] = i + 1;

b) Dinámico
var v = [0];
for (i = 0; i < 5; i++)
v[i] = i + 1;

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 32

Arreglos tridimensionales
Subíndices con rango k
j
A[L1:U1, L2:U2, L3:U3] : TIPO
i
D1 = (U2 – L2 + 1) * (U3 – L3 + 1) * tTipo
D2 = (U3 – L3 + 1) * tTipo
D3 = tTipo
Espacio = (U3 – L3 + 1) * (U2 - L2 + 1) * (U1 - L1 + 1) * tTipo
L-value(A[i, j, k]) = DB + D1 * (i - L1) + D2 * (j - L2) + k * D3
L-value(A[i, j, k]) = DB + D1 * i – D1 * L1 + D2 * j – D2 * L2 + k * D3
OV = DB – L1 * D1 – L2 * D2 – L3 * D3
L-value(A[i, j, k]) = OV + i * D1 + j * D2 + k * D3

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 33

Arreglos n-dimensionales

Arreglo n-dimensional con rangos Hipercubo


A[L1:U1, ..., Ln:Un]
Tamaño de cada dimensión Di
Dn = tTipo
Para i = n – 1 hasta 1 hacer
Di = (Ui+1 – Li+1 + 1) * Di+1
OV = DB - Σni=1 (Li * Di) Ejemplo para 3 dimensiones:

Acceso a un elemento D3 = tTipo

A[s1, ..., sn] = OV + Σni=1 (si * Di) D2 = (U3 – L3 + 1) * tTipo

D1 = (U2 – L2 + 1) * (U3 – L3 + 1) * tTipo

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 34

Gestión de arreglos
• Slices
– Se agregan descriptores
Ejemplo Fortran 90:
A(3, :) = B(7:15)

• Asociativos
– Acceso a datos sin un orden fijo
– Nombres como subíndices
– Implementación con descriptor

Ejemplo JS
var items = {"tucuman": 12, "cordoba": 19, "salta": 21, "jujuy": 31, "merlo": 47,
"catamarca": 51, "mendoza": 61, "rosario": 73, "corrientes": 88};
listString = "";
for (var word in items) listString += items[word] + ", ";
alert(listString);

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 35

Mapa de memoria de datos


#include <iostream> global ctos
using namespace std; 400
int ctos;
int totalizar(int *v){ 400 3
int i, s = 0; heap
for (i = 0; i < ctos; i++)
s += v[i]; 300 304 308
return s; 300 21 9 16
}
int main(){ stack
int *nros, total, k;
cin >> ctos; v i s
nros = new int [ctos];
for (k = 0; k < ctos; k++) 210 214 218
cin >> nros[k]; 300 10
2
3 46
21
30
0
total = totalizar(nros);
nros total k
cout << total;
delete nros; 100 104 108
}
100 300 46 3
2
1
0

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 36

Stack vs. Heap


• Almacenamiento dinámico
• Ámbito de referencia heap uu nn oo \0
d o s \0
• Tiempo de vida del objeto de dato

void main() { *s *q t
char *s, *q, t[5]; stack
s = (char *)malloc(9); d o s \0
strcpy(t, "dos");
strcpy(s, "uno"); int pop(int stac[], int *t) {
strcat(s, t); int poped;
q = s; if ((*t) == -1) {
return(0);
free(s);
} stack o heap
... else {
puts(q); poped = stac[*t--];
} return poped;
}
}

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 37

Gestión del Heap


Estados Métodos de
Asignación
posibles de reclamo de
bloques
celdas “basura”
Libre: sin referencias y
marcada libre
Contador de
Tamaño único
referencias
Ocupada: con
referencias y marcada
ocupada

Basura: sin referencias


y marcada ocupada
Recolección de
Tamaño variable
Colgada: con basura
referencias y marcada
libre

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 38

Técnicas para evitar “dangling”


Lápidas y tumbas
Debe usar contador de referencias para garantizar el no dejar referencias colgadas
El apuntador contiene la dirección de la lápida y esta la del objeto
Al liberar objeto, se asigna en la lápida un nulo
Complejidad en tiempo:
- creación de lápidas cuando se alojan objetos
- chequear validación en cada acceso
- doble indirección para acceso
Uso de espacio:
- espacio extra para las lápidas
- nunca desalojar lápidas o poner contador de referencia a cada lápida

Llaves y cerraduras
Debe usar contador de referencias para garantizar el no dejar referencias colgadas
Deben coincidir los valores de lock y key
Al desalojar objeto, coloca un nulo en lock
Complejidad en tiempo:
- comparación de cerraduras y llaves en cada acceso
Uso de espacio:
- espacio extra para las cerraduras en cada apuntador
y objeto del heap

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 39

Enumeraciones
Se define un nombre para cada valor

Símbolos asociados a números enteros

No son cadenas

Valores de la enumeración inicializados

No soportan I/O

enum Color {Rojo, Verde, Azul};


enum OtroColor {otroRojo = 3, otroVerde = 2, otroAzul = 2};
enum Color x = Verde, z = Azul;
enum OtroColor y;
x = x + 1;
x = z - x;
y = otroAzul - otroVerde;

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 40

Registros
struct AUTO {
char marca[10]; miAuto

float precio; marca precio modelo t


unsigned modelo;
char t;
} miAuto; 10 4 4 1

struct PERSONA { 19 bytes


unsigned int DNI;
char nombre[20]; Estructura y alineación
struct FECHA { Tamaño
unsigned int d; Referencia a miembros
unsigned int m; Direcciones de memoria
unsigned int a;
Asignaciones
} nacido;
Punteros a miembros
};
struct PERSONA el, ella;

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 41

Implementación de registros
Conjunto heterogéneo de datos gestionados como un bloque

struct { Alumno 24569


char *s; 3 “Juan”
int n; legajo 32456987
float m[10]; unsigned int
struct Alumno {
} v[12]; dirección
unsigned int legajo;
nombre char nombre[20];
array (v) char[20] unsigned long dni;
dirección };
dni struct Alumno x, *p;
12 struct
x.legajo = 24567;
unsigned long
strcpy(x.nombre, “Juan”);
pointer (s) int (n) array (m) dirección x.dni = 30768435;
p = &x;
char 10 float

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 42

Uniones
struct LEASING { Espacio de almacenamiento compartido
unsigned short int cuotas;
por diferentes campos de datos
float valor;
}; Espacio asignado según el campo de
struct CONTADO { mayor tamaño
float monto; Peligro: almacenar por uno de los campos
char chq;
y luego recuperar por otro
};
union MODO { Normalmente vinculados a un valor
struct LEASING a; ‘discriminante’
struct CONTADO b;
};
… operacion[17] …
typedef char ID; venta tipo
a
struct VENTA { … cuotas valor …
MODO venta; b
ID tipo; monto chq
} operacion[100];
|----------------------- 6 -----------------------|---1---|

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 43

Campos de bits
Espacio de almacenamiento fraccionado en bits
Todos los campos del mismo tipo de entero sin signo
Tamaño múltiplo según el tipo de entero aplicado
Campos no accesibles mediante punteros
Soportan operaciones de I/O

struct FECHA {
unsigned short int dia : 5;
unsigned short int mes : 4;
unsigned short int anio : 7;
} ingreso;
ingreso.dia = 19; // 10011
ingreso.mes = 27; // 11011
ingreso.anio = 7; // 111

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 44

Archivos

Almacenamiento Formato Estructura

• Persistente (discos, • Texto (secuencia de • Bytes (con uso o no de


pendrivers, CD, DVD, bytes, según formato) separadores)
etc.) • Binario (secuencia de • Registros
• S.O. usa buffers para bytes a imagen de la • Implementada por
I/O memoria) medio de metadatos

Modo
Apertura
Secuencial
Modo
Acceso
Directo
Modo
Operaciones Lectura
Indexado

Escritura

Cierre

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 45

Archivos

disco S.O.

int main(){ H o l a \n
FILE *fp;
char txt[7];
cin >> txt;
fp = fopen(“c:\\texto.txt”, “w”);
if (fp) {
fprintf(fp, “%s”, txt);
fclose(fp);
}
else
cout << “error”;
}

920 H o l a \n

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 46

Tipos recursivos
Almacenamiento dinámico
Tamaño ajustable
Implementación de árboles, pilas, colas, etc.

struct CIUDAD {
char nombre[15];
unsigned int dist;
struct CIUDAD *prox;
} *primero;

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 47

Generación de lista simplemente enlazada


typedef struct DATO{ *p *r
char nombre[10]; stack
struct DATO *prox;
} NODO; heap
nombre prox NULL
NODO* crear(int n){
NODO *p = (NODO*)malloc(sizeof(NODO));
p->prox = NULL;
for (NODO *r=p, int k=1; k < n; k++){ nombre prox NULL

r->prox = (NODO*)malloc(sizeof(NODO));
r->prox->prox = NULL;
r = r->prox; nombre prox NULL
}
return p;
}
...
NODO *primero = crear(3);

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 48

Destrucción de lista simplemente enlazada

void destruir(NODO *p){ *p *r


NODO *r; stack
while (p){
r = p->prox; heap
free(p); nombre prox
p = r;
}
}
nombre prox
...
NODO *primero = crear(3);
...
destruir(primero); nombre prox NULL

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 49

Subprogramas o subrutinas
• Implementan la abstracción de procesos
– Procedimientos (un punto de entrada y uno de salida)
• Definen nuevos enunciados (sentencias)
• No regresan valores
• Pueden modificar variables del contexto de la rutina llamadora
• Localidad de datos
• Acceso a datos globales
– Funciones (un punto de entrada y uno o más de salida)
•Definen nuevas operaciones Decisiones de diseño
•Deben regresar un solo valor • ¿Las variables locales se alojan en forma estática o
dinámica?
•Localidad de datos
• ¿Cuáles métodos de pasaje de parámetos se usan?
•Acceso a datos globales • ¿Los argumentos de llamada son verificados con
– Co-rutinas (múltiples puntos de los parámetros formales?
• Si se pasa como argumento un subprograma:
entrada y salida)
¿Sus parámetros de verifican?
• Paralelismo ¿Cómo se trata el ambiente de referencia?
• ¿Pueden sobrecargarse?
• ¿Son genéricos para operar con diferentes tipos?
• ¿Se proveen formas de compilación separada?

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 50

Subrutinas y organización de la memoria


0x00000000
Definido durante la traducción
local vars
parameters registros de Creado al invocar la subrutina
framepointers stack activación
Destruido al regresar de la llamada
ret address
Gestiona datos de la subrutina
0x0012FFFF
Alojado en el stack o el heap
Ubicación fija o variable (recursión)
0x00401000
exe Code
dll Code code ejecución Prólogo
•Salvar actual frame pointer
0x0040a000 •Apuntar nuevo frame pointer
globals data •Modificar stack pointer para reservar espacio
statics de variables locales
jumptables •Salvar registros utilizados en la subrutina
bss
Ejecución
dynamic data •Cuerpo de instrucciones de la subrutina
objects heap Epílogo
•Poner valor de retorno en RA del llamador
•Restaurar registros de rutina llamadora
•Restaurar stack pointer y frame pointer
•Retornar el control al llamador

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 51

Ámbitos de una subrutina


char* func(char* M) { Código ejecutable Registro de activación
const int initval=2; Instrucciones para crear Punto de retorno
char *x = "igual"; el registro de activación Almacenamiento temporal
strcpy(x, (M+initval)); Código ejecutable Otros datos…
return x; Instrucciones para Valor retornado (func)
} destruir el registro M[]:parámetro
… 2 initval: const local
char s[10] = "alguna"; “igual” x: local
cout << func(s) << endl;

¿Qué ocurre al ejecutarlo?


¿Motivo de los errores? Registro
Registro
(en data-segment)
(en data-segment)
Código Registro
(code-segment) (en data-segment)

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 52

Información sobre símbolos de una subrutina


Alcance y tiempo de vida de los símbolos

Dinámico Local Global Estático


var n = -1; accesible a partir del punto de
function func2(m) { declaración, desde todo el
var initval=2; programa, durante toda la ejecución
if (initval == 2) x = m[initval];
return n * x; accesible sólo
} desde la función accesible a partir de que se
function func1() { donde se ejecute el enunciado donde
var k; declara aparece por primera vez
with (Math) {
k = [sin(0.5), sin(0.5), sin(0.5)];
}
n = func2(k); objeto de dato estático, accesible
desde todo el programa, durante
alert(x + ", " + n);
toda la ejecución
}

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 53

Alcance y existencia
Discriminante de
acceso: ámbito.id

Alcance

Tiempo de vida

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 54

Mecanismos de vinculación

Ámbitos

Estático Dinámico
(depende del texto del programa) (depende del flujo de ejecución)

Local De referencia Local De referencia


Bloque donde se Conjunto de todos Bloque donde se Contextos de las
declaran los los símbolos declaran los subrutinas “vivas”
símbolos accesibles en los símbolos, sin llamadas
La declaración contextos que importar la previamente
debe ser previa al incluyen al actual posición donde se Símbolos accesibles
uso del símbolo lo hace hasta que alguna
rutina llamada
posteriormente lo
redefine

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 55

Ámbito de acceso y reglas de alcance


var cadena = "hola"; #include <iostream>
function f (){ using namespace std;
resultado = cadena + ", un saludo"; int cant; ¿sin
cadena = "Hasta luego"; void func2(void){ extern?
} ¿if falso? extern int cant;
function ff (){ ¿sin var? for (cant=1; cant<10; cant++)
var cadena = 0; cout << ".”;
var resultado = 0; }
if (resultado == 0){ void func1(void){
var valor = 1; int temp;
} temp = cant;
cadena = valor; func2();
alert("ff->R: " + resultado); cout << "cant: “ << cant << endl;
alert("ff->C: " + cadena); }
} int main(){
f(); cant = 100;
alert("C: " + cadena + “ R: " + resultado); func1();
ff(); getchar();
alert("C: " + cadena + “ R: " + resultado); }

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 56

Ámbito de acceso y reglas de alcance


Reglas de alcance estático: importa la declaración y dónde se hace

Reglas de alcance dinámico: importa sólo la declaración

procedure P is
procedure Q is El alcance a los símbolos es dentro de
procedure R is un ámbito de acceso
...
end R
...
end Q Estático Dinámico
procedure S is ¿S? R S
...
R S R S R
end S
... Q Q S Q Q
end P P P P P P

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 57

Bloques de código y alcance


JS
function sumaCuadrados(a, b) {
• Implementados como function cuadrado(x) {
return x * x;
subprogramas sin }
parámetros return cuadrado(a) + cuadrado(b);
• Reservando espacio }
local en el registro de ...
activación C/C++ (implementa una union)
void P() {
int I;
...
if (...) {
int J;
...
}
while (...) {
int K, L;
...
}
}

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 58

Referencia al contexto
Code: main
Código Almacenamiento foo
Estático : x
int x; estático (global)
Parámetros: void
int foo(int z) { dinámico en stack Retorno: exit
char ch[100]; dinámico en stack Link dinámico: void
if (z == 23) foo(7); Link estático
Variables locales: y, str
return 3;
Parámetros: z = 23
} Retorno
void main() { Link dinámico
int y; dinámico en stack Link estático
Variables locales: chr[]
char *str; dinámico en stack
Parámetros: z = 7
str = new char [100]; dinámico en heap Retorno
y = foo(23); Link dinámico
delete str; Link estático
Variables locales: chr[]
}

Heap: []

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 59

Referencia al contexto en subrutinas anidadas


Cadena de llamada: P() Q() R() S()
Estructura del programa Cadena estática Display
P LE Display
Q LD LD
S
R Datos Datos
… LE Display
S() LD LD
… R
… Datos Datos
R() LE Display

LD LD
Q
S Datos Datos

… LE Display
Q() LD LD
… P
Datos Datos

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 60

Ambientes (contextos) de referencia


• Clausura o cierre
Evaluación en un contexto desde donde se accede a otros
contextos
• Acceso al ámbito de referencia
Estático: si una referencia no se encuentra en el
ambiente actual, se busca en los ambientes que ?

lo contienen (sigue la cadena estática)

Dinámico: si una referencia no se encuentra en el


?
ambiente actual, se busca en los ambientes
previos en la pila (sigue la cadena dinámica)

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 61

Acceso al ámbito de referencia


program main Estático:
var a : integer; La referencia apunta al vínculo estático
procedure first; (compile-time) más reciente
begin Se muestra la variable global “a” (cuya
a := 1; última modificación fue en first)
end; Dinámico:
procedure second La referencia apunta al vínculo dinámico
var a : integer; (run-time) más reciente
begin Crea un vínculo hacia “a” cuando ingresa
al main
first;
end; Crea otro vínculo hacia “a” cuando
ingresa a second, entonces la asignación
begin en first sigue este último vínculo
a := 2; Se muestra la variable global “a” con su
second; valor original (porque la otra ya no existe)
write(a);
end.

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 62

Referencia en contextos recursivos


static links display
contexto global (estático)
... Q Q
procedure P is Q Q
procedure Q is
... Q Q
Q() P P
... P P
end P P
...
P P
P()
...
end contexto global
...
contexto global (dinámico)

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 63

Registro de activación y formas recursivas


Normal De cola
rutina(parámetros) { tipo función(parámetros) {
… procesado … procesado
if (??) rutina(argumentos) if (??) return función(argumentos)
… procesado al regresar }
}

Transitiva ¿Ubicación en stack fija o variable?


rutinaA(parámetros) { recursive function Factorial( N ) result( Fac )
… procesado integer, intent(in) :: N
if (??) rutinaB(argumentos) integer :: FAC
… procesado al regresar if (N == 0) then
} Fac = 1
rutinaB(parámetros) { else
… procesado Fac = N * Factorial( N - 1 )
rutinaA(argumentos) end if
return
… procesado al regresar
end function Factorial
}

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 64

Pasaje de argumentos

Rutina-a Rutina-b

• Argumentos • Parámetros

Retorno de valor Pasaje


(efecto de asignación) (efecto de asignación)

Valor
Referencia
Resultado
Modos
Valor-resultado
Nombre
Pre-inicializados
Otros
Constantes

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 65

Pasaje de argumentos por valor


Implementado por defecto en la mayoría de los lenguajes
El valor del argumento se copia en el parámetro formal
No adecuado para objetos de datos grandes
Los argumentos pueden ser variables, expresiones o constantes literales

C++ n r aux
int fact(int n) { 700 704 …
int r; 0 1
if (n == 0) n r aux
r = 1; 650 654 …
else 1 1 1
r = n * fact(n – 1); n r aux
return r; 600 604 …
} 2 2 1
void main() { n r aux
int r, x = 3; 550 554 …
r = fact(x); 3 6 2
} r x aux
500 504 …
Base de pila 6 3 6

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 66

Pasaje de argumentos por referencia


La referencia al argumento se copia en el parámetro formal (usa punteros)
Permite modificar contenidos de variables fuera del contexto de la subrutina
Preferible para objetos de datos grandes
Los argumentos sólo pueden ser variables
C++
void permutar(int &a, int &b) {
int t; Versión con punteros
t=a; void permutar(int *a, int *b) {
a = b; int t; a b t
b = t; t = *a ; 546 550 554
} *a = *b;
500 504 5
*b = t;
void main() { x y
}
int x = 5, y = 6; void main() { 500 504
permutar(x, y); int x = 5, y = 6; 65 56
cout << x << y; permutar(&x, &y);
} cout << x << y; Base de pila
}

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 67

Cuidados con el uso de ‘alias’


void mover(int &a, int &b, int &c) { int sum = 0;
a = b; …
b = c; void total(int &total, int val) {
} sum += val;
int main() { total += val;
int x = 3, y = 5; }
mover(x, y, x); int main() {
cout << x * y << endl; int k = 7;
} sum total(sum, k);
global 980
¿qué muestra? cout << sum << endl;
0 }
a b c total val
600 604 608 600 604 ¿qué muestra?

Stack 7
x y k
504 508 504
3 5 7

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 68

Pasaje de argumentos por resultado


Útil para retornar más de un valor, sin pasar argumentos por referencia
No es necesario inicializar la variable usada como argumento en la llamada
No se usan para pasar valores a la subrutina invocada

C#
namespace ConsoleApplication1 {
class Program {
static void divide(int n, int d, out int c, out int r) {
c = n / d;
r = n % d;
}
static void Main(string[] args) {
int x = 19, y = 4, rpta, resto;
divide(x, y, out rpta, out resto);

} Si usamos ‘ref’ en lugar de
} ‘out’ el traductor obliga a
} inicializar las variables

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 69

Pasaje de argumentos por valor-resultado


Fortran 95
Una mezcla de pasaje por valor y referencia
program Main
implicit none Útiles en entornos de multiprocesos (threads, etc.)
integer :: X, Y
X=9 ---------------En paralelo-------------

X referencia
Y=2 Main

X valor
call permuta(X, Y) permuta(X, Y) permuta(A, B)
… …
stop T=A
permuta(X, Y)
contains A=B permuta(A, B)
subroutine permuta(A, B) … B=T T=A
integer, intent(in out) :: A, B … return A=B
integer :: T X’, Y’
X, Y sin modificar B=T
T=A
… return
A=B
B=T Al retornar X’’, Y’’
actualiza X, Y …
return
Al retornar
end subroutine permuta stop actualiza X, Y
end program Main

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 70

Pasaje de argumentos por nombre


Opera cuando se pasan expresiones como argumentos en la llamada
Lenguajes que operan en tiempo real (por ejemplo para control como ‘Scala’)
El argumento de llamada
No es evaluado al momento de hacer la llamada
Es re-evaluado cada vez que se referencia el parámetro dentro de la función

Una aproximación (estática) a la idea Por valor vs. por nombre


begin
n*2 integer n;
procedure p(k: integer);
#define mayor(a, b) ( (a) > (b) ? (a + b) : (a * b) ) begin
n*2 n*2 print(k);
int n = 6; n := n+1;
… print(k);
end;
cout << mayor(n * 2, 0) << endl;
n := 0;
p(n+10);
end;
valor: 10, 10 nombre: 10, 11

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 71

Lista variable de parámetros


procedure main is
void A(int X, ...) { Parámetros procedure suma(a, b : in integer := 0;
int Y; Link dinámico c : in out integer) is
C(Y); C Link estático begin
} c := a + b;
Retorno a: A argN end;
void B(float R) { Parámetros … x, y : integer;

int S; begin
Parámetros arg1
int T; x := 5;
Local: X, Y y := 4;
A(S);
A Link dinámico suma(c => x, a => y);
} program mainend;
void C(int Q) { Link estático implicit none
call suma(a = 4, c = 5)
// hace algo Retorno a: B
stop
} Parámetros contains
void main() { Local: S, T subroutine suma(a, b, c)
float P; B implicit none
Link dinámico integer, optional, intent(in out) :: a, b
B(P); Link estático integer, intent(out) :: c
} if ( .not. present(b) ) b = 0
Retorno a:main
c=a+b
main Local: P return
end subroutine media
end program main

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 72

Punteros a funciones
Pasaje de parámetros por nombre

Funciones de orden superior


• Forma: tipo devuelto (*var) (tipos args)
• Forma: Function (arg {‘,’ arg}*, cuerpo)

float una(int a) { return 1; } var suma = new Function("x",


float dos(int a) { return 2; } "y",
float tres(int a) { return 3; } "var a = x * x,
int main() { b = y * y;
float (*q[ ]) (int) = {una, dos, tres}; return a + b");
for (int k = 0; k < 3; k++) var rpt = suma(2, 3);
cout << (*q[k])(k << endl); alert(rpt);
}

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 73

Subrutinas como parámetros

Subrutinas de Subrutinas de Subrutinas de


primera clase segunda clase tercera clase
• Pasadas como • Sólo pasadas como • No pueden ser
argumento argumento pasadas, ni
• Retornadas retornadas
¿Qué pasa con el
• Asignadas a una ¿Qué pasa con el
ambiente de
variable ambiente de referencia?
referencia?

Para establecer el ambiente de referencia correcto al ejecutar


subprogramas pasados como parámetros hay tres opciones:
•El ambiente del subprograma que invoca al subprograma pasado.
•El ambiente del bloque o subprograma, en el que el subprograma
pasado está declarado.
•El ambiente del bloque o subprograma, que incluye la instrucción de
llamada que trasmite al subprograma como un parámetro real.

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 74

Subrutinas como parámetros


Contexto estático function main(){ Vínculo superficial:
var x = 1, y = 2, z; Busca variables en
• Ambiente de referencia fijo function add() { el ambiente desde
(no importa desde donde se z=x+y; cual se llamó la
pasa o llama) } subrutina (usando
function second(p) { un stack por cada
Vínculo profundo (deep) var x = 2; variable o una tabla
• Vincula el ambiente de p(); central con entradas
referencia en el momento que y = x + 1; por cada variable)
la rutina se pasa como }
function first() {
argumento (referencia
y = 3; Vínculo profundo:
estática al contexto)
second(add); Busca variables en
} el ambiente desde
Vínculo superficial (shallow) first(); cual se pasó la
} subrutina
• Vincula al ambiente de main(); (siguiendo vínculos
referencia en el momento que estáticos o
la rutina se llama (referencia dinámicos)
dinámica al contexto)

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 75

Calificación de parámetros de subrutinas


Pre-inicializados (Ejemplo C++) Constantes (Ejemplo C++)
int mcd(int x = 1, int y = 1) { enum Rpta { error = -1, no, si };
int t; struct Info {
t = (x < y) ? x : y; unsigned int peso;
while ( (x % t) || (y % t)) --t; unsigned int edad;
return t; };
} Rpta calculo(const Info r){
Rpta v;
Pre-inicializados (Ejemplo ADA) if (r.edad > r.peso)
function mcd(x : in Integer := 1;
v = si;
y : in Integer := 1)
return Integer is else if (r.edad < r.peso)
t : Integer; v = no;
begin else {
while ( (x mod t) > 0 or r.peso = 0;
(y mod t) > 0) loop v = error;
t := t - 1; }
end loop; Error: assignment of
return v; data-member `Info::edad'
return t; }
end mcd; in read-only structure
(‘=‘ debe ser ‘==’)

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 76

Expansión y sobrecarga de subrutinas


Expansión Sobrecarga
inline float aceleracion(float v, float t = 1) { float operar(float x, char c) {
return v / t; return c == '*' ? x * 2 : x + 2;
} x/y }
int main() { int operar(int x, char c) {
float x = 34.8, y = 12.5; return c == '*' ? x * 2 : x + 2;
cout << aceleracion(x, y); }
cout << aceleracion(x); char* operar(char *x) {
} char y[strlen(x)+1];
strcpy(y, x);
x/1 return strcat(x, y);;
}
int main() {
Error: call of overloaded
`duplicar(double)' is ambiguous
char s[20] = "algo";
candidates are: float duplicar(float) cout << operar(4.6);
and int duplicar(int) cout << operar(s);
system("pause");
}

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________
Diapositiva 77

Evolución de lenguajes de programación


Año Lenguaje Diseñador Descendiente Año Lenguaje Diseñador Descendiente
1952 A-0 Hopper FLOW-MATIC 1972 C Ritchie C++, JS, Java

1955 Flow-Matic Hopper Cobol 1972 Smalltalk Kay y otros C++, JS, Java

1957 Fortran Backus Algol


1975 Scheme Steele, Sussman JS y otros funcionales
1958 Algol Un comité BCPL, Pascal

1958 Lisp McCarthy Scheme, Ruby 1978 Modula-2 Wirth Modula-3


1982 Ada EEUU
1959 Cobol Hopper, comité
1983 C++ Stroustrup Java y otros
1964 APL Iverson
1987 Self Ungar, Smith JavaScript
1964 BASIC Kemeny, Kurtz
1989 Modula-3 comité Java y Python
1964 PL/I IBM
1991 Python Van Rossum Ruby
1966 BCPL Richard B
1995 Java Gosling C# y otros
1967 Perl Wall Ruby
1995 JavaScript Eich
1969 B Thompson C 1995 PHP Lerdorf
1970 Prolog Colmenauer, Roussel 1995 Ruby Matsumoto
1998 Haskell Curry
1970 Pascal Wirth Modula-2
2000 C# Microsoft

_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________

Вам также может понравиться