La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Intelligenza Artificiale

Presentazioni simili


Presentazione sul tema: "Intelligenza Artificiale"— Transcript della presentazione:

1 Intelligenza Artificiale
Breve introduzione a Java (ed alla rappresentazione ad oggetti) Marco Piastra

2 Argomenti 1. Modello astratto e modello implementativo nei linguaggi di programmazione 2. Modello astratto: rappresentazione ad oggetti 3. Modello implementativo: macchina virtuale 4. Aspetti particolari: - gestione implicita della memoria (garbage collection); - multithreading; - programmazione distribuita.

3 1 Modello astratto e modello implementativo nei linguaggi di programmazione

4 Il progetto di un linguaggio
Da tener presente: un ‘linguaggio di programmazione’ è progettato in riferimento ad modello implementativo specifico; il progetto del linguaggio include un rilevante aspetto teorico, cioè un modello astratto (e.g. il concetto di variabile); i due aspetti sono strettamente correlati.

5 Il progetto di un linguaggio (2)
Scelta di un modello astratto: entità di base della programmazione (e.g. variabili globali, variabili locali, array, puntatori, funzioni). modo di descrivere i programmi (e. g. programmazione strutturata); linguaggio (inteso come unione di una sintassi ed una semantica formale); Scelta di un modello implementativo: tecniche di compilazione (e.g. compilazione parziale) e di linking; esecuzione a run-time (e.g. gestione della memoria, gestione dello stack delle chiamate); possibilità di estensione (librerie specifiche).

6 Origini di Java e C (e C++)
I due linguaggi hanno origini diverse Il C (ed il C++) derivano dagli studi sui linguaggi per la realizzazione di sistemi operativi (e.g. Unix) e software di base (e.g. database server) Java deriva (in gran parte) dai linguaggi sviluppati per l’intelligenza artificiale Infatti, ad esempio: anche se la sintassi assomiglia a quella del C++; il modello ad oggetti e l’idea della macchina virtuale e del bytecode provengono dallo Smalltalk-80; l’idea dei package proviene dal Common Lisp.

7 Creare un programma in C
#include <stdio.h> ... main(int argc, char **argv) { initialize(argv[0]); run(argv[1], argv[2]); if (!errno) printf(”Done.\n”); else exit(errno); } Codice sorgente cc <opzioni> <nomi di file> Binario Compilatore Programma eseguibile Linker Librerie Tipicamente: si creano uno o più moduli (file) di codice sorgente; si utilizzano librerie standard e/o librerie specifiche; il compilatore traduce il codice sorgente in un formato binario; il linker combina il prodotto della compilazione con le librerie.

8 Un interprete di programmi
Interprete Common Lisp ;; File fattoriale.lisp (defun fattoriale (par) (if (eq par 0) ;; then (return 0) ;; else (return (* par (fattoriale (- par 1))))) ) Codice sorgente Lisp> (load “fattoriale.lisp”) Done. Lisp> (fattoriale 2) 2 Listener Loader Binario Linker Librerie Tipicamente: non si produce un programma eseguibile indipendente; il codice sorgente viene tradotto in un formato binario; il collegamento tra ‘pezzi’ di programma viene fatto ‘al volo’; le operazioni effettive vengono eseguite dall’interprete.

9 Differenze di paradigma
In C: la sintassi è concepita per favorire i controlli di correttezza; le entità principali sono statiche (e.g. variabili globali, array, funzioni) e si usano tecniche esplicite per la gestione della memoria dinamica (i.e. malloc e free); un programma compilato ed eseguibile è di fatto immutabile. In un linguaggio interpretato (e.g. Common Lisp): la sintassi è concepita per facilitare la scrittura dl codice; le entità principali sono dinamiche, e.g. liste di elementi; la composizione di un programma è definita dallo stato dell’interprete al momento dell’esecuzione.

10 Il modello astratto di Java: rappresentazione ad oggetti
2 Il modello astratto di Java: rappresentazione ad oggetti

