Logo Studenta

SINTAXYS programacion Unidad II_2

¡Este material tiene más páginas!

Vista previa del material en texto

Diapositiva 1 
 
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
Diapositiva 2 
 
Front-end:
del lenguaje de alto nivel al 
lenguaje intermedio
Back-end: 
del lenguaje intermedio al 
código binario
Arquitecturas de traducción
Código intermedio
(ensamblador, p-code, byte-code, etc.)
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
Diapositiva 3 
 
Proceso de traducción
Análisis lexicográfico
Análisis sintáctico
Análisis semántico
Generador de código
Código fuente
Código “tokenizado”
Árboles sintácticos
Árboles decorados
Código de máquina
G3. AEF. 
Tokenización
G2. AP. 
Árboles
Formales e informales.
Comportamientos.
Estáticas y dinámicas.
Optimización
z := (2*a*y+b)*(2*a*y+c)
t := 2*a*y;
z := (t+b)*(t+c);
for (k = 1; k < a + b; k++)
x = k * b
t = a + b;
for (k = 1; k < t; k++)
¿Compilado?
¿Interpretado?
¿Pseudo-compilado?
¿Errores semánticos?
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
Diapositiva 4 
 
Compilador nativo
Análisis lexicográfico
Análisis sintáctico
Análisis semántico
Optimización
Enlace (linker)
tokens
árboles
intermedio
objeto
programa
Generación de 
código máquina
Código objeto
(bibliotecas
estáticas)
Código objeto
(bibliotecas
dinámicas)
ejecutable
Tabla de símbolos
Nombre
Token asociado
Información de tipo
Alcance
Dirección
Inicialización
…
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
Diapositiva 5 
 
Traductor de un paso
Análisis 
lexicográfico
Análisis 
semántico
Análisis 
sintáctico
Tabla de 
símbolos
Generador
caracteres
código objeto
ejecutable
errores
Facilidad de uso
Aplicaciones sencillas
Poca optimización
Traducción rápida
Etapas de análisis y
generación unificadas
Código objeto 
ineficiente
Gestión de 
errores
U1
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
Diapositiva 6 
 
Intérprete puro
Tabla de 
símbolos
Evaluador
instrucciones
número
siguiente
instrucción
caracteres
etiqueta
resultado de la
ejecuciónerrores
Número de 
instrucción
Facilidad de uso
Permiten interactuar 
con el estado del 
programa
Sin optimización
Analizan y ejecutan
un enunciado por vez
Las instrucciones se 
Numeran o etiquetan
Requieren de un 
entorno para ejecutar
datos
Traductor a 
representación 
interna
…
instrucción
…
Gestión de 
errores
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
Diapositiva 7 
 
Pseudocompilador o intérprete parcial
Traductor
caracteres
resultado de la ejecución
Código 
intermedio
datos
errores
Lenguajes modernos
Traducen a un pseudo-
código de máquina
(por ej. P-code, byte-
code, …)
Multiplataforma
Intérprete por software
o hardware
Requieren intérprete
para la ejecución (VM),
pero es muy pequeño
Código de máquina
Just-in-time 
compiler
Intérprete
 
 
_____________________________________________________________________________
_____________________________________________________________________________
__________________________________________________________________________________________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
Diapositiva 8 
 
Compiladores e Intérpretes
Pre-procesador
Analizador
(léxico y sintáctico)
Compilador
Código de 
máquina
Programa
fuente
Árbol de 
análisis
Código 
ensamblador
Enlazador
Traductor Intérprete Intérprete parcial
Programa Byte code
Compiladores e intérpretes 
tienen similares front-end
pero diferentes back-end
Entorno de 
ejecución
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
Diapositiva 9 
 
