JAVA
Linguaggio e Piattaforma
Romina Eramo
[email protected]
http://www.di.univaq.it/romina.eramo/tlp
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Roadmap
• Tecnologia Java: Linguaggio e Piattaforma
• Java Virtual Machine
• Storia
• Struttura di un programma Java
• First Cup of Java
• Commenti e Spazi Bianchi
• JavaDoc
• Coding convention
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Tecnologia Java – Linguaggio
• Sun Microsystems definisce Java come
<<un linguaggio semplice e familiare, orientato agli oggetti, robusto,
sicuro, architettura neutrale, portabile, ad alte prestazioni,
interpretato, multithreaded e dinamico>>
[J. Gosling e H. McGilton, “The Java Language Environment. A White Paper.” Ottobre 1995]
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Tecnologia Java – Linguaggio
• Sun Microsystems definisce Java come
<<un linguaggio semplice e familiare,
familiare orientato agli oggetti, robusto,
sicuro, architettura neutrale, portabile, ad alte prestazioni,
interpretato, multithreaded e dinamico>>
[J. Gosling e H. McGilton, “The Java Language Environment. A White Paper.” Ottobre 1995]
La rimozione di molte caratteristiche di dubbia utilità dai suoi “progenitori” C e
C++, mantiene Java relativamente piccolo e permette ai programmatori la
produzione di applicazioni più affidabili
I programmatori che utilizzano il C, Objective C, C++, Eiffel, Ada e linguaggi affini
acquisteranno familiarità con Java in breve tempo, dell’ordine di qualche
settimana
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Tecnologia Java – Linguaggio
• Sun Microsystems definisce Java come
<<un linguaggio semplice e familiare, orientato agli oggetti,
oggetti robusto,
sicuro, architettura neutrale, portabile, ad alte prestazioni,
interpretato, multithreaded e dinamico>>
[J. Gosling e H. McGilton, “The Java Language Environment. A White Paper.” Ottobre 1995]
Java estrae i migliori concetti e caratteristiche dai precedenti linguaggi
orientati agli oggetti, come Eiffel, SmallTalk, Objective C e C++
Con l’eccezione dei suoi tipi di dato primitivi, ogni cosa in Java è un oggetto ed
anche i tipi di dato primitivi possono essere incapsulati all’interno di oggetti se
necessario
Java supporta le quattro caratteristiche chiave di un linguaggio orientato agli
oggetti incapsulamento, polimorfismo, ereditarietà e binding dinamico
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Tecnologia Java – Linguaggio
• Sun Microsystems definisce Java come
<<un linguaggio semplice e familiare, orientato agli oggetti, robusto,
sicuro, architettura neutrale, portabile, ad alte prestazioni,
interpretato, multithreaded e dinamico>>
[J. Gosling e H. McGilton, “The Java Language Environment. A White Paper.” Ottobre 1995]
Un software si definisce robusto se si comporta “bene” in condizioni di lavoro non
previste dallo sviluppatore
- per bene si intende non va in crash, non sbaglia calcoli, etc.
- per condizioni non previste si intende carico di lavoro eccessivamente
elevato, input non conforme allo standard, etc.
Java incoraggia la costruzione di un software robusto ponendo delle restrizioni
riguardanti i tipi di dato e l’uso dei puntatori (es. non è possibile convertire
arbitrariamente un intero in un puntatore mediante l’operatore cast)
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Tecnologia Java – Linguaggio
• Sun Microsystems definisce Java come
<<un linguaggio semplice e familiare, orientato agli oggetti, robusto,
sicuro, architettura neutrale, portabile, ad alte prestazioni,
sicuro
interpretato, multithreaded e dinamico>>
[J. Gosling e H. McGilton, “The Java Language Environment. A White Paper.” Ottobre 1995]
Il compilatore e il sistema di runtime implementano molti strati di difesa contro del codice
potenzialmente non corretto:
-
la gestione della memoria non è delegata al compilatore (come in C o C++), ma rinviata al run-time;
i puntatori non esistono (accesso diretto impossibile);
tutto deve essere esplicito (ad esempio il casting), niente avviene “nell’ombra”;
tutte le classi locali sono poste in un name space distinto da quello per le classi scaricate dalla rete;
le classi importate non possono “spiare” quelle locali;
Java non si fida del codice proveniente dalla rete, per il quale viene eseguito la bytecode verification
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Tecnologia Java – Linguaggio
• Sun Microsystems definisce Java come
<<un linguaggio semplice e familiare, orientato agli oggetti, robusto,
sicuro, architettura neutrale,
neutrale portabile, ad alte prestazioni,
interpretato, multithreaded e dinamico>>
[J. Gosling e H. McGilton, “The Java Language Environment. A White Paper.” Ottobre 1995]
Le applicazioni devono potere essere eseguite ovunque sulla rete senza conoscere a
priori la piattaforma hardware o software
Java adotta un codice binario indipendente dalla piattaforma hardware e dal
sistema operativo. Il compilatore Java non genera codice macchina ma bytecode: un
codice ad alto livello, indipendente dalla macchina per un computer astratto che
viene implementato dall’interprete Java
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Tecnologia Java – Linguaggio
• Sun Microsystems definisce Java come
<<un linguaggio semplice e familiare, orientato agli oggetti, robusto,
sicuro, architettura neutrale, portabile,
portabile ad alte prestazioni,
interpretato, multithreaded e dinamico>>
[J. Gosling e H. McGilton, “The Java Language Environment. A White Paper.” Ottobre 1995]
Un aspetto relativo alla portabilità è come l’hardware interpreta le operazioni
aritmetiche (es. in C e C++, il codice sorgente può produrre risultati differenti a
seconda della piattaforma hardware a causa di come vengono implementate le
operazioni aritmetiche)
In Java questo è stato semplificato e si hanno sempre gli stessi risultati
indipendentemente dalle piattaforme hardware
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Tecnologia Java – Linguaggio
• Sun Microsystems definisce Java come
<<un linguaggio semplice e familiare, orientato agli oggetti, robusto,
sicuro, architettura neutrale, portabile, ad alte prestazioni,
prestazioni
interpretato, multithreaded e dinamico>>
[J. Gosling e H. McGilton, “The Java Language Environment. A White Paper.” Ottobre 1995]
Per applicazioni che richiedono elaborazioni pesanti e quindi prestazioni maggiori il
formato bytecode può essere tradotto durante la fase di runtime nel linguaggio
macchina del processore che viene utilizzato
Il processo di generazione del linguaggio macchina è generalmente semplice e
produce un codice con un buon livello di ottimizzazione, con l’allocazione
automatica dei registri e un livello di prestazioni quasi uguale a quello ottenuto
con linguaggi C o C++ nativi
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Tecnologia Java – Linguaggio
• Sun Microsystems definisce Java come
<<un linguaggio semplice e familiare, orientato agli oggetti, robusto,
sicuro, architettura neutrale, portabile, ad alte prestazioni,
interpretato, multithreaded e dinamico>>
interpretato
[J. Gosling e H. McGilton, “The Java Language Environment. A White Paper.” Ottobre 1995]
Il bytecode prodotto dal compilatore Java questo può essere eseguito su
qualsiasi macchina che ha un interprete Java o un browser Java-enabled.
Questo permette al codice Java di essere scritto indipendentemente dalla
piattaforma dell’utente
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Tecnologia Java – Linguaggio
• Sun Microsystems definisce Java come
<<un linguaggio semplice e familiare, orientato agli oggetti, robusto,
sicuro, architettura neutrale, portabile, ad alte prestazioni,
interpretato, multithreaded e dinamico>>
[J. Gosling e H. McGilton, “The Java Language Environment. A White Paper.” Ottobre 1995]
Scrivere in C o C++ applicazioni che eseguono più processi simultaneamente è molto
difficile: non si è mai totalmente sicuri di aver impostato oppoerunamente i
blocchi necessari o di averli liberati
La classe Thread di Java supporta una serie completa di metodi per avviare,
eseguire, interrompere e analizzare i processi
Il supporto dei processi integrato nel linguaggio lo rende più semplice e affidabile
da utilizzare
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Tecnologia Java – Linguaggio
• Sun Microsystems definisce Java come
<<un linguaggio semplice e familiare, orientato agli oggetti, robusto,
sicuro, architettura neutrale, portabile, ad alte prestazioni,
interpretato, multithreaded e dinamico>>
[J. Gosling e H. McGilton, “The Java Language Environment. A White Paper.” Ottobre 1995]
Il C++ soffre del fragile superclass problem, dovuto alla mancanza di uno standard
riguardo al layout degli oggetti, al passaggio dei parametri e così via. Ogni volta che si
aggiunge un metodo o una variabile d’istanza ad una classe, qualsiasi classe che si
riferisce a quella modificata dovrà essere ricompilata (constant recompilation
problem)
Il compilatore Java non trasforma i riferimenti in valori numerici, ma li converte in
riferimenti simbolici. L’interprete Java esegue la risoluzione finale dei nomi quando le
classi sono linkate
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Tecnologia Java – Linguaggio (2)
• Il compilatore prende in input il codice sorgente “.java” e lo
traduce in un linguaggio intermedio indipendente dalla piattaforma
(bytecode )
– il bytecode non può essere compreso direttamente dal computer
• L’ interprete traduce il bytecode in istruzioni macchina del
computer
• Il bytecode prodotta dal compilatore java è memorizzato in un file
di classe ". class”
class”
.java
.class
compiler
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
interpreter
my program
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Tecnologia Java – Linguaggio (2)
• Bytecode:
Bytecode: istruzioni macchina per la Java Virtual
Java Program
Machine (JVM)
1 class HelloWorldApp{
2
public static void main (String[] args){
3
System.out.println(“Hello World!”);
4
}
5 }
HelloWorldApp.java
Compiler
“Write once Run anywhere”
Java può essere sviluppato su
qualsiasi dispositivo, compilato
in un bytecode standard ed
eseguito su qualsiasi dispositivo
dotato di una JVM
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
JVM
JVM
JVM
JVM
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Tecnologia Java - Piattaforma
• Una piattaforma è un ambiente hardware o software
all’interno del quale vengono eseguiti i programmi
– molte popolari piattaforme (Microsoft Windows, Linux, Solaris OS,
Mac OS, ...) sono descritte come una combinazione di sistema operativo
e hardware sottostante
• La piattaforma Java differisce dalle altre essendo
una piattaforma solo software che viene eseguita su
altre piattaforme hardware
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Tecnologia Java - Piattaforma
• La piattaforma Java è composta da due componenti:
– Java Virtual Machine (JVM)
– Java Application Programming Interface (Java API)
• Collezione di componenti software
pronti per essere utilizzati concepiti
per diversi scopi
• E’ raggruppata in librerie di classi ed
interfacce; tali librerie sono
normalmente chiamate packages
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
MyProgram.java
API
Java Virtual Machine
Java
platform
Hardware-based Platform
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Tecnologia Java - Piattaforma
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Tecnologia Java - Piattaforma
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Storia
• Nascita ’91 Patrick Naughton e James Gosling progettarono linguaggio
per dispositivi consumer (switchbox per televisione via cavo)
– Green Project, sviluppato presso Sun Microsystems
– Linguaggio Oak
• JVM da idea di Niklaus Wirth
• Basato su C++
• ’92 progetto Green rilasciò prodotto “*7”
– Non riscosse successo
• ’94 progetto First Person (i.e. Green) chiuse i battenti
• Metà ’94 Gosling&C. si resero conto che con l’avvento del web dovevano
realizzare un browser portabile e sicuro (HotJava con applet)
• 23 maggio 1995 SUNWorld ’95 presentarono la nuova tecnologia
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Storia
• Nel 1996 SUN rilasciò la prima versione di Java 1.0.2
• Dopo poco 1.1 che introduceva notevoli migliorie
• Nel 1998 alla conferenza JavaOne rilasciarono
versione 1.2 ovvero Java 2 Standard Edition
Software Development Kit Version 1.2
• …
• 1.3
• 1.4
• JavaOne 2004 presentata 1.5 ovvero Java 5.0
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Storia
• Nel 2006 Sun Microsystems ha rilasciato la sua implementazione del
compilatore Java e della JVM sotto licenza GPL.
GPL L'ambiente Java libero si
chiama IcedTea
• Nel 2007 Sun ha pubblicato anche le librerie sotto licenza GPL, rendendo
Java un linguaggio di programmazione la cui implementazione di
riferimento è libera
• Nel 2010 Oracle Corporation acquisisce Sun Microsystems per 7,4
miliardi di dollari
• Il linguaggio è definito da un documento chiamato The Java Language
Specification (JLS). Da 1996 il linguaggio ha subito numerose modifiche
e integrazioni, aggiunte di volta in volta nelle edizioni successive. Ad oggi,
la versione più recente delle specifiche è la Java SE 7 Edition (quarta).
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Evoluzione del linguaggio
Versione
Nuove funzionalità
Numero classi e
interfacce
1.0
Linguaggio di partenza
211
1.1
Classi interne
477
1.2
Nessuna
1524
1.3
Nessuna
1840
1.4
Asserzioni
2723
5.0
Classi generiche, “for each”, vararg, autoboxing,
metadati, enumerazioni, importazione statica
3270
6.0
Aggiunte librerie Web services
≈7000
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Cos’è la JVM ?
• La maggiore peculiarità di Java è la portabilità
– stesso comportamento in modo indipendente dalla piattaforma in cui
il programma viene eseguito
– lo slogan della Sun: “Write once Run everywhere”
everywhere” (“Scrivi una volta
Esegui dappertutto”) riassume ciò che ha contribuito alla fortuna
della tecnologia Java
• Nella realtà il concetto di portabilità assoluta
rimane difficile realizzazione
– per programmi complessi è quasi sempre necessario effettuare degli
“aggiustamenti” ad hoc sui vari sistemi operativi
• Java Virtual Machine (JVM)
(JVM)
– è il componente responsabile dell’indipendenza dall’hardware e dal
sistema operativo
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Cos’è la JVM ? (2)
“La Java Virtual Machine è una macchina immaginaria (astratta)
la cui implementazione può essere effettuata attraverso
l’utilizzo di un software di emulazione che venga eseguito su una
macchina reale. I programmi che una JVM sono in grado di
eseguire devono essere scritti in appositi file con estensione
.class, ognuno dei quali deve contenere al suo interno il codice
per, al massimo, una classe pubblica.”
[The Java™ Virtual Machine Specification]
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Cos’è la JVM ? (3)
• Cammino codice/esecuzione tipico di molti
linguaggi di programmazione:
1. scrittura codice sorgente nella sintassi del
linguaggio
2. compilazione in linguaggio macchina dipendente
da so/hw
3. un linker crea collegamenti con librerie esterne
richiamate dal sorgente e genera un file
eseguibile (es, in Win un .exe)
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Cos’è la JVM ? (4)
• Implementazioni correnti della VM della SUN
(facenti parti del JAVA SDK e JAVA Runtime
Environment) emulano la VM su Win32, Solaris,
Linux e Mac OS
• Esistono altre implementazioni della VM come
ad esempio IBM, BEA Rockit, ….
• Può essere implementata direttamente su HW
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Cos’è la JVM ? (5)
• La JVM è una sorta di processore in grado di interpretare
il bytecode
– codice macchina (contenuto all’interno dei file .class) che
rappresenta il prodotto della compilazione di un file sorgente
scritto in linguaggio Java
javac nomeapplicazione.java
java nomeapplicazione
/*per genere bytecode da un sorgente*/
/*per eseguire un’applicazione*/
• Ogni applicazione Java in esecuzione da vita ad una nuova
istanza di JVM che:
– interpreta il contenuto di un bytecode ed esegue l’applicazione
– viene dismessa al termine dell’esecuzione
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Cos’è la JVM ? (5)
• La JVM rappresenta una sorta di macchina immaginaria istallata
all’interno di una macchina reale
• Un programma Java è reso “portabile” su una particolare
piattaforma installando una JVM e delegando ad essa il compito
di interpretare il bytecode in modo opportuno ed efficace per
l’hardware in uso
Macchina reale
(Intel, Motorola, Alpha, etc.)
JVM
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Come è strutturata la JVM ?
Architettura della JVM:
Garbage
Collector
Class Loader
Area dati
Istruzioni per
i bytecode
Registri
Execution
Engine
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
Stack
Native method
interface
Heap
Area
memorizzione
metodi
Librerie Native
del Sistema
Operativo
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Come è strutturata la JVM ?
Class Loader
Garbage Collector
Area dati
Istruzioni per i
bytecode
Registri
Execution Engine
Stack
Heap
Native method
interface
Area memorizzione
metodi
Librerie Native
del Sistema
Operativo
• Un programma Java è organizzato in più classi, ognuna delle quali è
responsabile di un particolare compito all’interno dell’applicazione e
viene memorizzata in un file .class
• Il Class Loader è il componente che si occupa del caricamento in
memoria delle classi
– i file .class non vengono caricati in memoria tutti in una volta alla partenza
dell’applicazione, ma su richiesta ogni volta che sia necessario utilizzare una
specifica classe
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Come è strutturata la JVM ?
Class Loader
Garbage Collector
Area dati
Istruzioni per i
bytecode
Registri
Execution Engine
Stack
Heap
Native method
interface
Area memorizzione
metodi
Librerie Native
del Sistema
Operativo
• L’area dati della JVM può essere suddivisa in:
– un insieme di istruzioni per i bytecode
– un gruppo di registri
– uno stack
– un’area di heap su cui agisce la routine di garbage collection
– un’area per la memorizzazione dei metodi
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Come è strutturata la JVM ?
Class Loader
Garbage Collector
Area dati
Istruzioni per i
bytecode
Registri
Execution Engine
Stack
Heap
Native method
interface
Area memorizzione
metodi
Librerie Native
del Sistema
Operativo
• Istruzioni per i bytecode
– un’istruzione tradotta in bytecode è formata da un opcode di un byte,
il quale ha il compito di identificare l’istruzione in questione
• Registri
– i registri hanno la funzione di memorizzare lo stato della macchina e
contenere l’indirizzo del successivo bytecode da eseguire.
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Come è strutturata la JVM ?
Class Loader
Garbage Collector
Area dati
Istruzioni per i
bytecode
Registri
Execution Engine
Stack
Heap
Native method
interface
Area memorizzione
metodi
Librerie Native
del Sistema
Operativo
• Stack
– ogni componente dello stack (frame) contiene lo stato di una singola chiamata ad un
metodo. Lo stack è in grado di effettuare solo due operazioni : push di un frame o pop di
un frame
• Heap
– quando un’applicazione crea un’istanza di una classe (un oggetto), questa viene allocata
nella parte di memoria denominata heap
• Area dei metodi
– Contiene i bytecode che estiscono limplementazione di tutti i metodi
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Come è strutturata la JVM ?
Class Loader
Garbage Collector
Area dati
Istruzioni per i
bytecode
Registri
Execution Engine
Stack
Heap
Native method
interface
Area memorizzione
metodi
Librerie Native
del Sistema
Operativo
• Execution Engine
– è rappresentato da un insieme di istruzioni che consentono l’esecuzione di una
determinata operazione su una certa piattaforma
• Garbage collector
– modalità automatica di gestione della memoria:
• ripristina memoria allocata da oggetti non più referenziati dall’applicazione in esecuzione
• riduce la frammentazione dell’heap spostando gli oggetti e allocandoli in maniera contigua
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Come è strutturata la JVM ?
Class Loader
Garbage Collector
Area dati
Istruzioni per i
bytecode
Registri
Execution Engine
Stack
Heap
Native method
interface
Area memorizzione
metodi
Librerie Native
del Sistema
Operativo
• Execution Engine
– è rappresentato da un insieme di istruzioni che consentono l’esecuzione di una
determinata operazione su una certa piattaforma
• Garbage collector
– modalità automatica di gestione della memoria:
• ripristina memoria allocata da oggetti non più referenziati dall’applicazione in esecuzione
• riduce la frammentazione dell’heap spostando gli oggetti e allocandoli in maniera contigua
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Come è strutturata la JVM ?
• In Java ogni cosa è un oggetto
– la creazione di tali oggetti viene effettuata dal programmatore
utilizzando la parola chiave new
Object obj = new Object();
• Tale dichiarazione crea sull’heap un‘aria di memoria adibita per
la variabile obj
• A differenza di altri linguaggi (C++) la deallocazione viene fatta
automaticamente tramite il Garbage Collector
– Thread a bassa priorità che ha il compito di eliminare gli oggetti
che non hanno più alcun riferimento
– Ha un impatto notevole sulle performance dell’applicazione
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Java Hot Spot VM
• Java Hot Spot(TM) è la JVM che usa una serie di nuove
tecniche e tecnologie di compilazione a partire dalla
fine degli anni novanta
• Hot Spot viene adottata dalla Sun con lo scopo di
ottimizzare la compilazione JIT (Just In Time)
– basata su tecniche di compilazione del bytecode “on the
fly”
• Hot Spot ha un livello di “intelligenza” adattativa,
– il comportamento del compilatore cambia in base alla
storia e all’evoluzione del programma in corso
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Java Hot Spot VM (2)
• Questi accorgimenti permettono di avere delle
applicazioni Java decisamente più veloci e
leggere
• Tuttavia, Java resta un linguaggio meno
efficiente dei linguaggi compilati (C++)
– ha degli strati di astrazione in più
– implementa una serie di automatismi
• per esempio, il garbage collector
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Client vs Server
Compilazione
• Due profili di esecuzione
– implementazioni concrete delle
attività di compilazione ed
esecuzione del programma
• Il compilatore client è ottimale
per applicazioni che hanno bisogno
di rapidità di esecuizione
– adatto per applicazioni interattive
(come GUIs), applet e desktop
application
• Il compilatore server è ottimale
per applicazioni in cui il
rendimento globale è più
importante
.java
Esecuzione
Class Loader
Hello.java
Bytecode
Verifier
javac
.class
Client
Compiler
Server
Compiler
Hello.class
VM
- Runtime
- GC
- Interpreter
- ...
– adatto alle applicazioni lato server
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
First Cup of Java (1)
• Scaricare il Java SE JDK (7u17)
– http://www.oracle.com/technetwork/java/javase/downloads/index.html
• Creare un file sorgente contenente l’applicazione che stampa
“Hello World”
• Compilare il file per generare l’eseguibile (bytecode)
• Eseguire il bytecode con l’interprete java
• Opzionale ☺
– Scaricare la documentazione (API & Tutorial)
• http://www.oracle.com/technetwork/java/javase/documentation/index.html
– Scaricare un IDE (Eclipse, NetBeans, IDEA, …)
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
First Cup of Java (2)
• Ogni programma Java e composto da una o più
classi
• Una classe contiene uno o più metodi
• Un metodo contiene le istruzioni
• Punto di partenza di un’applicazione Java classe
contenente un metodo main
– Sintassi
public static void main(String[] args) {
}
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
First Cup of Java (3)
Commento
/**
* The HelloWorldApp class implements an
application * that displays "Hello World!" to the
standard
* output.
*/
Classe
Main
public class HelloWorldApp {
public static void main(String[] args) {
// Display "Hello World!“
System.out.println("Hello World!");
}
}
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
First Cup of Java (4)
/**
* The HelloWorldApp class implements an application
* that displays "Hello World!" to the standard
* output.
Non chiamate di funzioni con parametri che
rappresentano i dati su cui operare ma “componenti” su cui
*/
vengono invocate operazioni a essi pertinenti
public class HelloWorldApp {
public static void main(String[] args) {
// Display "Hello World!“
System.out.println("Hello World!");
}
Notazione puntata
}
Il messaggio println(“Hello World!”) è inviato all’oggetto
out che è un membro (statico) della classe predefinita
System
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Struttura di una classe (1)
<modificatore> class <nome della classe>
[extends Tipo]
[implements ListaTipi] {
[<dichiarazione di attributi>]
[<dichiarazione dei costruttori>]
Corpo della
classe
[<dichiarazione dei metodi>]
}
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Struttura di una classe (2)
Definizione di un metodo statico (o classe)
Metodo:
<modificatore> <tipo ritorno> <identificatore> ([lista parametri]) {
[<istruzioni>]
}
Esempio:
public class Test {
public static void stampa(int x, int y) {
System.out.println(“x=” + x + “, y=” + y);
}
public static int somma(int x, int y) {
return x + y;
}
}
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Struttura di una classe (2)
• static
– Indica una variabile di classe
– Vi è un unico valore associato alla classe indipendente da
quante istanze della classe sono create
– Si accede alla variabile mediante il nome della classe
(Test.stampa(1,2))
• Senza static
– Indica una variabile di istanza
– Vi sono diversi valori per ogni oggetto della classe
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Struttura di una classe (2)
class StaticTest{
static int i = 47;
}
StaticTest st1 = new StaticTest();
StaticTest st2 = new StaticTest();
• Sia st1.i che st2.i hanno lo stesso valore 47 perché si riferiscono
allo stesso segmento di memoria
• Si può fare riferimento alla variabile static anche direttamente il
suo nome di classe:
StaticTest.i++;
A questo punto sia st1.i che st2.i assumeranno il valore 48
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Struttura di una classe (2)
• Una logica simile vale per i metodi statici
class StaticFun{
static void incr() { StaticTest.i++; }
}
StaticFun sf = new StaticFun();
sf.incr();
oppure
StaticFun.incr();
• Un uso importante di static per i metodi è quello che permette di
chiamare il metodo senza creare un oggetto. Questo è essenziale per il
metodo main() che è il punto di ingresso per eseguire un’applicazione
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Commenti (1)
• Sono spesso detti documentazione in-line
• Sono inclusi per documentare lo scopo e le
funzionalità del programma
• Non ne influenzano il funzionamento
• Vengono trascurati dal compilatore
• Possono avere tre forme
// commenti fino alla fine della riga
/* commento che
può stare su più righe */
/** commento che genera documentazione */
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Commenti (2)
• Commenti non si possono annidare
• Si possono utilizzare /* e */ all’interno di //
• Si può utilizzare // all’interno dei commenti
/* e /**
• All’interno di /* e /** e possibile utilizzare /*
ma non */ contemporaneamente
• Esempio
/* this comment /* // /** ends here: */
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Commenti di documentazione: Javadoc
• Se documentazione e codice sono separati, la
manutenzione è onerosa
• L’utility Javadoc consente di collegare una sintassi di
commento speciale alla documentazione
– i comandi sono inseriti tra commenti /** e */
– le informazioni da includere nella documentazione possono
essere contrassegnate da marcatori detti “doc tag”
– è possibile includere direttamente codice HTML
• Il risulatato prodotto è un file HTML visualizzabile
sul browser
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Sintassi Javadoc
//: object/HelloDate.java
import java.util.*;
/** The first Thinking in Java example program.
* Displays a string and today’s date.
* @author Bruce Eckel
* @author www.MindView.net
* @version 4.0
*/
public class HelloDate {
/** Entry point to class & application.
* @param args array of string arguments
* @throws exceptions No exceptions thrown
*/
public static void main(String[] args) {
System.out.println("Hello, it’s: ");
System.out.println(new Date());
}
} /* Output: (55% match)
Hello, it’s:
Wed Oct 05 14:39:36 MDT 2005
*///:~
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
Javadoc cattura anche il nome della
classe o del metodo che si trova in
prossimità del commento
Esempi di tag:
@author @version
@param @throws
//: object/HeloDate.java
nome dell’archivio del fine sorgente
///:~
fine del listato
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Java Documentation
• La distribuzione di Java contiene una
documentazione della base di Java sotto
forma HTML. Tale documentazione è sotto la
directory
docs/api/
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Java Documentation
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Java API Documentation
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Java API Documentation
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Java API Documentation
• Si può usare il comando javadoc per generare
automaticamente tale documentazione di API
per nuove classi
• javadoc utilizza una convenzione speciale dei
commenti per consentire di mettere
informazioni pertinenti API. Questi commenti
sono della forma /** **/. Dentro tale
commenti si può mettere qualunque codice
HTML.
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Java API Documentation
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Java API Documentation
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Annotazioni
• La Java 2 Platform, Standard Edition (J2SE) versione 5, introduce le Java
Annotations
• Le Java Annotations sono metadati (data about data) associati a parti di
codice (classi, interfacce, metodi e campi)
– documentazione del codice
– generarazione di codice
– gestione avanzate della business logic a tempo di esecuzione
• L’utilizzo delle annotazioni è molto più evoluto rispetto alle Javadoc:
– annotations predefinite e creazione di Annotations personalizzate per
“decorare”, classi, metodi e campi
– la “visibilità” delle annotazioni è configurabile, e può essere relativa al
codice sorgente, alle classi compilate oppure informazioni rese disponibili
dalla JVM a tempo di esecuzione
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Spazi bianchi
• Spazi, righe vuote e le tabulazioni sono
considerati spazi bianchi
• Sono usati per separare le parole e i simboli
di un programma
• Vengono ignorati dal compilatore
• Vengono utilizzati per formattare un
programma Java migliorando la leggibilità
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Code Convention (1)
• Java ha una convenzione per la definizione dei package,
classi, interfacce, costanti, …
• Vi sono anche delle convenzioni per l’indentazione del
codice
• Tali convenzioni aiutano a rendere il codice più
leggibile e ad eliminare alcuni conflitti di nomi
• Si raccomanda di utilizzare le convenzioni adottate
• Link ufficiale
– http://www.oracle.com/technetwork/java/codeconv138413.html
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Code Convention (2)
• Nomi dei package
– Tipicamente si utilizza un prefisso che identifica il nome del
dominio internet (utilizzato al contrario) della società/ente che
sviluppa l’applicazione
– Generalmente si fa seguire tale prefisso con il nome
dell’applicazione o del progetto o del dipartimento, …
– Esempio
• com.sun.javaproject
• it.univaq.tlp.j2se
• org.apache.struts
• org.apache.xml.axis
• org.omg.CORBA
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Code Convention (3)
• Nomi classi ed interfacce
– Si utilizzano tipicamente nomi o frasi non eccessivamente lunghe
– Se è una frase composta nomi singoli scritti in maiuscolo
– Nome inizia sempre in maiuscolo
– Tipicamente le interfacce sono aggettivate
– Esempi
• ClassLoader
• SecurityManager
• Thread
• BufferedInputStream
• Runnable
• Cloneable
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Code Convention (4)
• Nomi dei metodi
–
–
–
–
Si utilizzano tipicamente verbi o frasi
Nome inizia sempre in minuscolo
Se è una frase composta nomi singoli scritti in maiuscolo
Esempi
• getPriority, setPriority
• length
• toString
– Se restituisce un booleano tipicamente rispetto ad una
condizione V si utilizza isV
• isInterrupted classe Thread
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Code Convention (5)
• Nomi dei campi
– Generalmente identificano nomi o frasi oppure abbreviazioni
– Se non sono final iniziano con lettera minuscola
– Se sono composti le altre parole lettera maiuscola
– Esempi
• buf, pos, count di java.io.ByteArrayInputStream
• out classe System
– Nel caso di costanti (ovvero final e campi nelle interfacce) i nomi sono scritti in
maiuscolo e se composti singole parole separati da _
• MIN_VALUE, MAX_VALUE
• interface ProcessStates {
int PS_RUNNING = 0;
int PS_SUSPENDED = 1;
Romina Eramo
}
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Code Convention (6)
• Variabili locali e nomi parametri metodi
– Generalmente sono nomi brevi
– Possono identificare
• Degli acronimi
– cp variabile locale per classe ColoredPoint
• Abbreviazioni
– buf per un buffer di qualche tipo
• Termini mnemonici
– off e len oppure parametri read e write nei nomi dei metodi
dell’interfaccia DataInput e DataOutput
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Code Convention (7)
• ……….
– Nel caso di variabili locali si possono usare le seguenti convenzioni
• b per i tipi byte
• c per i tipi char
• d per i tipi double
• e per i tipi Exception
• f per i tipi float
• i,j,k per i tipi int
• l per i tipi long
• o per i tipi Object
• s per i tipi String
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche