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