Intelligenza Artificiale Breve introduzione a Java



Scaricare 445 b.
28.11.2017
Dimensione del file445 b.


  • Intelligenza Artificiale

  • Breve introduzione a Java (ed alla rappresentazione ad oggetti)

  • Marco Piastra


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.




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.



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).


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.


Creare un programma in C

  • 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.


Un interprete di programmi

  • 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.


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.




Un modello ad oggetti

  • L’idea informale: rappresentare le entità della programmazione come aggregazioni di variabili e metodi



Scambio di messaggi

  • Il flusso dell’esecuzione viene visto come un flusso di messaggi



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.


Classi e istanze: ContoCorrente



Ereditarietà

  • L’idea di base è quella di classificare gli oggetti mettendo a fattor comune le analogie



Ereditarietà in Java

  • Le sottoclassi ereditano la struttura (intesa come schema) ed il comportamento dalle superclassi



Struttura di classi

  • Un programma Java è rappresentato da una gerarchia di classi

  • La classe Object è la radice di tale gerarchia







Oscuramento dei metodi

  • (Detto anche overriding)

  • In una sottoclasse si può oscurare un metodo definito in una superclasse con una nuova definizione.



Specializzazione dei metodi

  • (Detta anche overloading)

  • La ‘risposta’ di un oggetto ad un messaggio può dipendere dal tipo dei parametri



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).


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.


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



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.



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


Protezioni: esempio



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



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


Interfacce

  • L’idea di base è quella di un contratto tra oggetti, una sorta di visibilità limitata



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













Bytecode

  • non è un codice direttamente eseguibile

  • ma è un codice (binario) per una macchina virtuale (cioè un interprete) che si incarica della esecuzione effettiva





Compilazione

  • In Java la compilazione è:

    • parziale (ciascuna classe viene compilata separatamente)
    • con verifica (di correttezza sintattica e di tipo)


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



Bootstrap dell’esecuzione

  • La macchina virtuale Java esegue come prima cosa il metodo main della classe di bootstrap



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





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.








Mark and Sweep

  • Un algoritmo di garbage collection che prevede l’interruzione dell’esecuzione

  • Si usa quando gli oggetti sono molti e globalmente accessibili



Mark and Sweep (2)

  • Il principale punto di partenza per la fase di mark è lo stack



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)



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



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.














Java come piattaforma



Per Ulteriori Approfondimenti

  • Tutorial on-line

    • http://www.javasoft.com/docs/books/tutorial
    • 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.


: people -> broggi
broggi -> Gli alberi E' un tipo di dato astratto che rappresenta relazioni gerarchiche tra oggetti
people -> I colori nella storia dell’Uomo L’età contemporanea
people -> Manoscritti illuminati I manoscritti illuminati
people -> Anno 2003 Commenti alla decisione di
people -> Diritto delle pari opportunità e non discriminazione sa – a a. 2012-2013 – Prof ssa S. Niccolai – materiali 3
people -> Basi di Dati Spaziali Daniela Poggioli
people -> Questo glossarietto è tratto dal volume collettivo Insegnare IL
people -> La prelazione artistica sui beni culturali di proprietà privata di Armando Calogero
people -> Definisce tipi attraverso IL costruttore relazione, che organizza I dati secondo record a struttura fissa, rappresentabili attraverso tabelle
broggi -> Realizzazione software Due fasi




©astratto.info 2017
invia messaggio

    Pagina principale