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

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

description

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 - PowerPoint PPT Presentation

Transcript of Intelligenza Artificiale Breve introduzione a Java (ed alla rappresentazione ad oggetti)

Intelligenza Artificiale

Breve introduzione a Java(ed alla rappresentazione

ad oggetti)Marco Piastra

Breve introduzione a Java - 2

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.

Breve introduzione a Java - 3

Marco Piastra

1

Modello astratto e modello implementativo

nei linguaggi di programmazione

Breve introduzione a Java - 4

Marco Piastra

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.

Breve introduzione a Java - 5

Marco Piastra

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

Breve introduzione a Java - 6

Marco Piastra

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.

Breve introduzione a Java - 7

Marco Piastra

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.

Compilatore

Linker

#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

LibrerieLibrerieLibrerie

Programma

eseguibile

cc <opzioni> <nomi di file>

BinarioBinario

Breve introduzione a Java - 8

Marco Piastra

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.

;; File fattoriale.lisp

(defun fattoriale (par)

(if (eq par 0) ;; then (return 0) ;; else (return (* par (fattoriale (- par 1))))))

Codice sorgente

Loader

Linker LibrerieLibrerieLibrerie

BinarioBinario

Lisp> (load “fattoriale.lisp”)Done.Lisp> (fattoriale 2)2

Listener

Interprete Common Lisp

Breve introduzione a Java - 9

Marco Piastra

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.

Breve introduzione a Java - 10

Marco Piastra

2

Il modello astratto di Java:rappresentazione ad oggetti

Breve introduzione a Java - 11

Marco Piastra

Un modello ad oggetti• L’idea informale:

rappresentare le entità della programmazione come aggregazioni di variabili e metodi

struttura

comportamento

codicetitolaresaldo

interessefido

saldoAttuale

ContoCorrente

depositaritira

modificaFidomodificaInteresse

metodi

variabili

Esempio:

• Agli inizi, qualcuno ha suggerito l’idea dicircuiti integrati software

Breve introduzione a Java - 12

Marco Piastra

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

un flusso di messaggi

• Componenti di un messaggio:– un riferimento al ricevente;– il nome del metodo;– i parametri.

Oggetto A

Oggetto B

ricevente.nomeMetodo(parametri)

messaggio

Ciclista

Bicicletta

bici.cambiaRapporto(2)

Esempio:

bici

Breve introduzione a Java - 13

Marco Piastra

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

metodi effettivi

dichiarazione delle variabili

Breve introduzione a Java - 14

Marco Piastra

Classi e istanze: ContoCorrente

class ContoCorrente { String codice; String titolare; float saldo; ... void deposita(float somma) { saldo += somma; }

void preleva(float somma) { saldo -= somma; }}

codicetitolaresaldo

deposita

ContoCorrente

ritira

N58ABLino

2.500

AA54ZPino

7.823

N58ABGino1.350

istanza di

Operatorec3.deposita(50)

c2.preleva(275)

c1.deposita(31)

istanza di

istanza di

Breve introduzione a Java - 15

Marco Piastra

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

Breve introduzione a Java - 16

Marco Piastra

Ereditarietà in Java• Le sottoclassi ereditano la struttura (intesa come

schema) ed il comportamento dalle superclassi

class Alfa { String var1;

void method1() { ... }}

var1

Alfa

method1

class Beta extends Alfa { String var2;

void method2() { ... }}

var1var2

Beta

method1

method2

var1var2var3

Gamma

method1

method3method2

class Gamma extends Beta { String var3;

void method3() { ... }}

Breve introduzione a Java - 17

Marco Piastra

Struttura di classi• Un programma Java è rappresentato da

una gerarchia di classi• La classe Object è la radice di tale

gerarchiaObject

A1

A2

B1

B2 B3

B4 B5

C1

Gene

ralit

àSpecializzazione

class A2 extends A1{ ...}

class A1 { ...}

Breve introduzione a Java - 18

Marco Piastra

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

codicetitolaresaldo

deposita

ContoCorrente

ritira

calcolaInteresse ContoFamiglia

ContoIO

ContoManager

Breve introduzione a Java - 19

Marco Piastra

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

Testo VideoImmagine

... mentre le specializzazioni ulteriorisono pertinenti in altre parti del programma

Un ipotetico sistema di trasmissioneusa solo questo livello

della gerarchia ...

Breve introduzione a Java - 20

Marco Piastra

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

class MountainBike extends Bicicletta { ... void cambiaRapporto(int r) { ... }}