Semántica de enunciados
• Características
– Enunciado vs. Operador
– Múltiple
– Inputs. Pasaje de argumentos. Retorno de valores
– inicialización vs. Asignación
<bloque> ::= <delimitador> { <enunciado> <separador> }* <delimitador>
| <enunciado>
<asignación> ::= <variable> <asignador> <expresión>
<enunciado> ::= <declarativo> | <asignación> | <control> | <I/O>
bifurcación, repetición, llamada a subrutina, salto
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
Diapositiva 10 
 
Semántica de enunciados
• Características
– Doble
– Múltiple
– Selector de casos
– Opción de descarte
– Esquemas de anidamiento
– Transferencia incondicional
– Rótulos
<bifurcación> ::= si <expr_lógica> entonces <bloque>
<bifurcación> ::= si <expr_lógica> entonces <bloque> sino <bloque>
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
Diapositiva 11 
 
Semántica de enunciados
• Características
– Esquemas de anidamiento
– Ciclos finitos e infinitos
– Modificación interna de parámetros
– Evaluación inicial y final
<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>
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
Diapositiva 12 
 
Implementación
Direcciones de 
memoria
Abstracción mediante 
variables
Descriptores
(conjunto de atributos)
Estáticos 
-nombre
-tipo
-dirección
-valor
-tiempo de vida
-alcance
Dinámicos
…
-tipo
-dirección
-valor
-tiempo de vida
-alcance
Almacenamiento 
binario
Formatos
Semántica de datos
Dato Descriptor y Dato DatoDescriptor
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
Diapositiva 13 
 
Declaración de variables
• Modelo imperativo: genera tres objetos
• Modelo declarativo: genera dos objetos
nombre ubicación valor
nombre valor
Vinculados al ingresar al 
ámbito de existencia
Vinculados mediante 
la asignación
A FFA0 9B76 21
A 21
Vinculados en el momento de 
la invocación
Sea: int A;
A = 21;
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
__________________________________________________________________________________________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
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 
 
Tipo
Escalar
Ordinal
Estándar
Entero
Carácter
Lógico
Definido x usuario
Enumerado
Sub-rango
No-ordinal Real
Punto fijo
Punto flotante
Puntero
Estructurado
Arreglo Cadena
Registro
Archivo
Sistema general de tipos
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
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
• Sólo positivosEnteros sin signo
• Precisión exacta
• Almacenamiento poco eficiente
Ej. 1234.567 => 1234567 con S=3
• Cantidad de decimales fija
Decimal o punto fijo
• 1 bit o 1 byteLógico
• ASCII (1 byte)
• UNICODE (2 bytes)
Carácter
En C/C++ los operadores &&, 
||, ! están asociados a los 
tipos numéricos
En C/C++ se trata como un 
tipo numérico
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
__________________________________________________________________________________________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
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
4. No son un enteros • dirección de 
memoria
Puntero
• valor
Objeto de 
dato
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 
 
A y B variables puntero: A  B
A: A:
B: B:
A una variable puntero a puntero y B puntero: A  B
A: B:
Asignación de punteros
7.2
0.4 0.4
7.2
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
Diapositiva 22 
 
Uso de punteros en C/C++
30
x
(250)
12 250
x = 12;
y = &x;
z = *y + 5;
17
*y = 30;
*y
(254)
z
(258)
int x, *y, z;
Nombres
Direcciones
Valores
* Indica que la variable es un puntero que guardará 
un valor de dirección de memoria
& obtener el valor de la dirección de 
memoria de la variable
* a la derecha de la asignación
Recuperar el valor apuntado por la variable puntero
* a la izquierda de la asignación
Guardar valor en el lugar indicado por el puntero
Operadores * y & siempre se colocan a la izquierda de una variable
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
Diapositiva 23 
 