11 codice titolare saldo interesse fido
Un modello ad oggetti L’idea informale: rappresentare le entità della programmazione come aggregazioni di variabili e metodi Esempio: ContoCorrente comportamento saldoAttuale deposita codice titolare saldo interesse fido ritira struttura variabili modificaFido modificaInteresse metodi Agli inizi, qualcuno ha suggerito l’idea di circuiti integrati software

12 Scambio di messaggi Il flusso dell’esecuzione viene visto come un flusso di messaggi Esempio: Oggetto A Ciclista ricevente.nomeMetodo(parametri) bici.cambiaRapporto(2) bici Oggetto B Bicicletta messaggio Componenti di un messaggio: un riferimento al ricevente; il nome del metodo; i parametri.

13 Classi Descrivere gli oggetti uno ad uno è poco vantaggioso. Infatti:
ogni oggetto richiederebbe una descrizione specifica; la grande varietà ostacolerebbe la comunicazione. Al contrario, una classe è uno schema generale per la creazione di oggetti simili: la struttura degli oggetti è descritta come schema; il comportamento degli oggetti è definito in modo effettivo. struttura comportamento dichiarazione delle variabili metodi effettivi

14 Classi e istanze: ContoCorrente
class ContoCorrente { String codice; String titolare; float saldo; void deposita(float somma) { saldo += somma; } void preleva(float somma) { saldo -= somma; } } codice titolare saldo deposita ContoCorrente ritira N58AB Gino 1.350 istanza di istanza di AA54Z Pino 7.823 c1.deposita(31) istanza di N58AB Lino 2.500 c2.preleva(275) Operatore c3.deposita(50)

15 Ereditarietà L’idea di base è quella di classificare gli oggetti mettendo a fattor comune le analogie Animale Vertebrato Invertebrato Pesce Anfibio Rettile Uccello Mammifero Carnivoro Erbivoro Attenzione: la gerarchia dipende dallo scopo

16 Ereditarietà in Java Le sottoclassi ereditano la struttura (intesa come schema) ed il comportamento dalle superclassi var1 Alfa method1 class Alfa { String var1; void method1() { } } var1 var2 Beta method1 method2 class Beta extends Alfa { String var2; void method2() { } } var1 var2 var3 Gamma method1 method3 method2 class Gamma extends Beta { String var3; void method3() { } }

17 Struttura di classi Un programma Java è rappresentato da una gerarchia di classi La classe Object è la radice di tale gerarchia class A1 { } Object A1 B1 C1 Specializzazione Generalità A2 B2 B3 class A2 extends A1{ } B4 B5

18 Uso di una struttura di classi
Per classificare, ovvero strutturare le differenze nella pratica, si usa raramente Per fattorizzare, ovvero per scrivere meno codice Bicicletta Bicicletta Multirapporto Bicicletta Elettrica Bicicletta da Strada Mountain Bike codice titolare saldo deposita ContoCorrente ritira calcolaInteresse ContoManager ContoIO ContoFamiglia

19 Uso di una struttura di classi
Per disaccoppiare aspetti diversi di uno stesso programma e rendere lo stesso programma più facile da estendere a questo scopo si usano spesso anche le interfacce contenuto estrai Oggetto Trasmissibile inserisci Un ipotetico sistema di trasmissione usa solo questo livello della gerarchia ... Testo Immagine Video ... mentre le specializzazioni ulteriori sono pertinenti in altre parti del programma

20 Oscuramento dei metodi
(Detto anche overriding) In una sottoclasse si può oscurare un metodo definito in una superclasse con una nuova definizione. class Bicicletta { void cambiaRapporto(int r) { } } Ciclista bici.cambiaRapporto(2) bici Bicicletta class MountainBike extends Bicicletta { void cambiaRapporto(int r) { } } La compatibilità con la segnatura definita nella superclasse viene preservata (polimorfismo)

21 Specializzazione dei metodi
(Detta anche overloading) La ‘risposta’ di un oggetto ad un messaggio può dipendere dal tipo dei parametri class Zoofilo extends Persona { void accarezza(Gattino g) { affettuosamente } void accarezza(Tigre t) { col pensiero } void accarezza(Object o) { informati prima } } Spiritoso amico.accarezza(animaleSconosciuto) amico Zoofilo La selezione è automatica in base alla segnatura