• La compatibilità con la segnatura definita nella superclasse viene preservata (polimorfismo)

Ciclista

Bicicletta

bici.cambiaRapporto(2)bici

Breve introduzione a Java - 21

Marco Piastra

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 }}

• La selezione è automatica in base alla segnatura

Spiritoso

Zoofilo

amico.accarezza(animaleSconosciuto)amico

Breve introduzione a Java - 22

Marco Piastra

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).class Ciclista extends Persona {

int mediaKmAlGiorno; Bicicletta bici; ... void allenamento() { int rapporto; ... bici.cambiaRapporto(rapporto); }}

valore

riferimento

“Romano Prodi”

70

Biciclettariferimento

Breve introduzione a Java - 23

Marco Piastra

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; } }}

Breve introduzione a Java - 24

Marco Piastra

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

class Aritmetica { static float piGreco = 3.141592;

static long fattoriale(long arg) { ... }}

• Alle classi si può fare riferimento per nome

Aritmetica

3.141592

fattoriale

Aritmetica.fattoriale(33)

Breve introduzione a Java - 25

Marco Piastra

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.

class Zoofilo extends Persona { ... void accarezza(Object obj) {

if (obj instanceof Serpente) {

no grazie } else if (obj instanceof Pesciolino) {

volentieri, ma come? } ... }}

codice

ContoCorrente

N58ABistanza di

obj.getClass()

Breve introduzione a Java - 26

Marco Piastra

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() {...}}

Breve introduzione a Java - 27

Marco Piastra

Protezioni: esempioclass 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; }.... ...}

Breve introduzione a Java - 28

Marco Piastra

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 oscuramentoclass ContoCorrente {

ContoCorrente() { generico }

ContoCorrente(Persona richiedente) { intestato }}

class ContoAziendale extends ContoCorrente {

ContoAziendale() { // Oscuramento generico }

ContoAziendale(Azienda richiedente) { // Specializzazione intestato }}

Breve introduzione a Java - 29

Marco Piastra

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); }}

Breve introduzione a Java - 30

Marco Piastra

Interfacce• L’idea di base è quella di un contratto tra

oggetti, una sorta di visibilità limitata Fisco

Persona

contribuente.dichiaraImponibile(1998)

interfaccia Contribuente

interface Contribuente { float dichiaraImponibile(int anno);}

class Ingegnere extends Persona implements Contribuente { ... float dichiaraImponibile(int anno) { ... }}

Breve introduzione a Java - 31

Marco Piastra

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, ... { ...}

Breve introduzione a Java - 32

Marco Piastra

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

Breve introduzione a Java - 33

Marco Piastra

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(); }

... }}

Breve introduzione a Java - 34

Marco Piastra

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.

class Zoofilo extends Persona { ... void accarezza(Object obj) throws MaTuSeiMattoException {

if (obj instanceof ScorpioneVelenoso) {

throw new MaTuSeiMattoException(); }

... }}

Throwable

Exception RuntimeException

MaTuSeiMattoException

Breve introduzione a Java - 35

Marco Piastra

3

Il modello implementativo di Java:

macchina virtuale

Breve introduzione a Java - 36

Marco Piastra

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

Breve introduzione a Java - 37

Marco Piastra

Bytecode• non è un codice direttamente eseguibile• ma è un codice (binario) per una macchina

virtuale (cioè un interprete) che si incarica dellaesecuzione effettiva

Macchina reale (e.g. PC Intel con Linux)

Macchinavirtualejava

Classe in bytecode

Breve introduzione a Java - 38

Marco Piastra

... void spin() { int i; for (i = 0; i < 100; i++) { // Loop body is empty } } ...

...

0 iconst_0 // Push int constant 0 1 istore_1 // Store into local variable 1 (i=0) 2 goto 8 // First time through don't increment 5 iinc 1 1 // Increment local variable 1 by 1 (i++) 8 iload_1 // Push local variable 1 (i) 9 bipush 100 // Push int constant 100 11 if_icmplt 5 // Compare and loop if less than (i < 100) 14 return // Return void when done

...

Bytecode (2)

metodo in Java

bytecode compilato(in forma simbolica)

Breve introduzione a Java - 39

Marco Piastra

Compilazione• In Java la compilazione è:

– parziale (ciascuna classe viene compilata separatamente)

– con verifica (di correttezza sintattica e di tipo)

Compilatore

File “Alfa.java” javac <opzioni> Alfa.java

Classe in bytecode

class Alfa { String var1;

void method1() { ... }}

File “Alfa.class”

LibrerieLibrerieClasse in bytecode

Verifica

CLASSPATH Altre classicompilate

Breve introduzione a Java - 40

Marco Piastra

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

Macchinavirtuale

java nomeClasse Classe in bytecode

Classe in bytecode CLASSPATH

ClassLoader

Classe in bytecode

CLASSPATH

Breve introduzione a Java - 41

Marco Piastra

Bootstrap dell’esecuzione• La macchina virtuale Java esegue come

prima cosa il metodo main della classe di bootstrap

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]); }

