LINGUAGGIO JAVA: LE BASI PER COMINCIARE SEGO - TECH TOWN TEAM STORIA DEL LINGUAGGIO JAVA Il linguaggio che siamo abituati a conoscere come JAVA non è sempre stato chiamato così e gli obiettivi per i quali fu progettato inizialmente erano ben diversi da quelli di oggi. La storia di Java possiamo farla partire dalla fine del 1990. A quel tempo la Sun Microsystem decise di mettere assieme un team di sviluppatori con lo scopo di sviluppare un architettura software platform-indipendent che potesse essere facilmente installabile e funzionante su dispositivi elettronici di dimensioni medio-piccole: articoli elettronici “domestici” per intenderci. Il gruppo di ricerca in questione era chiamato “Green Team” e al progetto fu naturalmente dato il nome “Green Project”. Il primo ostacolo col quale si trovarono a fare i conti, fu il problema dell’indipendenza dalla piattaforma: è assai problematico sviluppare un prodotto software senza sapere su che background si può contare. Non si potevano infatti fare assunzioni di alcuni tipo su CPU e sistema operativo a disposizione. Come molti sanno Java è linguaggio object-oriented, che deve molto in termini di sintassi al C++. Qualcuno potrebbe chiedersi perché? Beh la risposta è piuttosto semplice: la prima versione del linguaggio Java fu sviluppata a partire da un compilatore C++. In questo fermento di idee che vedeva come pilastro fondamentale del progetto la capacità di essere platformindipendent nacque verso la metà del 1991 Oak (l’antenato di Java), un linguaggio ad oggetti, sicuro e robusto. Il motivo di questo nome è da ricercare, a quanto dicono nella quercia che James Gosling (una delle menti pulsanti del Green Team che non a torto si potrebbe definire il papà di Java) vedeva attraverso la finestra del suo ufficio. Il team non si fermò qui e nel giro di un anno, un anno e mezzo (fine del 1992) presentò un prototipo simile ad un PDA chiamato “*7” o “Star7” che era interamente basato su tecnologie sviluppate dal team stesso: 1. il neo-nato Oak 2. GreenOs, un sistema operativo 3. una interfaccia utente 4. il dispositivo stesso Naturalmente il mercato di un prodotto simile era quello dell’elettronica e il successo del prodotto fu tutto sommato discreto. Il team allora puntò gli occhi su una fetta più specifica di mercato: quello delle “TV digitali”. Gli sforzi si concentrarono quindi nel creare un dispositivo elettronico che interfacciato alle normali tv rendesse disponibile quello che viene definito comunemente video-on-demand, la possibilità di scegliere cosa vedere e quando vederla: in sostanza si trattava di rivoluzionare il normale concetto di apparecchio televisivo. Nonostante gli sforzi del team, il progetto naufragò vista soprattutto la mancanza di interesse da parte degli stessi finanziatori. A quel punto Gosling e il suo team si chiesero quale poteva essere la direzione verso cui puntare. La risposta fu Internet! In quel periodo infatti il web stava cominciando a diventare sempre più di uso “domestico”, e questo grazie anche allo sviluppo di nuovi tool e software, fra tutti spicca il primo browser web Mosaic. Questo portò alla nascita vera e propria di Java. Le potenzialità di Java furono portate davanti agli occhi di tutti quando venne scritto HotJava 1.0, un browser web (scritto in Java) che grazie a Java stesso era in grado di visualizzare oggetti dinamici inseriti nelle normali pagine web. Il giorno della svolta è stato il 23 maggio 1995, quando Java venne finalmente presentato al pubblico da Sun Microsystem in occasione del SunWorld ’95. Da lì a rendere disponibile un tool di sviluppo per Java il passo fu breve. Fu così che sul sito di Sun comparve il JDK 1.0. E’ naturale che il pubblico fu piacevolmente sorpreso da questo nuovo linguaggio e dalla sua filosofia che va sotto il nome di WORE ossi Write Once Run Everywhere. E’ bastato vedere col passare degli anni come questo sia vero: su qualsiasi dispositivo si voglia eseguire un programma scritto in java basta scrivere una VirtualMachine in grado di interpretare il bytecode ed il gioco è fatto! Le motivazioni del successo di Java penso siano piuttosto chiare: 1. La filosofia platform-indipendent (o WORE, vedi sopra): qualsiasi dispositivo che supporti una Java Virtual Machine è potenzialmente in grado di eseguire un programma scritto in Java 2. L’essere un linguaggio object-oriented: Java grazie a concetti chiave come oggetto, information-hiding, ereditarietà, overloading, etc. incarna appieno la filosofia di programmazione ad oggetti. Questo fa di lui un linguaggio sicuro, pulito, robusto. 3. Sintassi chiara e pulita: scrivere programmi in Java è molto più facile che scriverli in altri linguaggi (C++ stesso). E’ quindi molto più semplice leggere e comprendere i sorgenti. L’esempio forse più lampante è l’uso del sistema di Garbage Collection che si occupa di gestire la deallocazione della memoria sprecata da oggetti ormai inutilizzati. Niente più quindi necessità di liberare esplicitamente lo spazio sprecato come si è abituati a fare in C/C++. 4. L’aver reso freeware il linguaggio (attenzione freeware è un qualcosa di diverso da opensource): tutti possono accedere ai tool di sviluppo, segnalare bug, contribuire al miglioramento del linguaggio stesso. 5. Aver abbracciato il web: abbiamo visto quanto importante sia stato per il successo di Java aver puntato sul web. Ancor oggi molto spesso quando si parla di Java molti fanno riferimenti diretti/indiretti al web. Oramai però Java è talmente maturo che ha permeato tutti i campi della programmazione: dal networking al 3d, dall’editing audio alla programmazione database, fino ad arrivare allo sviluppo per dispositivi mobili come PDA, cellulari,etc. E’ indubbio quindi che Java abbia compiuto un grosso passo avanti rispetto a quel lontano 1995. ARCHITETTURE SOFTWARE DIFFERENTI: J2SE, J2EE, J2ME Col passare del tempo Java ha cominciato a diffondersi coprendo un vasto numero di campi, diversificando i propri target di applicazione. Questo ha portato alla situazione attuale in cui Sun propone tre differenti architetture software. Tutte sono naturalmente basate su Java, ma ognuna di esse è sostanzialmente indirizzata ad ambienti e dispositivi diversi tra loro e che sono: • J2SE – Java 2 Standard Edition • J2EE – Java 2 Enterprise Edition • J2ME – Java 2 Micro Edition La piattaforma J2SE è per così dire il nucleo della Tecnologia Java: chiunque decida di programmare in Java prima o poi si troverà ad utilizzarla. Potremmo dire che a differenza dalle altre due architetture la J2SE copre un target di utenza molto più ampio e vasto, ed è per questo che è la più utilizzata. Diamo ora uno sguardo all’architettura nel suo complesso: FIGURA - Piattaforma J2SE. Una distinzione che può andar fatta subito anche vedendo la figura è quella tra SDK e JRE. SDK sta per Software Development Kit, mentre JRE sta per Java Runtime Environment. Si capisce immediatamente come il JRE sia indispensabile per eseguire il bytecode Java, mentre l’SDK è fondamentale perché fornisce tutti quegli strumenti per lo sviluppo degli applicativi come librerie, debugger e il compilatore javac. Entrambi sono scaricabili gratuitamente dal sito di Sun Microsystems. Con J2SE il programmatore può fare praticamente di tutto: networking, comunicazione con porte seriali e parallela, RMI, manipolazione audio, grafica 2D/3D, interfaccie grafiche avanzate, accesso ai database, espressioni regolari. Tutto questo mediante classi java ordinate e collezionate in packages: al programmatore non serve far altro che importare le classi giuste, creare gli oggetti necessari e invocare i metodi adatti. La piattaforma J2EE è un’architettura appositamente studiata per lo sviluppo di applicazioni enterprise. Questa piattaforma sfrutta tutte le caratteristiche della J2SE aggiungendone di nuove, orientate allo sviluppo business di applicazioni distribuite scalabili e transazionali. Tecnologie fondamentali di questa piattaforma sono JSP (Java Server Pages) e Servlets che unite a EJB (Enterprise Java Beans) consentono di ottenere applicazioni fortemente improntate all’ambito internet/intranet. In pratica queste tre tecnologie sono l’esempio lampante di come si possano costruire applicazioni enterprise multi-tier unendo parte frontend (JSP e Servlet) con parte back-end (EJB). La piattaforma J2EE utilizza un approccio a componenti garantendo così la modularità e il riutilizzo del codice. Che significa tutto questo? Garantire la possibilità di riutilizzare in progetti differenti componenti software esistenti e precedentemente sviluppati. Il framework .NET di casa Microsoft in un certo senso sta tentando di porsi come antagonista del framework J2EE proprio perché entrambi incarnano la filosofia a componenti. Infine altra caratteristica fondamentale della piattaforma J2EE è che fornisce pieno supporto per progettare, sviluppare e testare i Web Services (interfacce applicative disponibili su Internet) permettendo di interagire in maniera ottimale anche con altri web services o client che girano su piattaforme diverse. La piattaforma J2ME è un sottoinsieme della piattaforma J2SE, che è stato alleggerito ed ottimizzato per poter essere compatibile e funzionante su tutti quei dispositivi elettronici, portatili e non, che sono dotati di scarse risorse in termini di hardware (ad esempio CPU e memoria). Tipicamente quando si parla di programmazione J2ME si pensa alla programmazione dei palmari o dei cellulari. Anche se il target principale sembrano essere proprio questi dispositivi, la visione è piuttosto limitativa, visto che sono interessati da questa tecnologia anche: Internet-Tv, telefoni fissi digitali, console per videogiochi, strumenti per la navigazione satellitare. La tecnologia J2ME è piuttosto recente (annunciata nella metà 1999), ma non per questo è meno diffusa, visto che ormai grazie alla moda di aver un telefonino di ultima generazione o un PDA, molti (a volte senza neanche saperlo) sul proprio dispositivo fanno uso di tecnologia Java. L’esempio più classico sono naturalmente i giochi per cellulare. L’architettura J2ME proprio perché interessa una vasta gamma di dispositivi con caratteristiche spesso molto diverse fra loro è stato progettato in modo molto modulare per fare in modo che ogni componente risponda ad esigenze particolari. Qui non andremo oltre ma basti sapere che particolari configurazioni determinato quale tipo di virtual machine verrà impiegata da una particolare classe di dispositivi, mentre i profili determinano quali moduli applicativi (in parole povere che tipo di import) potranno essere impiegati dalle diverse configurazioni. INSTALLAZIONE E CONFIGURAZIONE (WINDOWS E LINUX) Non sapevo se scrivere o meno questa sezione. In realtà nel 99% dei casi per installare correttamente java e relativo sdk basterebbe seguire le informazioni che sono riportate nelle relative pagine di documentazione sul sito di Sun. E’ vero anche che molto spesso invece la gente scarica l’sdk e installa semplicemente (senza configurare alcunché) e poi si trova di fronte a qualcosa di non perfettamente funzionante specie quando si tratta di andare a compilare manualmente i sorgenti utilizzando javac. Ecco quindi che fioccano le domande nei forum e nei gruppi di discussione. Questa sezione diciamo così è una sorta di traduzione-riassunto delle informazioni che si possono reperire sul sito della Sun. - WINDOWS: INSTALLAZIONE Prima di installare una nuova versione dell’sdk è consigliabile disinstallare qualsiasi versione precedentemente installata, specie se si tratta di una versione beta. Il file da scaricare è un file .exe facilmente prelevabile dalle pagine web di Sun. Una volta scaricato è sufficiente lanciare il programma di installazione. Da notare che su sistemi NT-like come win2000 o winxp è necessario disporre dei privilegi di amministratore di sistema. In fase di installazione è possibile riscontrare dei warning dovuti magari ad una versione di windows non supportata dall’ultimo sdk (se non sbaglio è la versione 1.4.2) o semplicemente perché il sistema operativo necessità dell’ultimo service pack. In questo caso è consigliabile dare un’occhiata alla lista dei “requisiti di sistema”. - LINUX: INSTALLAZIONE Sinceramente ho dovuto installare l’sdk sotto linux solo un bel po’ di tempo fa. Infatti ultimamente molte (se non quasi tutte) distribuzioni linux permettono di installare l’sdk in fase in installazione del sistema operativo, quando ci si trova a selezionare i pacchetti. In ogni caso è possibile scaricare dal sito di Sun l’sdk in due formati: o il classico rpm oppure un file .bin autoestraente. Il file .bin ha il vantaggio che può essere installato da qualsiasi utente, a differenza della versione rpm che può essere installata solamente da chi ha accesso root, questo perché tipicamente va a sostituire la versione Java precedentemente installata con Linux. • .BIN FILE: 1. Controllare che il file abbia settati i permessi di esecuzione: chmod +x <nome-file>.bin 2. Posizionarsi nella directory dove si vuole installare 3. Lanciare l’installazione: ./<nome-file>.bin. Attenzione viene creata una cartella del tipo j2sdk<version>. • .RPM FILE: 1. Controllare che il file abbia settati i permessi di esecuzione: chmod +x <nome-file>.rpm.bin 2. Eseguire il file: ./<nome-file>.rpm.bin. Attenzione viene estratto un file <nome-file>.rpm 3. Assumere i permessi di root, nel caso non se ne disponga già, mediante il comando “su”. 4. Lanciare il comando: rpm –iv <nome-file>.rpm 5. Cancellare pure i file .rpm e .bin. 6. Chiudere la shell di root. - WINDOWS & LINUX: CONFIGURAZIONE VARIABILI D’AMBIENTEUna volta che l’installazione è andata a buon fine si può passare alla configurazione delle variabili d’ambiente che ci permettono di sfruttare in maniera ottimale l’sdk appena installato. La variabile fondamentale da settare è PATH. Questo ci permette di utilizzare i tool da linea di comando (java.exe, javac.exe, etc.) senza ogni volta dover specificare il percorso. • In sistemi Linux basta aggiungere nel .profile o .bashrc la stringa: export PATH=$PATH:/<percorso>/<dell’sdk>/bin • In sistemi NT, Win2000 e WinXP: 1. entrare in “Pannello di Controllo” e selezionare la voce “Sistema” 2. clickare su “Avanzate->Variabili d’ambiente” 3. aggiungere al path già esistente: ;C:\<percorso>\<dell’sdk>\bin\ • In sistemi Win98: 1. modificare il file autoexec.bat come al punto 3 sopra. Altra variabile che è utile settare è la variabile JAVA_HOME che viene utilizzata da programmi (ad esempio Tomcat) e altri tool per verificare dove sia installato l’sdk. Quindi la variabile va configurata in maniera analoga a quanto visto precedentemente solo che questa volta la si fa puntare alla directory base del kit installato e non alla sottodirectory bin. Infine è buona prassi configurare anche la variabile CLASSPATH che dovrebbe puntare alle varie librerie che dovrebbero essere utilizzate dai file java. Tipicamente la si fa puntare alla sottocartella jre\lib\ , anche se nulla vieta di modificarla appositamente per farla puntare anche ad altre dir in cui siano contenute magari file .jar e librerie scaricate da Internet o da noi progettate. SEMPLICE EDITOR O IDE AVANZATO? Indubbiamente chi ha avuto qualche esperienza di programmazione sa benissimo che c’è una differenza abissale tra lo scrivere codice usando il semplice editor di testi e lo scrivere codice usando un ambiente di sviluppo avanzato. Il consiglio che posso dare è quello di usare sempre e comunque un IDE, laddove sia possibile farlo. Questo non significa che non si debbano conoscere i comandi fondamentali come java o javac o ancora jar. E’ importante conoscerne il loro funzionamento fondamentale, perché può sempre capitare che ci si trovi in situazioni in cui sia impossibile scaricare/installare un ide e sia necessario compilare i propri sorgenti manualmente. E’ indubbio però che l’utilizzo di un buon IDE oltre che fornire comode funzionalità quali completamente automatico del codice, autoindentazione, javadoc istantaneo, etc. permette di sviluppare programmi in maniera molto più veloce. Per quanto mi riguarda, fino ad ora ho avuto esperienze con ide come ECLIPSE e NETBEANS. Ognuno di questi programmi ha caratteristiche proprie che li rendono diversi l’uno dall’altro. Di sicuro quello che ho utilizzato di più è stato Netbeans che pur essendo un ottimo IDE, molto versatile e ricco di funzionalità si rivela piuttosto pesante se paragonato con il suo “avversario” Eclipse, decisamente più performante e veloce. Tuttavia come dicevo ciascuno in un modo o in un altro “porta acqua al proprio mulino”. Eclipse si rivela eccezionale qualora ci si trovi nella situazione di dover effettuare dei confronti tra sorgenti (come mi è successo di recente). La funzionalità di “compare” in esso integrata è in grado di effettuare delle analisi approfondite delle differenze strutturali che caratterizzano i singoli package o il progetto intero, permettendo poi di scendere in profondità analizzando le differenze tra file sorgenti .java veri e propri. D’altra parte Netbeans si è rivelato un ottimo strumento qualora ci si trovi a dover sviluppare progetti di medie dimensioni riguardanti che richiedano l’uso di servlet e jsp. Esso è dotato internamente di un motore Tomcat che permette così il test delle applicazioni sviluppate senza la necessità di dover installare a parte il servlet-engine Tomcat. E’ infatti semplicissimo creare una web application: si crea un webmodule e poi si precede alla creazione delle servlet e delle pagine jsp necessarie. Lo sviluppo di web application con Eclipse non è invece così immediato e richiede infatti oltre che l’installazione del Tomcat vero e proprio anche l’installazione/configurazione di un plugin adeguato. Niente di così impossibile, ma nulla di paragonabile all’immediatezza di Netbeans. Questi che vi ho portato davanti agli occhi sono solo alcuni esempi: questo per far capire come ogni IDE possieda caratteristiche spesso diverso da un altro e che fanno di lui uno strumento adatto in particolari situazioni e meno in altre. Un altro ottimo IDE di cui ho sentito parlar bene (anche se non l’ho mai usato) specie per quanto riguarda lo sviluppo di applicazioni visuali è il JBuilder della Borland, che se non vado errato nella versione Personal è disponibile gratuitamente per il download. Morale: provate vari ide e vedete quello che fa per voi! DOCUMENTAZIONE E MATERIALE ON-LINE Spesso chi si trova di fronte ad un nuovo argomento di studio ha il problema di trovare il materiale giusto con cui cominciare e approfondire le proprie conoscenze. Beh vi dico sin da ora che non avrete di certo molti problemi a trovare documentazione o materiale in rete che riguardi java. Quello che voglio fare io in questo piccolo spazio è tentare di segnalare i link, i documenti che a mio parere possono aiutare molto nello studio di questo linguaggio di programmazione. EBOOK E TUTORIALS: - THINKING IN JAVA 3RD EDITION: http://www.mindview.net/Books/TIJ/ - JAVA MATTONE SU MATTONE: http://www.java-net.it/download.html - MOKABOOK: http://www.mokabyte.it/mokabook/ - J2SE DOCUMENTATION: http://java.sun.com/docs/ - CORSO JAVA ON-LINE: http://www.corsojava.it/ LINK UTILI: - http://www.javaportal.it - http://www.mokabyte.it - http://www.jguru.com - http://www.java-net.it - http://www.bigatti.it - http://www.javaworld.com Infine un piccolo consiglio, cercando su google troverete on-line molti libri della O’Reilly che trattano di Java. Sono ottimi e ben scritti… quindi buona ricerca!