Conceptos sobre tipos de datos
• Sistema de tipos
– Mecanismo para definir tipos
– Conjunto de reglas para determinar
• Equivalencia
• Compatibilidad
• Inferencia
• Verificación de tipos (type checking)
– Violación de la reglas (type clash)
– Lenguajes fuertemente tipeados
• Tipos estáticos
– Lenguajes débilmente tipeados
• Tipos dinámicos
+
-
JS
Ada
Java / C#
C/C++
ASM
Fortran
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
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
– Precedencia
– Asociatividad
– Sobrecarga
• Caracter
– tratamiento como enteros
• Cadena
– tipo predefinido
– arreglos
• Relacionales y lógicas
– evaluación x cortocicuito
• Aritméticas
– errores de redondeo vs. truncamiento (desbordamiento)
– bit de signo
Tabla de jerarquía/asociatividad en C
I-D () [] -> .
D-I ++ -- + - ! ~ (tipo) * & sizeof
I-D * / %
I-D + -
I-D << >>
I-D < <= > >=
I-D == !=
I-D &
I-D ^
I-D |
I-D &&
I-D ||
D-I ?:
D-I = += -= *= /= %= &= ^= |= <<= >>=
I-D ,
Sean
int a, *b, Z = 1, X = 4, Y = 2;
a = 4;
b = &a;
Árbol de expresión
++*b vs. *++b
++Z * Z++
Z + (Y == 0 ? X : X / Y)
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
__________________________________________________________________________________________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
Diapositiva 26 
 
Tipos estructurados
Grupo de datos del mismo o diferentes tipos 
Homogéneos
Arreglos
U
n
id
im
en
si
o
n
al
es
M
u
lt
id
im
en
si
o
n
al
es
En
u
m
er
ad
o
s
Heterogéneos
Registros
C
am
p
o
s 
d
e 
b
it
s
U
n
io
n
es
A
rc
h
iv
o
s Listas
Li
n
ea
le
s
A
n
ill
o
s
Á
rb
o
le
s
G
ra
fo
s
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
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
• 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];
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
Conjunto homogéneo de datos gestionado como un bloque
Suponemos enteros de 2 bytes
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
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
int x[4][3];
x[2][1] = 7;
L-value(x[i][j]) => DB + i * D + j * tTipo
D = dimensión_columna * tTipo
0 1 2
0
1
2 7
3
… …
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
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
2 3 4
-1
0
1
2
X : array [-1..2, 2..4] of byte
Tamaño: (4 – 2 + 1) * (2 - (-1) + 1) * 1 � 3 * 4 * 1 � 12 bytes
D: (4 – 2 + 1) * 1 � 3
OV: 100 - (-1) * D – 2 * 1 � 100 + 1 * 3 – 2 * 1 � 100 + 3 – 2 � 101
X[1,4]: 101 + 1 * 3 + 4*1 � 108
… …
[-1,2] [1,4][-1,4]
[0,2]
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
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
A[L1:U1, L2:U2, L3:U3] : TIPO
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
i
j
k
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
Diapositiva 33 
 
Arreglos n-dimensionales
Arreglo n-dimensional con rangos
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)
Acceso a un elemento
A[s1, ..., sn] = OV + Σ
n
i=1 (si * Di)
Hipercubo
Ejemplo para 3 dimensiones:
D3 = tTipo
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 
 
#include <iostream>
using namespace std;
int ctos;
int totalizar(int *v){
int i, s = 0;
for (i = 0; i < ctos; i++)
s += v[i];
return s;
}
int main(){
int *nros, total, k;
cin >> ctos;
nros = new int [ctos];
for (k = 0; k < ctos; k++)
cin >> nros[k];
total = totalizar(nros);
cout << total;
delete nros;
}
global
400
ctos
400
heap
300
300 304 308
stack
100
v i s
210 214 218
nros total k
100 104 108
Mapa de memoria de datos
3
300 46 0
300 0 0
21 9 16
123
211 302 463
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
Diapositiva 36 
 
Stack vs. Heap
• Almacenamiento dinámico
• Ámbito de referencia
• Tiempo de vida del objeto de dato
void main() {
char *s, *q, t[5];
s = (char *)malloc(9);
strcpy(t, "dos");
strcpy(s, "uno");
strcat(s, t);
q = s;
free(s);
...
puts(q);
}
*s *q t
heap
stack
�
�
�
�
�
�
d o s \0
u n o \0u n o d o s \0
�
int pop(int stac[], int *t) {
int poped;
if ((*t) == -1) {
return(0);
}
else {
poped = stac[*t--];
return poped;
} 
}
stack o heap
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
Diapositiva 37 
 