...}

Macchinavirtuale

java Copia DaUnFile.txt AUnAltroFile.txt

Copia.class

Copia.classCLASSPATH

Breve introduzione a Java - 42

Marco Piastra

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;

Persona

Studente

package it.unipv.admin;

Dipendente

package it.ministeroDelleFinanze;

Persona

Contribuente

Breve introduzione a Java - 43

Marco Piastra

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

}

Breve introduzione a Java - 44

Marco Piastra

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

Breve introduzione a Java - 45

Marco Piastra

4

Altri aspetti particolari di Java:garbage collection,

multithreading,programmazione distribuita

Breve introduzione a Java - 46

Marco Piastra

Allocazione dinamicadella 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)

Breve introduzione a Java - 47

Marco Piastra

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)

Breve introduzione a Java - 48

Marco Piastra

Mark and Sweep• Un algoritmo di garbage collection che

prevede l’interruzione dell’esecuzione• Si usa quando gli oggetti sono molti e

globalmente accessibili

Obj01F5

Obj0F32

Obj054A

Obj0102

Obj0987

Obj0B60

Obj0B60

Obj0E4F

Obj0740Obj01C3

Mark

Obj0102

Obj0987

Obj0B60

Obj0B60

Obj01C3

Sweep

Breve introduzione a Java - 49

Marco Piastra

Mark and Sweep (2)• Il principale punto di partenza per la fase di

mark è lo stack

Stack (stadio n)

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); }}

Test01.t(3) Test t

Test02.t(2) Test t

Test03.t(1) Test t

Test04.t(0)

Test04

Test03

Test02

Test01GCTest.main Test t

Stack (stadio n + 4)

Test04

Test03

Test02

Test01GCTest.main Test t

null

Breve introduzione a Java - 50

Marco Piastra

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)

Obj01F5(1)

Obj0F32(0)

Obj054A(1)

Obj0102(1)

Obj0987(1)

Obj0B60(2)

Obj0B60(1)

Obj0E4F(1)

Obj0740(1)Obj01C3(1)

Reference Counting

Breve introduzione a Java - 51

Marco Piastra

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 indirizzamentoThread1 Thread2

Obj0B60

Obj0987 Obj01C3

Processo

Breve introduzione a Java - 52

Marco Piastra

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 T T

Breve introduzione a Java - 53

Marco Piastra

Interfacce remote• Il principio di base è quello di inviare

messaggi a distanza

Macchina Virtuale A

servente

interfaccia(funzioni)

Macchina Virtuale B

cliente(rete)

proxyricevente.nomeMetodo(parametri)

Macchina Virtuale

clientericevente.nomeMetodo(parametri)

servente

interfaccia(funzioni)

Breve introduzione a Java - 54

Marco Piastra

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

servizio

interfaccia(funzioni)

cliente

proxystub skeleton

descrizione IDL

Macchina Virtuale B Macchina Virtuale A

Breve introduzione a Java - 55

Marco Piastra

Sottorete A

serventeSottorete B

(iiop)ORB ORB cliente

cliente

stub

stub

skeleton

CORBA• Common Object Request Broker

Architecture• La comunicazione tra applicazioni non è

diretta ma è mediata

Breve introduzione a Java - 56

Marco Piastra

skeleton

ORB servente

nome

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

Breve introduzione a Java - 57

Marco Piastra

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)

Breve introduzione a Java - 58

Marco Piastra

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

Breve introduzione a Java - 59

Marco Piastra

Java come piattaforma

Macchinavirtuale

Classe in bytecode

java.lang

Classe in bytecode

java.math

Classe in bytecode

java.io

Classe in bytecode

java.util

Classe in bytecode

java.awt

Classe in bytecode

java.rmi

Classe in bytecode

java.security

Classe in bytecode

java.sql

Classe in bytecode

javax.servlet

Classe in bytecode

javax.ejb

Classe in bytecode

java.rmi

Classe in bytecode

java.beans

Classe in bytecode

...

Breve introduzione a Java - 60

Marco Piastra

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.