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.