Sintaxis y semántica del lenguaje Práctica Nº 6 Esta práctica deberá resolverse en la semana del 15/05/13. 1) Describa detalladamente qué información se encuentra en un registro de activación de una unidad Pascal. 2) Enumere características de un esquema de asignación de memoria basado en pila y un esquema de asignación de memoria estático. 3) ¿Cuándo es necesario un esquema de asignación de memoria basado en pila? 4) Una rutina es sensible a la historia si puede producir diferentes resultados cuando se activa dos veces con los mismos valores como parámetro y las mismas variables globales. Explique por qué un lenguaje con asignación de memoria estático permite escribir rutinas sensibles a la historia. 5) Explique por qué los enlaces estáticos y dinámicos en un bloque tienen el mismo valor. 6) Dado el siguiente programa, describa en forma completa y detallada su registro de activación. Program Main; var i,j:integer; Procedure B; var k:integer; Procedure C; var z:integer; begin z:=i*j; i:= i + 4; end; begin C; k:= i + j; writeln(k); end; i:=2; j:=1; B; writeln(i,j); end. 7) Hacer la ejecución de los siguientes programas usando las reglas de alcance estático y dinámico. Muestre los estados de la pila y escriba los resultados del programa. Nota: Para cualquiera de las corridas asuma que las variables se inicializan en cero. a) Program Main; var i,j:integer; Procedure B; begin i:= i + 1; j:= j + 3; writeln(i,j); end; {B} Procedure A; var i:integer; begin i:=5; B; i:= i + 3; writeln(i); end; {A} begin i:= 2; j:= 15; A; writeln(i,j); end; {Main} b) Program Main; var i,j:integer; Procedure Tres; begin j:= j + 2; end {Tres}; Procedure Uno; Procedure Cuatro; var i:integer; begin i:= 15; Tres; i:= i + j; writeln(i); end;{Cuatro} Procedure Dos; var j:integer; Procedure Tres; begin i:=i - 4; end {Tres}; begin j:=2; Tres; i:= j + 3; Cuatro; writeln(j); end;{Dos}; begin Dos; writeln(j); end; {Uno} begin i:=20; j:=13; Uno; writeln(i,j); end {Main}; c) Program A; var i,j:integer; Procedure B; var j:integer; Procedure D; begin j:=j+4; end {D}; Procedure C; var k,j:integer; begin j:=i+1; D; k:=i-1; writeln(i,j,k); end {C}; begin j:=0; while i > 0 do begin C; i:= i - 1; j:= j + 2; B; end; end {B}; begin readln(i); j:=15; if i > 0 then B; end {A}; d) Program Main; var i,j:integer; v:array[1..4] of integer; Procedure Dos; begin while j < 6 do begin v[i]:= v[i] + 3; j:= j + 1; Dos; end; end {Dos}; Procedure Uno; var j:integer; begin i:= i + 1; j:=4; if v[i] =10 then Dos else v[i]:= v[i] + 7; writeln(j); end {Uno}; begin for i:=1 to 4 do v[i]:= i + 8; j:=3; i:=1; Uno; writeln(j); for i:=1 to 4 do writeln(v[i]); end. {Main}