Osservazioni Generali • Struttura di programma • Gerarchia di classi: overloading, overriding, e dispatching • Analisi ed esecuzione • Modificabilità e condivisione 1 Struttura di Programma (Java) • Classi – Struttura stato degli oggetti – Operazioni sugli oggetti – Regole di accesso e visibilità – (in Java) anche interface • Package – Collezione di classi per: • Incapsulare (localizzare e condividere classi) • Definire un nuovo spazio di nomi 2 Gerarchia di classi: overloading, overriding Extends: Class C” extends C: C > C” Ereditarietà (singola): C > C” C” eredita l’ambiente di C Eccetto: overrinding overriding e overloading: due concetti molto diversi 3 naming e visibilità Naming (e ambienti) tutti gli usi di nomi all’interno dei metodi sono controllati per verificarne l’esistenza in accordo con le regole di visibilità quelle che abbiamo “implementato” nei vari meccanismi di naming con alcune restrizioni che dipendono dal linguaggio (modificatori di Java) Visibilità (spazio dei nomi): modificatori 4 Visibilità: I modificatori di Java Classi Variabili-MetodiClassi Default Package in cui occorre Package in cui occorre la classe Public Ovunque Ovunque Private Non previsto Classe in cui occorre Protected Non previsto Package in cui occorre la classe + sottoclassi Final Altri significati (non ha sottoclassi) Non modificabili - non overriding Static Altri significati (non ha superclassi) Altri significati (membri della classe) 5 Analisi ed Esecuzione • Esecuzione di un programma – Un esecutore che operi in accordo alle regole!! • Realizzato – Mediante: Interprete o Compilatore » Una combinazione » Macchina Virtuale – Utilizzando: Macchine di linguaggi di livello più basso • prima analisi del programma per: – Scoprire e rimuovere banali errori sintattici – Scoprire e rimuovere errori di uso di nomi ed espressioni 6 Analisi • Dipende dal linguaggio • In Java: – Controllo dei nomi (Path Id): • Tutti i nomi usati siano definiti – Controllo dei tipi: • Tutte le espressioni abbiano tipo compatibile con l’uso dell’espressione • Type checking statico 7 Analisi in Java • Il compilatore Costruisce delle tabelle R che corrispondono a: • A: Ambiente delle classi (con Frames di statiche e istanza, Ambienti metodi statitici e di istanza) • Hc: Frames = template per oggetti di classe C (lo troviamo in A stesso) • S: record di attivazione = template invocazioni nello stack • La tabella A come r (classi) ma contiene tipi invece di valori: – Gli identificatori hanno un tipo (primitivo o nome di classe) – Tipo apparente: definito dalla dichiarazione » R(Id)=T se T Id (variabile) » R(Id)=T’->T se T Id(T’ x){…} (metodo) 8 Analisi dei metodi • Ogni metodo – T f (T’ i){…} è analizzato, in R, separatamente valutando una invocazione fittizia f(i) in un record: • <c, emptyframe()> : se f è statico di classe c • <l, emptyframe()> : se f è di istanza dell’oggetto l di classe c • La trasmissione dei parametri della fittizia f(i): • Aggiunge <i,T’> al frame del record • La valutazione del corpo calcola in accordo alle regole: » Accesso oggetto classe C: template per oggetti di Hc » Accesso parametro di metodo: template del record S » Accesso locale metodo: template frame locali di S • l’invocazione fittizia f(i) ha tipo T’’’<T; 9 Analisi dei metodi -continua • Tutte le strutture ricevono un tipo: • Espressioni: – Path Id: R(Path Id); – new C(): C stesso; – Path Id(ea): T se 1) R(Path Id)=T’->T , 2) ea ha tipo T”<T’, – Invocazioni di e1 op e2 primitivi: T se op ha tipo T1xT2 ->T ed e1 ha tipo T1”<T1 ed e2 ha tipo T2”<T2 • Comandi: • x = e: V se x ha tipo T, ed e ha tipo T’ tale che T’<T • … • C1;C: V se C1 ha tipo V e C ha tipo V • Programma: V se tutte le strutture hanno tipo definito 10 Modificabilità e Condivisione Gli oggetti di una classe possono essere: • Modificabili: hanno operazioni che modificano valori del loro stato • Non modificabili: esempio, le stringhe Un oggetto è condiviso • se può essere raggiunto da due o più entità • se è modificabile, le modifiche si riflettono su tutte le entità Effetti laterali (all’esterno) in un metodo • attraverso i parametri (in Java solo per valori di tipo oggetto) • può modificare variabili di istanza e variabili (statiche) 11 Java e affidabilità Affidabilità = Protezione da errori a tempo di esecuzione è garantita in Java da : • controllo statico dei nomi a run time non è possibile tentare di accedere un nome non definito • controllo statico dei tipi a run time non si possono verificare errori di tipo (ma...) • la presenza del garbage collector (run time) non è possibile tentare di accedere oggetti non più presenti nella heap • sollevamento di eccezioni (run time) •controllo sugli indici per gli arrays •accesso a puntatori ad oggetti vuoti (null) •conversioni forzate di tipo (casting) 12