La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Classi ed Oggetti in Java (Cenni). Richiami Cenni sull’ Implementazione, Macchine Astratte, Compilatore, Interprete Ruolo delle Classi in Java Oggetti.

Presentazioni simili


Presentazione sul tema: "Classi ed Oggetti in Java (Cenni). Richiami Cenni sull’ Implementazione, Macchine Astratte, Compilatore, Interprete Ruolo delle Classi in Java Oggetti."— Transcript della presentazione:

1 Classi ed Oggetti in Java (Cenni)

2 Richiami Cenni sull’ Implementazione, Macchine Astratte, Compilatore, Interprete Ruolo delle Classi in Java Oggetti

3 Implementare un linguaggio implementazione un linguaggio L su una macchina ospite M O realizzare la macchina astratta M L sulla macchina ospite M O tipicamente L linguaggio ad alto livello M O esegue un linguaggio piu’ a basso livello (e.g. linguaggio macchina?)

4 Macchina Astratta  M L una collezione di strutture dati ed algoritmi in grado di memorizzare ed eseguire programmi di L §componenti della macchina astratta l interprete l memoria (dati e programmi) l controllo l operazioni “primitive” (del linguaggio della macchina ospite)

5 Macchine astratta Interprete Programma Dati op1 op2 …... opn Controllo Operazioni primitive Memoria

6 L’interprete controllo operazioni start stop acquisisci la prossima istruzione decodifica acquisisci gli operandi seleziona esegui op1esegui op2esegui opnesegui alt... memorizza il risultato

7 Dal linguaggio alla macchina astratta L linguaggio M L macchina astratta di L implementazione di L = realizzazione di M L su una macchina ospite M O se L è un linguaggio ad alto livello ed M O è una macchina “fisica” –l’interprete di M L è necessariamente diverso dall’interprete di M O –come si implementa?

8 Implementare un linguaggio implementazione di L 1: interprete (puro) –M L è realizzata su M O in modo interpretativo –scarsa efficienza, soprattutto per colpa dell’interprete (ciclo di decodifica) implementazione di L 2: compilatore (puro) –i programmi di L sono tradotti in programmi funzionalmente equivalenti nel linguaggio macchina di M O –i programmi tradotti sono eseguiti direttamente su M O M L non viene realizzata –il problema è quello della dimensione del codice prodotto due casi limite che nella realtà non esistono quasi mai: c’è sempre una macchina intermedia che estende eventualmente la macchina ospite in alcuni componenti

9 Implementazione mista MLML MIMI MOMO Programma in LProgramma in L M I realizzazione traduzione quando l’interprete della macchina intermedia M I non coincide con quello della macchina ospite M O esiste un ciclo di interpretazione del linguaggio intermedio L M I realizzato su M O

10 Interpretazione e traduzione pure Casi limite (possibili solo se i linguaggi sono molto vicini) M L = M I interpretazione pura M O = M I traduzione pura MLML MIMI MOMO Programma in LProgramma in L M I realizzazione traduzione

11 Implementazioni miste: vantaggi –per ottenere un codice tradotto più compatto –per facilitare la portabilità su diverse macchine ospiti si deve riimplementare l’interprete del linguaggio intermedio non è necessario riimplementare il traduttore –su una tipica macchina ospite e’ piu’ semplice realizzare l’interprete per ill linguaggio intermedio (piu’ vicino al linguaggio della macchina ospite).

12 L’implementazione di Java è un’implementazione mista –traduzione dei programmi da Java a byte-code, linguaggio macchina di una macchina intermedia chiamata Java Virtual Machine –i programmi byte-code sono interpretati

13 Vantaggi su una tipica macchina ospite, è più semplice realizzare l’interprete di byte-code che l’interprete di Java byte-code piu’ a basso livello

14 Vantaggi inoltre si possono effettuare una volta per tutte (a tempo di traduzione, staticamente) analisi, verifiche e ottimizzazioni che migliorano –l’affidabilità dei programmi (assenza di errori run-time) –l’efficienza dell’esecuzione (meno controlli run-time) varie proprietà interessate –controllo dei tipi –controllo sull’uso dei nomi e loro risoluzione “statica” –….

15 Analisi statica in Java Java è fortemente tipato –il type checking può essere in gran parte effettuato dal traduttore e sparire quindi dal byte-code generato come vedremo pero’ le relazioni di subtyping permettono che una entità abbia un tipo vero (tipo effettivo) diverso da quello apparente (tipo apparente) di conseguenza, alcune questioni legate ai tipi possono solo essere risolte a tempo di esecuzione –possono verificarsi errori di tipo a tempo di esecuzione rilevati da opportune eccezione

