Intelligenza Artificiale
Breve introduzione a Java
(ed alla rappresentazione
ad oggetti)
Marco Piastra
Breve introduzione a Java - 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.
Marco Piastra
Breve introduzione a Java - 3
1
Modello astratto e modello
implementativo
nei linguaggi di programmazione
Marco Piastra
Breve introduzione a Java - 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.
Marco Piastra
Breve introduzione a Java - 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).
Marco Piastra
Breve introduzione a Java - 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.
Marco Piastra
Breve introduzione a Java - 7
Creare un programma in C
Codice sorgente
#include <stdio.h>
...
main(int argc, char **argv) {
...
initialize(argv[0]);
run(argv[1], argv[2]);
if (!errno)
printf(”Done.\n”);
else
exit(errno);
}
cc <opzioni> <nomi di file>
Compilatore
Binario
Binario
Programma
eseguibile
Linker
Librerie
Librerie
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.
Marco Piastra
Breve introduzione a Java - 8
Un interprete di programmi
Codice sorgente
;; File fattoriale.lisp
Interprete Common Lisp
Listener
(defun fattoriale (par)
(if (eq par 0)
;; then
(return 0)
;; else
(return
(* par
(fattoriale
(- par 1)))))
)
Lisp> (load “fattoriale.lisp”)
Done.
Lisp> (fattoriale 2)
2
Loader
Binario
Binario
Linker
Librerie
Librerie
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.
Marco Piastra
Breve introduzione a Java - 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.
Marco Piastra
Breve introduzione a Java - 10
2
Il modello astratto di Java:
rappresentazione ad oggetti
Marco Piastra
Breve introduzione a Java - 11
Un modello ad oggetti
• L’idea informale:
rappresentare le entità della programmazione
come aggregazioni di variabili e metodi
Esempio:
comportamento
struttura
variabili
ContoCorrente
saldoAttuale
deposita
codice
ritira
titolare
saldo
interesse
fido
modificaFido
modificaInteresse
metodi
• Agli inizi, qualcuno ha suggerito l’idea di
circuiti integrati software
Marco Piastra
Breve introduzione a Java - 12
Scambio di messaggi
• Il flusso dell’esecuzione viene visto come
un flusso di messaggi
Oggetto A
Ciclista
ricevente.nomeMetodo(parametri)
Oggetto B
Esempio:
bici.cambiaRapporto(2)
bici
Bicicletta
messaggio
• Componenti di un messaggio:
– un riferimento al ricevente;
– il nome del metodo;
– i parametri.
Marco Piastra
Breve introduzione a Java - 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.
comportamento
struttura
dichiarazione delle variabili
metodi effettivi
Marco Piastra
Breve introduzione a Java - 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;
}
ContoCorrente
ritira
codice
titolare
saldo
istanza di
deposita
N58AB
Gino
1.350
istanza di
}
c1.deposita(31)
istanza di
N58AB
Lino
2.500
AA54Z
Pino
7.823
c2.preleva(275)
c3.deposita(50)
Operatore
Marco Piastra
Breve introduzione a Java - 15
Ereditarietà
• L’idea di base è quella di classificare gli oggetti
mettendo a fattor comune le analogie
Animale
Vertebrato
Pesce
Invertebrato
Anfibio Rettile Uccello Mammifero
Carnivoro
Erbivoro
• Attenzione: la gerarchia dipende dallo scopo
Marco Piastra
Breve introduzione a Java - 16
Ereditarietà in Java
• Le sottoclassi ereditano la struttura (intesa come
schema) ed il comportamento dalle superclassi
Alfa
method1
class Alfa {
String var1;
}
void method1() {
...
}
var1
Beta
class Beta extends Alfa {
String var2;
}
void method2() {
...
}
method1
var1
var2
method2
class Gamma extends Beta {
String var3;
}
void method3() {
...
}
Gamma
method1
var1
var2
var3
method2
method3
Marco Piastra
Breve introduzione a Java - 17
Struttura di classi
• Un programma Java è rappresentato da una
gerarchia di classi
• La classe Object è la radice di tale gerarchia
class A1 {
...
}
Specializzazione
A1
A2
class A2 extends A1{
...
}
B1
B2
C1
B3
B4
B5
Marco Piastra
Generalità
Object
Breve introduzione a Java - 18
Uso di una struttura di classi
• Per classificare, ovvero strutturare le differenze
– nella pratica, si usa raramente
Bicicletta
Bicicletta Multirapporto
Bicicletta da Strada
Bicicletta Elettrica
Mountain Bike
• Per fattorizzare, ovvero per scrivere meno codice
ContoCorrente
ContoManager
ritira deposita
codice
titolare
saldo
calcolaInteresse
ContoIO
ContoFamiglia
Marco Piastra
Breve introduzione a Java - 19
Uso di una struttura di classi
• Per disaccoppiare aspetti diversi di uno stesso
programma
– e rendere lo stesso programma più facile da estendere
Un ipotetico sistema di trasmissione
usa solo questo livello
della gerarchia ...
Oggetto Trasmissibile
inserisci
contenuto
estrai
Testo
Immagine
Video
... mentre le specializzazioni ulteriori
sono pertinenti in altre parti del programma
– a questo scopo si usano spesso anche le interfacce
Marco Piastra
Breve introduzione a Java - 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)
Marco Piastra
Breve introduzione a Java - 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) {
}
void accarezza(Tigre t) {
}
Spiritoso
affettuosamente
amico.accarezza(animaleSconosciuto)
amico
Zoofilo
col pensiero
void accarezza(Object o) {
}
informati prima
}
• La selezione è automatica in base alla segnatura
Marco Piastra
Breve introduzione a Java - 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).
class Ciclista extends Persona {
valore
int mediaKmAlGiorno;
Bicicletta bici;
...
riferimento
void allenamento() {
int rapporto;
...
bici.cambiaRapporto(rapporto);
}
“Romano Prodi”
70
riferimento
Bicicletta
}
Marco Piastra
Breve introduzione a Java - 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;
Marco Piastra
Breve introduzione a Java - 24
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
Aritmetica.fattoriale(33)
class Aritmetica {
static float piGreco = 3.141592;
}
static long fattoriale(long arg) {
...
}
fattoriale
3.141592
• Alle classi si può fare riferimento per nome
Marco Piastra
Breve introduzione a Java - 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.
class Zoofilo extends Persona {
...
void accarezza(Object obj) {
if (obj instanceof Serpente) {
no grazie
}
else if (obj instanceof Pesciolino) {
volentieri, ma come?
}
}
...
ContoCorrente
obj.getClass()
codice
istanza di
N58AB
}
Marco Piastra
Breve introduzione a Java - 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
protected
package
private
accesso senza restrizioni
solo nello stesso package o nelle sottoclassi
solo nello stesso package
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() {...}
Marco Piastra
Breve introduzione a Java - 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;
}....
...
}
Marco Piastra
Breve introduzione a Java - 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
}
class ContoAziendale
extends ContoCorrente {
ContoAziendale() {
// Oscuramento
generico
}
ContoCorrente(Persona richiedente) {
intestato
}
}
ContoAziendale(Azienda richiedente) {
// Specializzazione
intestato
}
}
Marco Piastra
Breve introduzione a Java - 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à
class Ciclista extends Persona {
Bicicletta bici;
boolean dimmiSeTua(Bicicletta bici) {
return this.bici = bici;
}
}
• super fa riferimento all’istanza stessa come se
appartenesse alla superclasse
– si usa per evitare ambiguità e per specializzare metodi
class ContoCorrente {
float saldo;
class ContoAziendale {
RegistroCassa registro;
void deposita(float somma) {
saldo += somma;
}
void deposita(float somma) {
super.deposita(somma);
registro.annotaEntrata(somma);
}
}
}
Marco Piastra
Breve introduzione a Java - 30
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) {
...
}
}
Marco Piastra
Breve introduzione a Java - 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,
... {
...
}
Marco Piastra
Breve introduzione a Java - 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
Marco Piastra
Breve introduzione a Java - 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();
...
}
}
Marco Piastra
Breve introduzione a Java - 34
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) {
Exception
RuntimeException
}
}
MaTuSeiMattoException
throw new MaTuSeiMattoException();
...
}
Marco Piastra
Breve introduzione a Java - 35
3
Il modello implementativo di Java:
macchina virtuale
Marco Piastra
Breve introduzione a Java - 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
Marco Piastra
Breve introduzione a Java - 37
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
java
Macchina
virtuale
Macchina reale (e.g. PC Intel con Linux)
Marco Piastra
Breve introduzione a Java - 38
Bytecode (2)
metodo in Java
...
void spin() {
int i;
for (i = 0; i < 100; i++) {
// Loop body is empty
}
}
...
bytecode compilato
(in forma simbolica)
...
0
1
2
5
8
9
11
14
iconst_0
istore_1
goto 8
iinc 1 1
iload_1
bipush 100
if_icmplt 5
return
//
//
//
//
//
//
//
//
Push int constant 0
Store into local variable 1 (i=0)
First time through don't increment
Increment local variable 1 by 1 (i++)
Push local variable 1 (i)
Push int constant 100
Compare and loop if less than (i < 100)
Return void when done
...
Marco Piastra
Breve introduzione a Java - 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;
}
Compilatore
void method1() {
...
}
Classe in bytecode
File “Alfa.class”
Verifica
CLASSPATH
Classe in bytecode
Librerie
Librerie
Altre classi
compilate
Marco Piastra
Breve introduzione a Java - 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
java nomeClasse
CLASSPATH
Classe in bytecode
Classe in bytecode
Macchina
virtuale
ClassLoader
Classe in bytecode
CLASSPATH
Marco Piastra
Breve introduzione a Java - 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
CLASSPATH
Copia.class
Macchina
virtuale
Marco Piastra
Breve introduzione a Java - 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;
Persona
package it.ministeroDelleFinanze;
package it.unipv.admin;
Dipendente
Studente
Persona
Contribuente
Marco Piastra
Breve introduzione a Java - 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 {
...
}
Marco Piastra
Breve introduzione a Java - 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.
Marco Piastra
Breve introduzione a Java - 45
4
Altri aspetti particolari di Java:
garbage collection, multithreading,
programmazione distribuita
Marco Piastra
Breve introduzione a Java - 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)
Marco Piastra
Breve introduzione a Java - 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)
Marco Piastra
Breve introduzione a Java - 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
Sweep
Obj0B60
Obj0B60
Obj0B60
Obj0102
Obj0B60
Obj0102
Obj01F5
Obj0740
Obj0987
Obj01C3
Obj0E4F
Obj0987
Obj01C3
Marco Piastra
Breve introduzione a Java - 49
Mark and Sweep (2)
• Il principale punto di partenza per la fase di mark
è lo stack
Test04
Stack (stadio n)
class Test {
Test04.t(0)
null
Test03.t(1)
Test t
Test02.t(2)
Test t
Test01.t(3)
Test t
GCTest.main
Test t
Test03
Test02
Test01
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);
}
}
Test04
Test03
Test02
Stack (stadio n + 4)
GCTest.main
Test01
Test t
Marco Piastra
Breve introduzione a Java - 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)
Obj0102(1)
Obj0B60(1)
Obj01F5(1)
Obj0987(1)
Obj01C3(1)
Obj0740(1)
Obj0E4F(1)
Marco Piastra
Breve introduzione a Java - 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
Obj0987
Obj01C3
Obj0B60
Processo
Marco Piastra
Breve introduzione a Java - 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.
deposita(x)
T
ContoCorrente
T
T
coda di attesa
preleva(y)
Marco Piastra
Breve introduzione a Java - 53
Interfacce remote
• Il principio di base è quello di inviare messaggi a
distanza
Macchina Virtuale
ricevente.nomeMetodo(parametri)
cliente
servente
interfaccia
(funzioni)
Macchina Virtuale B
cliente
Macchina Virtuale A
proxy
ricevente.nomeMetodo(parametri)
servente
(rete)
interfaccia
(funzioni)
Marco Piastra
Breve introduzione a Java - 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
proxy
stub
cliente
Macchina Virtuale A
skeleton
servizio
descrizione IDL
interfaccia
(funzioni)
Marco Piastra
Breve introduzione a Java - 55
CORBA
• Common Object Request Broker Architecture
• La comunicazione tra applicazioni non è diretta
ma è mediata
Sottorete A
skeleton
Sottorete B
servente
ORB
(iiop)
ORB
cliente
stub
cliente
stub
Marco Piastra
Breve introduzione a Java - 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
Marco Piastra
Breve introduzione a Java - 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)
Marco Piastra
Breve introduzione a Java - 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).
Marco Piastra
Breve introduzione a Java - 59
Java come piattaforma
java.util
Classe in bytecode
java.io
Classe in bytecode
java.lang
Classe in bytecode
Macchina
virtuale
java.math
Classe in bytecode
java.awt
Classe in bytecode
java.beans
Classe in bytecode
java.rmi
Classe in bytecode
java.sql
Classe in bytecode
java.rmi
Classe in bytecode
javax.servlet
Classe in bytecode
javax.ejb
Classe in bytecode
...
Classe in bytecode
java.security
Classe in bytecode
Marco Piastra
Breve introduzione a Java - 60
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.
Marco Piastra
Scarica

formato powerpoint