22 Tipo delle variabili In Java ogni variabile deve avere un tipo dichiarato In prima approssimazione, vi sono due categorie di tipi: tipi primitivi: int, float, byte short, long, double, char, boolean); riferimenti ad oggetti (i.e. Object o sottoclasse). “Romano Prodi” class Ciclista extends Persona { int mediaKmAlGiorno; Bicicletta bici; ... void allenamento() { int rapporto; bici.cambiaRapporto(rapporto); } } valore 70 riferimento riferimento Bicicletta

23 Come si scrive un metodo
In prima approssimazione, un metodo Java è molto simile ad una funzione C: dichiarazione formale: nome del metodo, tipo di valore ritornato, nome e tipo dei parametri formali; gli operatori sono quelli del C (e.g. +, *, =, +=, ==, !=, ...); le istruzioni di controllo sono quelle del C (i.e., if, else, switch, for, while, do); l’istruzione di ritorno è return. class Aritmetica { long fattoriale(long arg) { if (arg == 0) { return 1L; } else { long temp; temp = arg * this.fattoriale(arg - 1); return temp; } } }

24 Aritmetica.fattoriale(33)
Classi come oggetti In Java anche le classi sono oggetti Quindi anche le classi: rispondono ai messaggi; hanno variabili (di classe); hanno metodi (di classe). Per definire le entità di classe si usa la parola chiave static Aritmetica fattoriale Aritmetica.fattoriale(33) class Aritmetica { static float piGreco = ; static long fattoriale(long arg) { } } Alle classi si può fare riferimento per nome

25 Nota: per chi conosce il C++
In C++ si usa la parola chiave static con lo stesso significato Ma in C++, le classi non sono oggetti ma solo dichiarazioni a beneficio del compilatore Conseguenza notevole: in Java si può determinare a run-time la classe di un oggetto, in C++ no. codice ContoCorrente class Zoofilo extends Persona { void accarezza(Object obj) { if (obj instanceof Serpente) { no grazie } else if (obj instanceof Pesciolino) { volentieri, ma come? } } } obj.getClass() N58AB istanza di

26 Protezioni L’accesso alle entità di classe o di istanza può essere protetto In Java vi sono quattro livelli di protezione e tre parole chiave: public accesso senza restrizioni protected solo nello stesso package o nelle sottoclassi package solo nello stesso package private solo nella classe class ContoCorrente { private float saldo; float saldo(Persona richiedente) { if (richiedente.autorizzato()) return saldo; else nega informazione } } class MountainBike extends Bicicletta { void cambiaRapporto(int r) { attivaProtezione(); super.cambiaRapporto(); disattivaProtezione(); } private void attivaProtezione() {...} private void disattivaProtezione() {...} }

