Esercizio 1 Si consideri il programma in un linguaggio a oggetti simile a Java. class A { void callme() { System.out.println("Inside A's callme method"); } } class B extends A { void callme() // override callme() { System.out.println("Inside B's callme method"); } } class C extends A { void callme() // override callme(){ System.out.println("Inside C's callme method"); } } public class JDD { public static void main(String args[]) { A a = new A(); B b = new B(); // (punto 1) C c = new C(); // A r; r = a; r.callme(); //(punto 2) r = b; r.callme(); r = c; r.callme(); // (punto 3) } } Descrivere quali sono le informazioni presenti a run-time nei punti (1) (2) e (3). Indicando le informazioni presenti nella class area, method area nello heap e nel run-time stack. Esercizio 2 Si consideri il seguente frammento di programma in un linguaggio funzionale della famiglia di ML fun f1 x = let fun f2a f = ... f x ... and fun f2b y = let fun f3 z = y + z in ... (f2a f3) ... end in f2b 3 end; Supponiamo che il programma principale (Main) invochi la funzione f1 5. Descrivere la struttura dei record di attivazione sullo stack indicando l’informazioni relative al puntatore di catena statica, puntatore di catena dinamica e struttura dell’ambiente locale. Esercizio 3 Si consideri il frammento di programma ML let rec iterate f n m= if n = 1 then f m else f (iterate f (n - 1) m) in let succ n = n + 1 in let m = 5 in iterate succ 1 m Descrivere la struttura dei record di attivazione sullo stack indicando le informazioni relative al puntatore di catena statica, puntatore di catena dinamica e struttura dell’ambiente locale. Esercizio 4 Si estenda il linguaggio didattico imperativo con il comando break. Il comando interrompe la normale esecuzione di un ciclo while ed esegue l'istruzione successiva al corpo del ciclo while. Descrivere come deve essere modificato l'interprete del linguaggio didattico in modo da gestire l'esecuzione di istruzioni break .