1. ¿Cómo toma memoria una variable y cómo la devuelve en los

Anuncio
LENGUAJES DE PROGRAMACIÓN I
2008
TRABAJO PRACTICO Nº 4
1. ¿Cómo toma memoria una variable y cómo la devuelve en los siguientes casos? Ejemplifique
a) En Algol (variables dinámicas)
b) En C o Pascal (variable referenciada por punteros)
c) En lenguajes de alcance dinámico
2. ¿Cuáles de las siguientes instrucciones en ALGOL generan fragmentación?
flex[1 : 0] z, x
z := (1,7,3,2,0);
z := (1,2,3);
z := (1,2,3,4);
z := (1,5,7,9,2,3);
3. ¿Cuáles de los siguientes fragmentos de programa generan garbage?
var
p,q,r: integer;
...
a) begin
...
new(p);
q:=p;
new(p);
...
end;
b)
begin
...
new(p);
new(r);
p:=q;
q:=r;
r:=p;
dispose(p);
...
end;
c)
begin
...
new(p);
new(q);
new(r);
q:=p;
q:=r;
...
...
end;
4. ¿Cuáles de las siguientes variables (de acuerdo a su tipo) pueden generar garbage y cuáles fragmentación?
a)
b)
c)
d)
e)
f)
g)
int * p;
ref int c;
declare p pointer;
var x: array [10];
flex [1 : 0] z;
[1..5, 1..4] int c;
char * y;
5. ¿Cuáles de las siguientes secuencias de instrucciones produce fragmentación, cuáles garbage y cuáles ambas cosas?
a) En Algol
flex int[1:0] A, B, C;
A:= (1,2,3,20,21);
B= (30,40,50);
C:= (2,4,6,8,10,12,14);
B[2]:=C[4];
B:=A;
C:= (3,5,7,9,11,13,15,17,19,21,23,24,30);
b) En C
int *P, *Q, *S;
P:=(int *) malloc(100);
Q:=(int *) malloc(300);
S:=(int *) malloc(200);
*(P+20):= *(Q+10);
P:= Q;
free(Q);
Q:=(int *) malloc(400);
c) En C
int *X, *Y, *Z, *W;
X:= (int *) malloc (30 * sizeof (int));
Y:= (int *) malloc (40 * sizeof (int));
Z:= (int *) malloc (50 * sizeof (int));
X:=Z;
free Y;
Y:= (int *) malloc (60 * sizeof (int));
W= (int *) malloc (32 * sizeof (int));
En todos los casos suponer que se utiliza el algoritmo de first fit.
6. Dado el siguiente fragmento de programa:
struct nodo
{int cantidad;
struct nodo * psig;
}nodo1;
nodo1 = (nodo *) malloc (sizeof (nodo));
nodo1 -> psig = (nodo *) malloc (sizeof (nodo));
nodo1-> psig -> psig = (nodo *) malloc (sizeof (nodo));
nodo1-> psig -> psig -> psig= (nodo *) malloc (sizeof (nodo));
nodo1-> psig -> psig -> psig -> psig = nodo1 -> psig;
free (nodo1)
a) ¿La instrucción free crea GARBAGE?
b) En caso afirmativo de a), cuáles de los algoritmos de GARBAGE COLLECTION lo detectan y cuáles no? ¿Por
qué?
7. Dado el siguiente fragmento de código que utiliza contadores de referencia para variables dinámicas:
int *q1, *q2;
int *q3, *q4, var4;
int q[11], v[n];
q1: = malloc(100);
q2: = malloc(150;
q3: = malloc(50);
q4: = &(var4);
q2:= q3;
q4:= q1;
free (q1);
var4:= v[3];
q4:= q2;
a) Indicar, paso a paso, cómo quedarán los contadores de referencia de las variables en el heap representándolas
gráficamente de la siguiente manera:
VBLE
contador
tamaño
b) Clasificar, de acuerdo a su lugar de almacenamiento, las variables que aparecen en el código indicando el tipo y
dónde están almacenadas.
8. Dado el siguiente pseudocódigo que utiliza contadores de referencia:
program MAIN
int *z1, *z2;
int *z3, *z4;
int q[1,n], v[5];
proc sub1
int *z5, *z6;
{
z6:= &v[1];
call sub3;
}
proc sub2
{
z4:= z1;
z2:= z3;
call sub1;
}
proc sub3
int variable;
proc sub4
{
Z3:= &(variable);
z2:= z1;
z5:= z2;
}
{
dispose (z4);
variable := q[1,6];
call sub4;
}
{
Z1:= new(20);
z3:= new(40);
call sub2;
}
Indicar, en cada asignación que considere válida, cómo se modifica el contador de referencias. En el caso de las
asignaciones inválidas, indicar por qué se produce.
9. Suponga que la administración del heap del lenguaje del siguiente ejemplo se basa en la existencia de contadores de
referencia.
- ¿Cuáles de las siguientes asignaciones afectan dichos contadores y de qué manera?
- ¿Dónde están ubicados los mismos?
int a,b;
int *pa, *pb, *pc, *pd;
a) pa = &a;
b) pb = &b;
c) pc = (int *) malloc (sizeof (int));
d) pd = (int *) malloc (sizeof (int));
e) pa = pc;
f) pd = pb;
10. Considere la situación que se crea cuando un puntero almacenado en la pila de registros de activación apunta a la raíz
de un árbol binario almacenado en el heap.
Suponga además, que el heap está implementado de manera tal que cada bloque del árbol contiene un contador de
referencia al mismo. Finalmente, considere la siguiente afirmación: “Si se elimina el puntero, todo el árbol se elimina
automáticamente”.
¿Es esta afirmación verdadera o falsa? Justifique su respuesta.
11. Indique cuál de las siguientes afirmaciones son verdaderas o falsas. Justifique la respuesta.
Los diferentes mecanismos de creación de garbage son:
a) Por el uso de punteros.
b) Por el uso de variables dinámicas con nombres
c) Por el uso de variables en lenguajes dinámicos.
12. Indique un ejemplo de lenguajes para cada una de las siguientes combinaciones o indique que es imposible:
a) Lenguaje sin defragmentación ni garbage collector.
b) Lenguaje con garbage collector y sin defragmentación
c) Lenguaje sin garbage collector y con defragmentación
d) Lenguaje con ambos
13. Escribir en pseudo-código un algoritmo para defragmentar un heap de un lenguaje con alcance y tipos dinámicos.
14. Se pretende analizar las ventajas e inconvenientes de almacenar las variables semidinámicas en el heap. Considere los
siguientes argumentos e indique si los mismos son correctos.
a)
Si las variables semidinámicas estuvieran en el heap, la ejecución de las unidades sería más lenta
b)
Si las variables semidinámicas estuvieran en el heap aumentaría la producción de garbage.
c)
Si las variables semidinámicas estuvieran en el heap aumentaría la fragmentación.
d)
Si las variables semidinámicas estuvieran en el heap sería más lenta la iniciación y finalización de las unidades.
Descargar