27 Protezioni: esempio class Automobile { // attributi di classe
static int numeroDiRuote = 4; static public boolean haTarga = true; static private Vector archivio; // attributi di istanza public String marca; public String colore; public int annoDiImmatricolazione; public String targa; public int numero DiCavalli; protected Persona titolare; private int rapporto; // metodi di classe static protected void inserisciInArchivioAutoveicoli(Automobile a) { archivio.addElement(a); } ... // metodi di istanza public void cambiaRapporto(int r) { rapporto = r; public int rapporto() { return rapporto; }....

28 Costruttori Un oggetto Java viene sempre creato tramite un metodo speciale detto costruttore Ogni classe ha uno o piu` costruttori Valgono i principi di ereditarieta`, di specializzazione e di oscuramento class ContoCorrente { ContoCorrente() { generico } ContoCorrente(Persona richiedente) { intestato } } class ContoAziendale extends ContoCorrente { ContoAziendale() { // Oscuramento generico } ContoAziendale(Azienda richiedente) { // Specializzazione intestato } }

29 Pseudo-variabili Nei metodi di istanza, è possibile utilizzare le pseudo-variabili this e super this fa riferimento all’istanza stessa si usa per evitare ambiguità super fa riferimento all’istanza stessa come se appartenesse alla superclasse si usa per evitare ambiguità e per specializzare metodi class Ciclista extends Persona { Bicicletta bici; boolean dimmiSeTua(Bicicletta bici) { return this.bici = bici; } } class ContoCorrente { float saldo; void deposita(float somma) { saldo += somma; } } class ContoAziendale { RegistroCassa registro; void deposita(float somma) { super.deposita(somma); registro.annotaEntrata(somma); } }

30 contribuente.dichiaraImponibile(1998)
Interfacce L’idea di base è quella di un contratto tra oggetti, una sorta di visibilità limitata Fisco contribuente.dichiaraImponibile(1998) Persona interfaccia Contribuente interface Contribuente { float dichiaraImponibile(int anno); } class Ingegnere extends Persona implements Contribuente { float dichiaraImponibile(int anno) { } }

31 Uso delle interfacce Le interfacce contengono solo:
la dichiarazione di metodi (come signature); la definizione di costanti Le interfacce sono un tipo valido per le variabili Le interfacce possono essere organizzate in strutture ad eredità multipla Una classe può implementare un numero qualsiasi di interfacce class Ingegnere extends Persona implements Contribuente, MembroOrdineIngegneri, PersonaTipicamenteNoiosa, { }

32 Tipi in Java I tipi di dati in Java sono organizzati in quattro categorie: tipi primitivi (char, boolean, byte, int, long, short, float, double) le classi (i.e. Object e tutte le sue sottoclassi) le interfacce gli array (dei tre tipi precedenti) Non esistono invece i tipi: puntatori funzioni

33 Gestione delle eccezioni
La gestione delle eccezioni in Java è un sistema per governare il flusso dell’esecuzione a seguito di errori di fatto, sostituisce l’unico uso sensato della goto (che in Java non esiste) class Spiritoso extends Persona { void proponi(Zoofilo amico) { try { amico.accarezza(...); } catch (MaTuSeiMattoException e) { // Evidentemente, non gradisce } } } class Zoofilo extends Persona { void accarezza(Object obj) { if (obj instanceof ScorpioneVelenoso) { throw new MaTuSeiMattoException(); } } }

34 MaTuSeiMattoException
Eccezioni Le eccezioni sono organizzate come una gerarchia di classi; L’abbinamento throw / catch si stabilisce in base al tipo; Esistono eccezioni checked (i.e. che vengono controllate dal compilatore) ed eccezioni uncheked. Throwable class Zoofilo extends Persona { void accarezza(Object obj) throws MaTuSeiMattoException { if (obj instanceof ScorpioneVelenoso) { throw new MaTuSeiMattoException(); } } } Exception RuntimeException MaTuSeiMattoException

35 Il modello implementativo di Java: macchina virtuale
3 Il modello implementativo di Java: macchina virtuale

36 Modello implementativo
Le classi compilate in bytecode sono portabili su qualsiasi macchina per cui esista una macchina virtuale Java Il programma finale viene assemblato a run-time (i.e. linking tra le classi) e dipende quindi dall’ambiente di esecuzione Quindi: si possono costruire programmi indipendenti dalla piattaforma hardware e software (purchè esista una macchina virtuale) le classi compilate in bytecode assomigliano a componenti software ricombinabili a piacere

37 Macchina reale (e.g. PC Intel con Linux)
Bytecode non è un codice direttamente eseguibile ma è un codice (binario) per una macchina virtuale (cioè un interprete) che si incarica della esecuzione effettiva Classe in bytecode Macchina virtuale java Macchina reale (e.g. PC Intel con Linux)

38 Bytecode (2) metodo in Java bytecode compilato (in forma simbolica)
... void spin() { int i; for (i = 0; i < 100; i++) { // Loop body is empty } iconst_ // Push int constant 0 1 istore_ // Store into local variable 1 (i=0) 2 goto // First time through don't increment 5 iinc // Increment local variable 1 by 1 (i++) 8 iload_ // Push local variable 1 (i) 9 bipush // Push int constant 100 11 if_icmplt // Compare and loop if less than (i < 100) 14 return // Return void when done ... bytecode compilato (in forma simbolica)

39 Compilazione In Java la compilazione è:
parziale (ciascuna classe viene compilata separatamente) con verifica (di correttezza sintattica e di tipo) File “Alfa.java” javac <opzioni> Alfa.java class Alfa { String var1; void method1() { } } Compilatore Classe in bytecode File “Alfa.class” Verifica Librerie Classe in bytecode CLASSPATH Altre classi compilate

40 Programma Un programma Java è un insieme di classi
Generalmente tale insieme è chiuso, ma è potenzialmente aperto La composizione di questo insieme è stabilita dalla macchina virtuale a run-time Classe in bytecode ClassLoader java nomeClasse Macchina virtuale Classe in bytecode Classe in bytecode CLASSPATH CLASSPATH

41 Bootstrap dell’esecuzione
La macchina virtuale Java esegue come prima cosa il metodo main della classe di bootstrap java Copia DaUnFile.txt AUnAltroFile.txt class Copia { static void main(String[] args) { if (args.length < 2) { System.out.println( ”Uso: Copia <from> <to>” System.exit(0); } else { copia(args[0], args[1]); } } Copia.class Macchina virtuale Copia.class CLASSPATH

42 Package L’idea originale (Common Lisp) è quella di un sistema per organizzare i simboli nomi comuni come ad esempio “Persona” sono facilmente usati in più programmi i package possone essere utilizzati per contestualizzare il nome di una classe o interfaccia package it.unipv; package it.ministeroDelleFinanze; Persona package it.unipv.admin; Persona Dipendente Contribuente Studente

43 Package (2) L’idea originale (Common Lisp) è di un sistema di organizzazione dei simboli: si usa quindi una notazione qualificata composta da un prefisso e da un simbolo esempio: it.unipv.Persona la pseudo-istruzione package definisce il package di riferimento la pseudo-istruzione import serve ad abbreviare i riferimenti simbolici package it.unipv.esercitazioniAI; import it.unipv.Persona; class StudenteDelCorsoAI extends Persona { ... }

44 Packages & directories
In Java il sistema dei package è anche un modo per organizzare le classi (sia .java che .class): la struttura del prefisso viene trasformata in percorso nel file system : it.unipv.Persona diventa $CLASSPATH/it/unipv/Persona (.java o .class) i classloader della macchina virtuale (i.e. java) e del compilatore (i.e javac) usano le stesse convenzioni.

45 4 Altri aspetti particolari di Java: garbage collection, multithreading, programmazione distribuita

46 Allocazione dinamica della memoria
In C la memoria dinamica deve essere gestita in modo esplicito Errori comuni: mancata allocazione mancata deallocazione In C++ gli oggetti sono allocati dinamicamente In C++ esistono delle entità standard per facilitare la gestione (costruttori, distruttori)

47 Allocazione dinamica in Java
In Java tutte le entità sono allocate dinamicamente (e.g. non esistono variabili globali) Tuttavia, solo l’allocazione della memoria (intesa come creazione di oggetti) è gestita esplicitamente La deallocazione è gestita dalla macchina virtuale (garbage collection)

48 Mark and Sweep Un algoritmo di garbage collection che prevede l’interruzione dell’esecuzione Si usa quando gli oggetti sono molti e globalmente accessibili Obj054A Obj0F32 Mark Obj0102 Obj0987 Obj0B60 Obj01C3 Sweep Obj0B60 Obj0B60 Obj0102 Obj01F5 Obj0987 Obj0740 Obj01C3 Obj0E4F

49 Mark and Sweep (2) Il principale punto di partenza per la fase di mark è lo stack Test04 Stack (stadio n) Test03 Test04.t(0) null Test03.t(1) Test t Test02 Test02.t(2) Test t Test01.t(3) Test t Test01 class Test { static void main(String[] args) { Test t = new Test(); t.test(3); } void test(int n) { if (n == 0) return; Test t = new Test(); t.test(n - 1); } } GCTest.main Test t Test04 Test03 Test02 Stack (stadio n + 4) Test01 GCTest.main Test t

50 Reference Counting Un algoritmo di garbage collection che non prevede l’interruzione dell’esecuzione Si usa quando gli oggetti sono pochi e/o non raggiungibili globalmente (e.g. sistema distribuito) Obj054A(1) Obj0F32(0) Reference Counting Obj0B60(2) Obj0B60(1) Obj0102(1) Obj01F5(1) Obj0987(1) Obj0740(1) Obj01C3(1) Obj0E4F(1)

51 Multithreading Un thread è un flusso di controllo sequenziale in un programma un thread viene talvolta anche chiamato lightweight process Ogni thread possiede delle risorse private (e.g. stack e pc) ... ... tuttavia i thread di un programma condividono lo stesso spazio di indirizzamento Thread1 Thread2 Obj0B60 Obj0987 Obj01C3 Processo

52 Sincronizzazione Il multithreading non è utilizzabile in pratica senza la possibilità di sincronizzare i thread In Java ciascun oggetto può comportarsi come un monitor: un monitor è un insieme di procedure relative ad una singola entità (i.e. un oggetto Java); un monitor implementa il principio di mutua esclusione: solo un thread alla volta può eseguire una procedura. ContoCorrente preleva(y) deposita(x) coda di attesa T

53 Interfacce remote Il principio di base è quello di inviare messaggi a distanza Macchina Virtuale cliente ricevente.nomeMetodo(parametri) servente interfaccia (funzioni) Macchina Virtuale B Macchina Virtuale A proxy cliente ricevente.nomeMetodo(parametri) servente (rete) interfaccia (funzioni)

54 Proxy & Skeleton L’effetto viene ottenuto usando due componenti software (solitamente generate automaticamente): che simulano la presenza del servente in B e trasmettono le chiamate remote in A Macchina Virtuale B Macchina Virtuale A proxy stub skeleton cliente servizio interfaccia (funzioni) descrizione IDL

55 CORBA Common Object Request Broker Architecture
La comunicazione tra applicazioni non è diretta ma è mediata Sottorete A servente Sottorete B (iiop) ORB cliente stub skeleton

56 Naming Service Il Naming Service serve a pubblicare oggetti serventi a beneficio dei potenziali clienti gli oggetti servente vengono registrati in base ad un nome simbolico i clienti possono ‘agganciare’ i serventi usando questo nome il Naming Service è solitamente realizzato da un processo separato skeleton ORB servente nome

57 Modello industriale Java non nasce da un progetto accademico o non-profit I requisiti di progetto di Java sono quindi: tecnici; ingegneristici; di contesto (cioè di mercato). I requisiti tecnici sono evidenti nel progetto del modello astratto I requisiti ingegneristici sono evidenti nel modello implementativo e nell’idea di piattaforma (Per capire i requisiti di mercato, si pensi a chi comanda il gioco)

58 L’idea di piattaforma Uno dei grossi problemi della costruzione software dal punto di vista ingegneristico è la grande quantità di aspetti dipendenti da una piattaforma specifica (e.g. Windows NT, Linux) In questo senso, la storia dei linguaggi di programmazione registra numerosi insuccessi: il Pascal fu definito senza specificare le funzioni di I/O; il C (ed il C++) hanno un insieme di librerie standard limitato (e.g. non c’è grafica o networking); il modello astratto di Common Lisp e Prolog è poco adatto alla gestione grafica interattiva (e.g. multithreading).

59 Java come piattaforma Macchina virtuale Classe in bytecode java.util
java.io Classe in bytecode java.rmi Classe in bytecode java.lang Classe in bytecode java.math Classe in bytecode java.sql Classe in bytecode javax.servlet Macchina virtuale Classe in bytecode java.awt Classe in bytecode java.rmi Classe in bytecode javax.ejb Classe in bytecode java.beans Classe in bytecode ... Classe in bytecode java.security

60 Per Ulteriori Approfondimenti
Tutorial on-line Consigli: saltare (in prima lettura) la parte sulle applet seguire (come minimo): Learning the Java Language, Essential Java Classes, Collections. consigliati: Creating a GUI, Java Beans Libri Arnold, K., Gosling, J., The Java Programming Language - Second Edition, Addison-Wesley, 1998. Bishop, J., Java Gently - Second Edition, Addison-Wesley, 1998.


Scaricare ppt "Intelligenza Artificiale"

Presentazioni simili


Annunci Google