16 Ruolo delle classi in Java I programmi in Java consistono di classi. Le classi consentono di definire: collezioni di procedure stand-alone (metodi statici) oggetti (tramite variabili e metodi d’istanza, che definiscono il loro stato interno e le operazioni) Le due funzionalita’ possono coesistere all’interno di una stessa classe Una classe puo’ contenere variabili statiche e d’istanza Analogo per i metodi

17 Procedure Stand-alone Collezione di metodi statici (non ci sono variabili e metodi d’istanza) public class Num { public static int gcd (int n, int d) { while (n != d) if (n > d) n = n - d; else d = d - n; return n;} public static boolean isPrime (int p) { // implementazione} }

18 Oggetti Servono per creare nuovi tipi di dato con relative operazioni Vogliamo realizzare una classe BankAccount i cui oggetti sono dei semplici conti bancari. Vogliamo le seguenti operazioni  depositare denaro  prelevare denaro  chiedere il saldo corrente

19 Come si procede? Variabili d’istanza devono modellare lo stato degli oggetti Metodi d’istanza devo modellare le operazioni richieste Costruttore (o costruttori) per creare un nuovo oggetto della classe

20 Una possibile implementazione public class BankAccount { public double balance; //il saldo corrente // costruttori public BankAccount(double initial){ balance=initial; }

21 Una possibile implementazione // metodi public void deposit(double amount) { balance = balance + amount; } public void withdraw(double amount) { balance = balance - amount; } public double getBalance() { return balance; }

22 Oggetti Gli oggetti istanze della classe si creano tramite new Hanno il tipo nome della classe BankAccount p1= new BankAccount(1000); p1 e’ dichiarato con tipo BankAccount Nel seguito diremo definire una classe o definire un tipo

23 Variabili d’istanza Le variabili d’istanza appartengono agli oggetti Ogni oggetto ha la propria variabile d’istanza balance BankAccount p1= new BankAccount(1000); BankAccount p2=new BankAccount(2000);

24 Come si accede? Dato che le variabili d’istanza appartengono agli oggetti vi si accede tramite il riferimento all’oggetto (che puo’ anche essere implicito) Supponiamo per esempio di essere in un metodo esterno alla classe (tipo main) tramite il riferimento all’oggetto BankAccount p1= new BankAccount(1000); BankAccount p2=new BankAccount(2000); if (p1.balance=p2.balance) {…}

25 ATTENZIONE: Specificatore di Accesso public (si puo’ accedere da qualsiasi metodo della classe o non ) private (si puo’ accedere solo da metodi della classe)

26 Esempio Supponiamo che balance sia private allora il seguente accesso dal metodo main non e’ legale (viene rilevato dal compilatore) BankAccount p1= new BankAccount(1000); BankAccount p2=new BankAccount(2000); if (p1.balance=p2.balance) {…}

27 Ruolo di private Come vedremo e’ consigliabile sempre usare variabili d’istanza private Impediscono l’accesso diretto allo stato degli oggetti che puo’ essere modificato solo dai suoi metodi d’istanza (tipo per esempio deposit e withdraw) Creano un incapsulamento degli oggetti (fondamentale per garantirne un corretto funzionamento)

28 Metodi d’istanza I metodi d’istanza eseguono operazioni su un determinato oggetto (che e’ riferito come this nel suo corpo) devono essere chiamati con il riferimento all’oggetto (che puo’ anche essere implicito) per esempio da un metodo esterno alla classe come main BankAccount p1= new BankAccount(1000); BankAccount p2=new BankAccount(2000); p1.deposit(2000); p1.deposit(3000);

29 Specificatori di Accesso Valgono le stesse regole che per le variabili I metodi private possono essere chiamati solo dall’interno della classe Non fanno parte dell’interfaccia pubblica della classe (quindi delle operazioni che puo’ usare un utente del tipo di dato)

30 Metodi e Variabili Statici Variabili e metodi statici appartengono alla classe in cui sono dichiarati Sono quindi condivisi tra tutti gli oggetti della classe A differenza delle variabili e dei metodi di istanza che appartengono agli oggetti (istanze della classe). Come vedremo nella semantica stanno nell’ambiente delle classi e non nella heap

31 Esempio: var. statiche Supponiamo di volere modificare BankAccount in modo che ogni conto abbia una codice identificativo, ognuno diverso dagli altri Si puo’ utilizzare una variabile statica che mantiene il valore del primo numero intero fresh (non e’ ancora stato assegnato)

32 Una possibile implementazione public class BankAccount { public double balance; //il saldo corrente public int miocodice; //il codice del conto public static int codice; //il primo codice disponibile La variabile statica e’ unica e condivisa tra tutti i conti questo garantisce che il valore non sia stato gia’ usato La variabile d’istanza miocodice mantiene invece il codice dei singoli conti

33 Costruttore public BankAccount(double initial){ balance=initial; miocodice=codice; codice++; } La variabile statica e’ unica e condivisa tra tutti i conti Viene incrementata ogni volta che viene creato un nuovo conto

34 Specificatori di accesso Valgono le stesse regole viste per le variabili ed i metodi di istanza

35 Variabili e Metodi Statici: come si accede? Supponiamo per esempio di essere in un metodo esterno alla classe (tipo main) e che la variabile sia public (anche se non ha senso da un punto di vista di sicurezza) Come facciamo a riferirci alla variabile codice ?

36 Tramite la classe variabile statica BankAccount.codice=1; analogamente si potrebbe invocare un metodo statico della classe BankAccount

37 Regole di Visibilita’ dei Nomi Sono quelle verificate staticamente dal compilatore (si chiamano regole di scoping) Verifica che ogni accesso ad un nome (di variabile o metodo) sia legale, ovvero il legame tra le dichiarazioni e l’uso dei nomi

38 Regole di Visibililita’ dei Nomi E’ necessario richiamare le regole di base (le vedremo per bene nella semantica di MP) Sono un po’ piu’ complicate di quelle che avete visto fino ad ora (erano semplificate a scopo didattico) Complicate dalla coesistenza di nomi statici e d’istanza Tralasciando i vincoli imposti dagli specificatori di accesso

39 A cosa servono? Stiamo scrivendo un metodo Come facciamo a capire se un accesso del seguente tipo e’ legale? Path.I variabile Path.I(ListP) chiamata di metodo A quale identificatore I accedendo?

40 Nota E’ complicato perche’ I potrebbe essere statico o d’istanza o potrebbe essere una variabile locale del metodo Dipende dal Path e dal tipo di metodo (statico o d’istanza)

41 Cosa puo’ indicare un path? Accesso diretto (path vuoto) I Riferimento ad un oggetto this.I p1.I Riferimento ad una classe BankAccount.I

42 Per semplicare Vediamo le regole per le variabili Per i metodi e’ analogo

43 Path Vuoto I potrebbe essere una variabile locale o un parametro del metodo una variabile che si vede dalla classe (se il metodo e’ statico) una variabile che si vede dall’oggetto su cui il metodo e’ eseguito (se il metodo e’ d’istanza o e’ un costruttore)

44 Cosa e’ visibile da un oggetto? I suoi nomi d’istanza I nomi statici dichiarati nella classe a cui appartiene (perche’ sono condivise tra tutti gli oggetti)

45 Costruttore public BankAccount(double initial){ balance=initial; miocodice=codice; codice++; } Accesso diretto alla variabile d’istanza miocodice (this non e’ necessario ) si riferisce implicitamente a quella dell’oggetto creato Accesso diretto alla variabile statica codice che e’ condivisa e visibile tra tutti gli oggetti della classe (Bankaccount non e’ necessario )

46 Cosa e’ visibile da una classe? I suoi nomi statici Non sono visibili nomi d’istanza (sono relativi agli oggetti)

47 Metodo statico di BankAccount public static void incr(int x){ codice=x; } Accesso diretto alla variabile statica codice che appartiene alla classe del metodo Non potremo accedere direttamente alla variabile d’istanza miocodice (non ci sono oggetti di riferimento)

48 Path Classe Vediamo quello che si vede dalla classe Per esempio da main: BankAccount.codice=1; (accesso legale) BankAccount.balance=1; (accesso illegale)

49 Path Oggetto Vediamo quello che si vede dall’oggetto Per esempio da main: BankAccount p1=new Bankaccount(1000); p1.codice=1; (accesso legale) p1.balance=1; (accesso legale)

50 Conclusione La coesistenza di nomi statici e d’istanza complica il linguaggio Nelle prossime lezioni vedremo come estendere le regole della semantica di FP in modo da trattare espressioni del tipo Path.I Path.I(ListP)


Scaricare ppt "Classi ed Oggetti in Java (Cenni). Richiami Cenni sull’ Implementazione, Macchine Astratte, Compilatore, Interprete Ruolo delle Classi in Java Oggetti."

Presentazioni simili


Annunci Google