Gestión del Heap
Estados 
posibles de 
celdas
Libre: sin referencias y 
marcada libre
Ocupada: con 
referencias y marcada 
ocupada
Basura: sin referencias 
y marcada ocupada
Colgada: con 
referencias y marcada 
libre
Asignación 
bloques
Tamaño único
Tamaño variable
Métodos de 
reclamo de 
“basura”
Contador de 
referencias
Recolección de 
basura
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
Diapositiva38 
 
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
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
Técnicas para evitar “dangling”
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
Diapositiva 39 
 
Enumeraciones
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;
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
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
Diapositiva 40 
 
Registros
struct AUTO {
char marca[10];
float precio;
unsigned modelo;
char t;
} miAuto;
struct PERSONA {
unsigned int DNI;
char nombre[20];
struct FECHA {
unsigned int d;
unsigned int m;
unsigned int a;
} nacido;
};
struct PERSONA el, ella;
� Estructura y alineación
� Tamaño
� Referencia a miembros
� Direcciones de memoria
� Asignaciones
� Punteros a miembros
miAuto
marca precio modelo t
10 4 4 1
19 bytes
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
Diapositiva 41 
 
Implementación de registros
struct Alumno {
unsigned int legajo;
char nombre[20];
unsigned long dni;
};
struct Alumno x, *p;
x.legajo = 24567;
strcpy(x.nombre, “Juan”);
x.dni = 30768435;
p = &x;
Alumno
3
legajo
unsigned int
dirección
nombre
char[20]
dirección
dni
unsigned long
dirección
24569
“Juan”
32456987
Conjunto heterogéneo de datos gestionados como un bloque
struct {
char *s;
int n;
float m[10];
} v[12];
array (v)
12 struct
pointer (s)
char
int (n) array (m)
10 float
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
Diapositiva 42 
 
Uniones
�Espacio de almacenamiento compartido 
por diferentes campos de datos
�Espacio asignado según el campo de 
mayor tamaño
�Peligro: almacenar por uno de los campos 
y luego recuperar por otro
�Normalmente vinculados a un valor 
‘discriminante’
… operacion[17] …
…
venta tipo
…
a
cuotas valor
b
monto chq
|----------------------- 6 -----------------------|---1---|
struct LEASING {
unsigned short int cuotas;
float valor;
};
struct CONTADO {
float monto;
char chq;
};
union MODO {
struct LEASING a;
struct CONTADO b;
};
typedef char ID;
struct VENTA {
MODO venta;
ID tipo;
} operacion[100];
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
Diapositiva 43 
 
Campos de bits
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
� 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
 
 
_____________________________________________________________________________
_____________________________________________________________________________
__________________________________________________________________________________________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
Diapositiva 44 
 
Archivos
Operaciones
Apertura
Acceso
Modo
Secuencial
Modo
Directo
Modo
Indexado
Lectura
Escritura
Cierre
Almacenamiento
• Persistente (discos, 
pendrivers, CD, DVD, 
etc.)
• S.O. usa buffers para 
I/O
Formato
• Texto (secuencia de 
bytes, según formato)
• Binario (secuencia de 
bytes a imagen de la 
memoria)
Estructura
• Bytes (con uso o no de 
separadores)
• Registros
• Implementada por 
medio de metadatos
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
Diapositiva 45 
 
Archivos
int main(){
FILE *fp;
char txt[7];
cin >> txt;
fp = fopen(“c:\\texto.txt”, “w”);
if (fp) {
fprintf(fp, “%s”, txt);
fclose(fp);
}
else
cout << “error”;
}
disco S.O.
920 H o l a \n
H o l a \n
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
Diapositiva 46 
 
