Fondamenti di Java Lezione n. 1 Java, il linguaggio della Rete Che cos'è Java? Java è un linguaggio di programmazione orientato agli oggetti, in gergo Object-Oriented Language (OOL), sviluppato nel 1991 da un gruppo di ricercatori della multinazionale californiana Sun Microsystems, già leader mondiale nella costruzione di elaboratori basati sul sistema operativo UNIX (workstation). Java, che si ispira al C++, è stato creato forse per un divertimento intellettuale tipico dei ricercatori, tuttavia con lo scopo concreto di realizzare un prodotto gratuito disponibile per tutta per la comunità dei programmatori, con una serie di caratteristiche specifiche, cioè di essere di piccole dimensioni, più semplice rispetto al suo parente più stretto C++, veloce in maniera ragionevole, e soprattutto utilizzabile senza dovere riscrivere il codice su ciascuna delle diverse piattaforma hardware dotate di diversi sistemi operativi. Pertanto, è il linguaggio ideale per sviluppare applicazioni sia tradizionali che soprattutto per il World Wide Web e quindi la Rete. È evidente che il progetto di Sun sia stato realizzato in un’epoca in cui si andava ormai affermando in maniera irreversibile la supremazia monopolistica, nel campo degli elaboratori e dei sistemi operativi, di un grande concorrente anch’esso americano (scommettiamo che avete indovinato chi?). Ancora oggi, lo “stile” Sun e la “filosofia” Java restano contrapposte a quelle altre, e tale disputa a volte assume toni anche di aspra contesa tecnologica e di mercato. Java è portabile A parte il fatto che è possibile procurarsi direttamente dalla Sun un ambiente di sviluppo gratuito e totalmente efficiente, uno dei fattori tecnologici del grande successo di Java è sicuramente quello della sua totale portabilità, o indipendenza dalla piattaforma: un programma scritto e opportunamente compilato in Java può essere utilizzato su qualsiasi macchina con qualsiasi sistema operativo, sul quale sia installata una cosiddetta macchina virtuale Java, in gergo Java Virtual Machine (JVM). Negli altri linguaggi di programmazione, invece, l'operazione di compilazione traduce il codice sorgente scritto dal programmatore in codice macchina, cioè una serie di Francesco Marzano - Manuali.Net © 2002 Tutti i diritti riservati 1 Lezione n. 1 Fondamenti di Java istruzioni che vengono interpretate dal microprocessore: queste istruzioni variano da processore a processore (e quindi da piattaforma a piattaforma e da sistema operativo a sistema operativo) quindi il programmatore si trova costretto a compilare il file sorgente più volte su diversi sistemi operativi. Linguaggi tradizionali Codice sorgente Compilatore per UNIX Piattaforma UNIX Compilatore per PC Piattaforma PC Java invece adotta un meccanismo diverso: compilando il file sorgente non viene generato il codice macchina bensì un codice semi-compilato detto bytecode, un codice universale che contiene operazioni puramente logiche che poi vengono interpretate dalla JVM. La JVM è diversa per ogni sistema e fa parte del pacchetto standard di sviluppo di Java, detto JDK (Java Development Kit). Java Codice sorgente Compilatore Java Piattaforma UNIX Piattaforma PC Durante la creazione dei programmi si avrà pertanto a che fare con due tipi diversi di file: i file .java che contengono il codice sorgente con la sintassi Java che apprenderete durante questo corso, e quelli .class, i file bytecode generati dalla la compilazione. Java e il Web Pur essendo un linguaggio general purpose (cioè adatto a qualsiasi scopo), è nella programmazione per la rete che Java vede le sue caratteristiche meglio adattarsi. Per questo motivo è spesso descritto come “il linguaggio della Rete”. Infatti una delle modalità (non l’unica) per usare Java in rete è quella di far eseguire i programmi direttamente dal browser dotato al suo interno di una JVM in grado appunto di eseguirli. Francesco Marzano - Manuali.Net © 2002 Tutti i diritti riservati 2 Fondamenti di Java Lezione n. 1 Prima di Java, accadeva che nel momento in cui il browser si trovava a dover gestire un documento non HTML, doveva fare riferimento a un’applicazione esterna o utilizzare una “integrazione” (plug-in) preventivamente installata. In ogni caso si trattava non già di un’esecuzione diretta del codice, ma di un reindirizzamento ad altre applicazioni. La conseguenza era che, in queste condizioni, era impossibile realizzare una vera e propria programmazione distribuita che fosse interattiva. Con Java le cose sono cambiate: adesso è direttamente il browser, attraverso la JVM che ne fa parte integrante, ad eseguire direttamente le applicazioni, scritte con Java, inserite nelle pagine HTML, e scaricate dalla rete sul proprio PC. Vedremo in dettaglio che queste particolari applicazioni Java vengono definite applet. La Rete diventa pertanto un canale di trasmissione dal quale prelevare non solo informazioni statiche ma anche software eseguibile da certi server, e il PC col browser il client in grado di eseguire un programma in locale. Questo è il vero networking! Java è un linguaggio ad oggetti La programmazione ad oggetti rappresenta la nuova frontiera della programmazione. Questo nuovo modo di programmare permette di creare programmi molto complessi compilando poche righe di file sorgente. Java occupa un posto in prima fila tra gli OOL (Object Oriented Languages) insieme al C++, Visual Basic, Delphi per citare i più noti. Programmare per oggetti significa definire oggetti stabilendone proprietà e comportamenti, così come avviene nella realtà. Ogni oggetto ha delle caratteristiche fisiche e dei comportamenti: un automobile, per esempio, avrà certe proprietà (la cilindrata del motore, il colore della carrozzeria, la lunghezza), comportamenti caratteristici (velocità massima, accelerazione, chilometraggio), apparterrà alla categoria dei veicoli a motore. È proprio così che si definisce un “oggetto” Java. Avete infatti definito delle proprietà (cilindrata, colore carrozzeria, lunghezza) e dei comportamenti (velocità, accelerazione), apparterrà ad una classe padre (veicoli a motore). In Java è la stessa cosa: al posto delle proprietà troveremo gli attributi e al posto dei comportamenti i metodi. Quando programmiamo in Java creiamo una classe astratta di oggetti con proprietà (attributi)e comportamenti (metodi), che in seguito darà luogo ad un oggetto concreto. Quando pensate ad un’auto voi non pensate alla vostra vettura, ma all’idea di automobile che si realizza in una classe di automobili. Quando però definite alcune caratteristiche (cilindrata, colore) ed alcuni comportamenti (accelera) definite un oggetto concreto o, come si dice nei linguaggi OO, una “istanza” della classe. Francesco Marzano - Manuali.Net © 2002 Tutti i diritti riservati 3 Fondamenti di Java Lezione n. 1 Le altre caratteristiche di Java L’indipendenza dalla piattaforma e la natura ad oggetti caratteristiche principali e più note di Java, ma non le sole. sono le due La gestione della memoria viene fatta in automatico dalla JVM e garantisce sicurezza e semplicità di programmazione, senza le complicazioni e complessità tipiche del C. Java rende poi disponibile un meccanismo molto evoluto con cui è possibile, all’interno della stessa applicazione, eseguire contemporaneamente più processi (task). Questo meccanismo è detto di multithreading. Java è stato progettato con il preciso fine di garantire la massima sicurezza, sia dell’applicazione in sé che del client che esgue l’applicazione scaricata dalla rete, esigenza di primaria importanza in Internet. Infine la semplicità che ne rende l’apprendimento alquanto semplice: la sintassi è molto simile a quella del C ma sono stati eliminati costrutti complessi senza pregiudicare la correttezza formale. Il solo fatto di avere eliminato i famigerati puntatori del C rende il codice molto più semplice, sicuro e meno soggetto all’insorgere di bug. Le prestazioni Il problema delle performance è forse l’unico punto debole di Java: poiché esso utilizza uno strato di software interpretato e indipendente dalla piattaforma, che come abbiamo visto è un vantaggio enorme, un’applicazione Java risulta, se non lenta, non altrettanto veloce e competitiva quanto una scritta in C++. Tuttavia questa affermazione, se pur vera nel caso di applicazioni tradizionali, è sminuita nel caso di applicazioni distribuite o orientate all’uso della rete (netoriented). Infatti, l’estrema adattabilità di Java a soluzioni distribuite e netoriented, consente di superare e in parte risolvere la cronica ristrettezza di banda tipica di Internet. In ogni caso, le considerazioni sulla presunta lentezza di Java perdono la loro valenza a fronte di fattori ben più importanti quali la versatilità, la robustezza, la sicurezza, la portabilità. Gli strumenti Oltre ad aver creato questo nuovo linguaggio e la tecnologia ad esso connessa, Sun ha creato un insieme completo di librerie (API) già pronte e strumenti per sviluppare applicazioni Java. Il tutto in un ambiente integrato liberamente scaricabile da Internet, noto come “Kit di Sviluppo per Java” (JDK). Francesco Marzano - Manuali.Net © 2002 Tutti i diritti riservati 4 Fondamenti di Java Lezione n. 1 Essendo Java ad oggetti, anche il JDK non poteva che essere organizzato allo stesso modo. Le classi contenute nel JDK coprono tutte le casistiche tipiche delle programmazione: grafica, rete, database, multithreading, ecc. L’organizzazione logica delle classi nel JDK è fatta in modo molto preciso, per cosiddetti package (il package Java è un concetto molto importante che riprenderemo nella Lezione 4). Una volta che si comincia a programmare in Java, è fondamentale ricordare almeno quelli più utilizzati, cioè quelli descritti nella seguente tabella. Nome del package java.lang java.util java.io java.net java.awt java.applet Contenuto Classi base per sviluppare un’applicazione, costrutti principali del linguaggio Classi di pubblica utilità (funzioni matematiche, stringhe, vettori, ecc.) Classi di supporto per l’Input/Output Classi di supporto per la programmazione di rete Insieme di oggetti grafici per la creazione di interfacce grafiche (GUI) Classi necessarie alla creazione di applet Il primo programma Per concludere, creiamo il classico primo programma “Ciao Mondo!” in modo da cominciare vedere per la prima volta la sintassi di Java. Apriamo il Notepad di Windows, o un qualsiasi editor (anche Word), ricordando però di salvare il file in formato testo, e scriviamo: public class CiaoMondo { public static void main (String[] args) { System.out.println(“Ciao mondo!”); } } Salviamo il file col nome CiaoMondo.java, in una cartella qualsiasi. Chi conosce il C avrà già notato la somiglianza delle istruzioni fra i due linguaggi. Il programma stamperà nella finestra dei comandi (la vecchia finestra DOS) il messaggio scritto all’interno di println. Supponiamo di avere predisposto la nostra macchina all’utilizzo del JDK (lo vediamo nella lezione successiva). Aprendo una finestra DOS, ci posizioniamo nella cartella in cui abbiamo salvato il file, dopo di che eseguiamo i comandi: javac CiaoMondo.java Francesco Marzano - Manuali.Net © 2002 Tutti i diritti riservati 5 Fondamenti di Java Lezione n. 1 con cui creiamo il bytecode, e: java CiaoMondo con cui interpretiamo il bytecode. Vedremo il messaggio Ciao mondo! stampato sul video. In conclusione, soffermiamoci sulle osservazioni significative che è già possibile fare con questo primo esempio elementare: abbiamo dato al file .java lo stesso nome della classe che stiamo creando, ovvero CiaoMondo; anche se ciò non è obbligatorio, è bene fare sempre così anche se il programma effettua solo una stampa, abbiamo creato comunque una “classe” con l’istruzione public class nome_classe con l’istruzione public static void main (String[] args) abbiamo creato un programma che siamo stati in grado di compilare ed eseguire. La presenza della parola chiave main (come nel C) identifica il codice sorgente del programma come una “applicazione” System.out.println denota la struttura gerarchica del linguaggio: il “comando” println fa parte del pacchetto out che a sua volta fa parte di System. Francesco Marzano - Manuali.Net © 2002 Tutti i diritti riservati 6