Case Study - Un (linguaggio) costrutto tipato: Accedere indirizzi fuori dai bounds di un array Char A[n1..n2]; Int i; … i = e … … A[i] … Sono due interi Come evitare che i esca dai bounds n1 e n2 L’utente deve scrivere … if is(n1,n2,i) then A[i] else error … //auxiliaries is(n1,n2)=\x->(x≥n1 & x≤n2) T = n1..n2; Char A [T]; T i; … i = T e … … A[i] … Tipo intervallo //auxiliaries Ord T => Assign T where =\(var,val)-> if (val≥n1 & val≤n2) then setq(var,val) else error Il programma è ben scritto L’utente deve completare la definizione di T Il compilatore fa il resto Cosa avviene: Senza tipiCosa avviene: con tipi UNTRAPPED ERRORS TRAPPED ERRORS
Case Study - statico vs. dinamico Trasferire controllo ad una parola non istruzione Apply f g = f g dato Come controllare il corretto Uso delle due occorrenze f? Il compilatore aggiunge “tipi” per l’esecutore (ma non è in grado di verificarli) = Il compilatore trova una soluzione quindi: codice e dati correttamente “combinati” Cosa avviene: dinamicoCosa avviene: statico TRAPPED ERRORS codice L’esecutore deve controllare la “veridicità” dei tipi “c” e “d” e può caricare la memoria di conseguenza Apply f g = f g apply: t1->t2->t3 f: t1 & f: t4->t5 g: t2 & g: t4 L’esecutore deve solo eseguire Nessuna necessità di un DOPPIO LOADING di f TRAPPED ERRORS UNTTRAPPED ERRORS: quando il compilatore non sa aggiungere tipi