Tipos recursivos
struct CIUDAD {
char nombre[15];
unsigned int dist;
struct CIUDAD *prox;
} *primero;
Almacenamiento dinámico
Tamaño ajustable
Implementación de árboles, pilas, colas, etc.
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
Diapositiva 47 
 
Generación de lista simplemente enlazada
typedef struct DATO{
char nombre[10];
struct DATO *prox;
} NODO;
NODO* crear(int n){
NODO *p = (NODO*)malloc(sizeof(NODO));
p->prox = NULL;
for (NODO *r=p, int k=1; k < n; k++){
r->prox = (NODO*)malloc(sizeof(NODO));
r->prox->prox = NULL;
r = r->prox;
}
return p;
}
...
NODO *primero = crear(3);
*p
stack
heap
nombre prox NULL
nombre prox NULL
nombre prox
*r
NULL
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
Diapositiva 48 
 
Destrucción de lista simplemente enlazada
void destruir(NODO *p){
NODO *r;
while (p){
r = p->prox;
free(p);
p = r;
}
}
...
NODO *primero = crear(3);
...
destruir(primero);
*p
stack
heap
nombre prox
nombre prox
nombre prox
*r
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
• Deben regresar un solo valor 
• Localidad de datos
• Acceso a datos globales
– Co-rutinas (múltiples puntos de 
entrada y salida)
• Paralelismo
Decisiones de diseño
• ¿Las variables locales se alojan en forma estática o 
dinámica?
• ¿Cuáles métodos de pasaje de parámetos se usan?
• ¿Los argumentos de llamada son verificados con 
los parámetros formales?
• Si se pasa como argumento un subprograma:
¿Sus parámetros de verifican?
¿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
local vars
parameters
framepointers
ret address
exe Code
dll Code
globals
statics
jumptables
dynamic data
objects
0x0012FFFF
0x00401000
0x0040a000
0x00000000
heap
code
data
stack
bss
�Definido durante la traducción
�Creado al invocar la subrutina
�Destruido al regresar de la llamada
�Gestiona datos de la subrutina
�Alojado en el stack o el heap
�Ubicación fija o variable (recursión)
Prólogo
•Salvar actual frame pointer
•Apuntar nuevo frame pointer
•Modificar stack pointer para reservar espacio 
de variables locales
•Salvar registros utilizados en la subrutina
Ejecución
•Cuerpo de instrucciones de la subrutina
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
registros de 
activación
ejecución
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
Diapositiva 51 
 
Ámbitos de una subrutina
char* func(char* M) {
const int initval=2;
char *x = "igual"; 
strcpy(x, (M+initval)); 
return x; 
}
…
char s[10] = "alguna";
cout << func(s) << endl;
¿Qué ocurre al ejecutarlo?
¿Motivo de los errores? 
Código ejecutable
Instrucciones para crear 
el registro de activación
Código ejecutable
Instrucciones para 
destruir el registro
2
“igual”
Registro de activación
Punto de retorno
Almacenamiento temporal
Otros datos…
Valor retornado (func)
M[]:parámetro
initval: const local
x: local
Código
(code-segment)
Registro
(en data-segment)Registro
(en data-segment)
Registro
(en data-segment)
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
Diapositiva 52 
 
var n = -1;
function func2(m) {
var initval=2;
if (initval == 2) x = m[initval]; 
return n * x; 
}
function func1() {
var k;
with (Math) {
k = [sin(0.5), sin(0.5), sin(0.5)];
}
n = func2(k);
alert(x + ", " + n);
}
Información sobre símbolos de una subrutina
Alcance y tiempo de vida de los símbolos
Dinámico Local Global Estático
accesible a partir del punto de 
declaración, desde todo el 
programa, durante toda la ejecución
accesible sólo 
desde la función
donde se 
declara
accesible a partir de que se 
ejecute el enunciado donde 
aparece por primera vez
objeto de dato estático, accesible 
desde todo el programa, durante 
toda la ejecución
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
Diapositiva 53 
 
Discriminante de 
acceso: ámbito.id
Alcance y existencia 
Alcance
Tiempo de vida
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
Diapositiva 54 
 
Mecanismos de vinculación
Ámbitos
Estático
(depende del texto del programa)
Local
Bloque donde se 
declaran los 
símbolos
La declaración 
debe ser previa al 
uso del símbolo
De referencia
Conjunto de todos 
los símbolos
accesibles en los 
contextos que 
incluyen al actual
Dinámico
(depende del flujo de ejecución)
Local
Bloque donde se 
declaran los 
símbolos, sin 
importar la 
posición donde se 
lo hace
De referencia
Contextos de las 
subrutinas “vivas” 
llamadas 
previamente
Símbolos accesibles 
hasta que alguna 
rutina llamada 
posteriormente lo 
redefine
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
__________________________________________________________________________________________ 
 
Diapositiva 55 
 
Ámbito de acceso y reglas de alcance
#include <iostream>
using namespace std;
int cant; 
void func2(void){
extern int cant;
for (cant=1; cant<10; cant++)
cout << ".”;
}
void func1(void){
int temp;
temp = cant;
func2();
cout << "cant: “ << cant << endl;
}
int main(){
cant = 100;
func1();
getchar();
}
var cadena = "hola";
function f (){
resultado = cadena + ", un saludo"; 
cadena = "Hasta luego"; 
}
function ff (){
var cadena = 0;
var resultado = 0;
if (resultado == 0){
var valor = 1;
}
cadena = valor; 
alert("ff->R: " + resultado);
alert("ff->C: " + cadena);
}
f();
alert("C: " + cadena + “ R: " + resultado);
ff();
alert("C: " + cadena + “ R: " + resultado);
¿if falso?
¿sin var?
¿sin 
extern?
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
Diapositiva 56 
 
Ámbito de acceso y reglas de alcance
procedure P is
procedure Q is
procedure R is
...
end R
...
end Q
procedure S is
...
end S
...
end P
Estático Dinámico
¿S? R S
R S R S R
Q Q S Q Q
P P P P P
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
El alcance a los símbolos es dentro de 
un ámbito de acceso
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
Diapositiva 57 
 
Bloques de código y alcance
JS
function sumaCuadrados(a, b) {
function cuadrado(x) {
return x * x;
}
return cuadrado(a) + cuadrado(b);
}
...
C/C++ (implementa una union)
void P() {
int I;
...
if (...) {
int J;
...
}
while (...) { 
int K, L;
...
}
}
• Implementados como
subprogramas sin 
parámetros
• Reservando espacio
local en el registro de 
activación
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
Diapositiva 58 
 
Referencia al contexto
Código Almacenamiento
int x; estático (global)
int foo(int z) { dinámico en stack
char ch[100]; dinámico en stack
if (z == 23) foo(7);
return 3;
}
void main() {
int y; dinámico en stack
char *str; dinámico en stack
str = new char [100]; dinámico en heap
y = foo(23);
delete str;
}
Code: main
foo
Estático : x
Parámetros: void
Retorno: exit
Link dinámico: void
Link estático
Variables locales: y, str
Parámetros: z = 23
Retorno
Link dinámico
Link estático
Variables locales: chr[]
Parámetros: z = 7
Retorno
Link dinámico
Link estático
Variables locales: chr[]
…
Heap: []
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
Diapositiva 59 
 
Display
Display
LD
Datos
Display
LD
Datos
Display
LD
Datos
Display
LD
Datos
Referencia al contexto en subrutinas anidadas
Cadena de llamada: P()�Q()�R()�S() 
P
…
Q()
…
Q
…
R()
…
S
R
…
S()
…
Cadena estática
S 
R 
Q 
P 
LE
LD
Datos
LE
LD
Datos
LE
LD
Datos
LE
LD
Datos
Estructura del programa
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________ 
 
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)
?
?
 
 
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________

Otros materiales