CAPITOLO 1 Introduzione ai computer, a Internet e al Web Obiettivi • • • • • Comprendere i concetti fondamentali dell’informatica Conoscere i diversi tipi di linguaggi di programmazione esistenti Conoscere l’ambiente di sviluppo Java Comprendere il ruolo di Java nello sviluppo di applicazioni client/server distribuite per Internet e il World Wide Web Una breve panoramica di tutti i capitoli del libro 1.1 Introduzione Benvenuti nel mondo di Java! Java è un linguaggio molto potente, divertente da imparare per chi ancora non lo conosce e, allo stesso tempo, estremamente utile per i programmatori più esperti. Questo libro, scritto per entrambe queste categorie di lettori, cerca di insegnare come programmare con chiarezza grazie alle famose tecniche di programmazione strutturata e di programmazione orientata agli oggetti. Chi non ha esperienza di programmazione, quindi, inizia nel modo migliore. Abbiamo cercato di rendere il testo chiaro, diretto e ricco di illustrazioni. Ancora più importante è il numero di programmi Java completi e funzionanti proposti dal libro: oltre ai listati viene sempre mostrato anche l’output prodotto durante l’esecuzione. Tutte le caratteristiche del linguaggio sono dunque contestualizzate in programmi reali; è l’approccio live-code, che fa uso dei codici sorgenti di programmi veri. I primi capitoli del libro introducono i concetti fondamentali relativi ai computer, alla programmazione e al linguaggio Java. Questi capitoli costituiscono le fondamenta indispensabili per continuare il corso. È probabile, invece, che i programmatori esperti vogliano leggere i primi capitoli molto velocemente per passare subito ai successivi, che troveranno interessanti e ricchi di informazioni. Molte persone possiedono una conoscenza di base dei computer e di ciò che è possibile fare con essi. Grazie a questo libro imparerete a utilizzare i computer per fare tutte queste cose. Il controllo dei computer avviene per mezzo dei programmi software, ovvero un insieme di istruzioni che ordinano al computer di effettuare delle azioni e di prendere delle decisioni. Il computer nella sua fisicità prende il nome di hardware. 2 CAPITOLO 1 Java è uno dei linguaggi di programmazione attualmente più utilizzati, è stato sviluppato da Sun Microsystems ed è disponibile gratuitamente in Internet presso il seguente sito Web: http://java.sun.com Questo libro è basato sulla versione più recente di Java, ovvero Java 2. La piattaforma Java 2 descrive il linguaggio, le librerie e gli strumenti Java, così che tutti possano implementare i Java development kit. Sun offre un’implementazione della piattaforma Java 2, chiamata Java 2 Software Development Kit (J2SDK) versione 1.2, che contiene gli strumenti di base necessari per realizzare programmi software con Java. Il J2SDK si trova sul CD-ROM allegato a questo libro. Oggi i computer stanno invadendo tutte le aree produttive. In un’epoca in cui i prezzi salgono drasticamente, il costo dei computer sta invece scendendo di continuo, grazie al rapido sviluppo della tecnologia hardware e software. Computer che 25 anni fa occupavano enormi stanze e costavano miliardi di lire, sono oggi racchiusi in piccoli chip in silicio che costano al massimo qualche migliaio di lire. Ironia della sorte, il silicio è uno dei materiali più comuni presenti sulla terra (si trova, per esempio, anche nella sabbia). I chip in silicio hanno reso talmente economica la tecnologia dei computer che allo stato attuale contiamo 200 milioni di computer in tutto il mondo, dislocati in industrie, aziende, organizzazioni governative e abitazioni private; in pochi anni, questo numero potrebbe facilmente raddoppiare. Questo libro catturerà il vostro interesse per diverse ragioni. Probabilmente avete dei colleghi che conoscono già i linguaggi C o Pascal, che sono linguaggi di programmazione strutturata. Voi imparerete sia la programmazione strutturata che la programmazione orientata agli oggetti. Perché entrambe? Perché la programmazione orientata agli oggetti è sicuramente la programmazione del nuovo millennio. In questo corso avrete modo di creare e interagire con numerosi oggetti, molti dei quali possono però essere strutturati meglio internamente proprio grazie alle tecniche di programmazione strutturata, che a volte sa esprimere meglio anche la logica insita nella manipolazione di tali oggetti. Un ulteriore motivo per cui proponiamo entrambe le metodologie è l’attuale migrazione massiccia dai sistemi basati sul linguaggio C (programmazione strutturata) ai sistemi che si basano sui linguaggi C++ e Java (programmazione orientata agli oggetti). È possibile trovare ancora una grande quantità di vecchio codice C in circolazione; questo linguaggio, infatti, è stato utilizzato per circa un quarto di secolo. Quando i programmatori scoprono le maggiori potenzialità del C++ e di Java, però, scelgono in genere di abbandonare il C, iniziando a convertire i propri sistemi scritti in C. Il passo successivo è, normalmente, quello di iniziare a utilizzare le caratteristiche proprie del C++ o di Java, che sono in parte dei miglioramenti di concetti già presenti in C, con tutti i vantaggi e le potenzialità della programmazione orientata agli oggetti. Java diventerà sicuramente il linguaggio più importante del nuovo millennio, per l’implementazione di applicazioni basate su Internet/Intranet e per lo sviluppo di software destinato alle comunicazioni in rete (telefoni cellulari, dispositivi PDA, e così via). Per molti anni, nelle università sono stati insegnati linguaggi di programmazione come C e C++, in quanto molto portabili (era possibile utilizzarli su qualsiasi sistema operativo e hardware, a patto che fosse disponibile anche un compilatore C/C++). Il mondo della INTRODUZIONE AI COMPUTER, A INTERNET E AL WEB 3 programmazione, però, è diventato in questi anni molto più complesso; oggi gli utenti vogliono applicazioni dotate di interfacce utente grafiche (GUI), applicazioni in grado di sfruttare le capacità multimediali di immagini, video e suoni, applicazioni in grado di essere eseguite su Internet e il World Wide Web per comunicare con altre applicazioni, applicazioni che sappiano sfruttare la flessibilità del multithreading (il multithreading permette ai programmatori di specificare che più attività debbano essere eseguite in parallelo), applicazioni che possano essere scritte rapidamente e correttamente riutilizzando componenti software già esistenti. Tutto questo, unito a un’estrema portabilità (le applicazioni possono essere eseguite senza alcuna modifica su tutte le piattaforme), è ciò che Java può offrire. Un altro dei motivi per cui Java è così interessante anche a livello universitario è che è un linguaggio completamente orientato agli oggetti. C++ si è diffuso molto rapidamente proprio perché ha saputo portare la programmazione C nel mondo degli oggetti. Il linguaggio C++, oltre a contenere il linguaggio C ANSI/ISO, offre i vantaggi della programmazione orientata agli oggetti (ANSI è l’American National Standards Insitute, mentre ISO è l’International Standards Organization). Un’enorme quantità di codice C è stata scritta nell’ultimo decennio e C++ è sembrato subito a tutti l’erede naturale del linguaggio C. I programmatori, infatti, possono prendere il proprio codice C, compilarlo in un compilatore C++ e continuare a scrivere codice simile al C apportando modifiche minime; con il passare del tempo, i nuovi sistemi possono essere interamente scritti in C++, orientati quindi agli oggetti. Questo tipo di strategia, che ha catturato l’interesse di moltissime organizzazioni, presenta però uno svantaggio: sono pochi coloro che passano completamente al C++, rinunciando per anni alle potenzialità della programmazione orientata agli oggetti e continuando a realizzare programmi difficili da mantenere a causa della loro progettazione “ibrida”. Java è un linguaggio completamente orientato agli oggetti, attraverso il quale i programmatori creano e manipolano oggetti. Oltre a ciò, l’elaborazione degli errori è già contenuta nel linguaggio, dal quale mancano però molti dei dettagli complessi che hanno impedito per anni ai programmatori C e C++ di avere “un’idea dell’insieme”. Tutte queste caratteristiche, come potete facilmente capire, sono estremamente importanti nel mondo universitario. Anche nel caso di Java, però, si è dovuti scendere a un compromesso. Le organizzazioni che decidono di utilizzare Java per lo sviluppo di nuove applicazioni non vogliono quasi mai convertire tutto il proprio vecchio codice, quindi Java permette di mantenere anche il cosiddetto codice nativo. Anche se tutto questo può sembrare strano (e lo è), rappresenta una soluzione diplomatica a un problema reale. Anche il fatto che Java possa essere scaricato gratuitamente dal sito Sun Microsystems è importante per le università, che spesso hanno a disposizione budget limitati. Via via che gli aggiornamenti e le nuove versioni di Java diventano disponibili, poi, è possibile trovarle immediatamente in Internet, così da avere sempre a disposizione il software Java più recente. Può Java essere insegnato all’interno di un primo corso di programmazione? Pensiamo di si. I non programmatori, infatti, hanno dimostrato finora di apprendere Java molto più rapidamente rispetto ai linguaggi C e C++. Java insegna agli studenti universitari come programmare in questo mondo di immagini, animazioni, suoni, video, database, reti, 4 CAPITOLO 1 multithreading e informatica di tipo collaborativo, rendendoli operativi molto prima di tutti gli altri linguaggi di programmazione. A questo punto, non ci resta che augurarvi buon lavoro! 1.2 Che cosè un computer? Un computer è un dispositivo in grado di effettuare operazioni matematiche e di prendere decisioni a velocità milioni di volte superiori rispetto agli esseri umani. Molti computer moderni sono in grado, per esempio, di eseguire cento milioni di addizioni al secondo; chiunque voglia sfidarli munito di carta e penna potrebbe rimanere inchiodato alla scrivania per decenni prima di finire! (Le domande che sorgono a questo punto sono: come sappiamo se tutte le operazioni sono state eseguite correttamente dall’essere umano? E dal computer?) I supercomputer attualmente disponibili, poi, possono anche eseguire centinaia di miliardi di addizioni al secondo, quasi quante ne eseguirebbero in un anno centinaia di migliaia di persone! Non solo: nei laboratori di ricerca esistono già prototipi di computer che lavorano a un ritmo di migliaia di miliardi di operazioni al secondo! I computer elaborano i dati sotto il controllo di insiemi di istruzioni detti programmi. I programmi guidano il computer attraverso degli insiemi di azioni ordinate, definite da persone chiamate programmatori. I vari dispositivi che costituiscono un computer rappresentano il cosiddetto hardware: questi dispositivi sono la tastiera, lo schermo, il mouse, i dischi, la memoria e le unità di elaborazione. I programmi che vengono eseguiti su un computer sono chiamati programmi software. Il prezzo dei componenti hardware è in costante calo, al punto tale che i computer sono oggi a tutti gli effetti dei normali beni di consumo. Al contrario, i costi relativi allo sviluppo del software sono in aumento, parallelamente alla necessità di applicazioni sempre più potenti e complesse, senza che vi sia un miglioramento significativo nella tecnologia di sviluppo del software. Questo libro vi insegnerà delle metodologie di sviluppo già sperimentate, in grado di ridurre i costi dello sviluppo: stiamo parlando della ridefinizione top-down passo a passo, della funzionalizzazione e della programmazione orientata agli oggetti. 1.3 La struttura del computer Se tralasciamo le differenze estetiche tra un computer e l’altro, possiamo considerarli tutti composti di sei sezioni o unità logiche: 1. Unità di input. È la sezione “ricevente” del computer. Riceve le informazioni (dati e programmi) da varie periferiche di input e le mette a disposizione delle altre unità, in modo da consentirne l’elaborazione. Le informazioni sono generalmente immesse nei computer tramite la tastiera e il mouse. In futuro, molte di esse potranno essere immesse parlando direttamente al computer e/o passando immagini in uno scanner. 2. Unità di output. È la sezione “trasmittente” del computer. Prende le informazioni già elaborate e le pone nelle varie periferiche di output per renderle disponibili all’esterno. Gran parte delle informazioni vengono oggi inviate allo schermo, stampate su carta o utilizzate per il controllo di altre periferiche. 3. Memoria. È la sezione del computer che conserva i dati, è possibile accedervi rapidamente e ha una capacità relativamente bassa. Le memoria contiene le informazioni im- INTRODUZIONE AI COMPUTER, A INTERNET E AL WEB 5 messe in precedenza nell’unità di input, e le rende disponibili immediatamente per l’elaborazione. La memoria contiene anche le informazioni già elaborate, che devono essere convogliate successivamente alle unità di output. Viene anche detta memoria primaria. 4. Unità aritmetico-logica (ALU). È la sezione di calcolo del computer. Effettua addizioni, sottrazioni, moltiplicazioni e divisioni. Prevede anche meccanismi decisionali, che consentono al computer di confrontare due dati presenti in memoria e determinare se sono uguali o meno. 5. Unità centrale di elaborazione (CPU). È la sezione amministrativa del computer. Coordina le operazioni e ha compiti di supervisione sulle altre sezioni. È la CPU a decidere quando le informazioni presenti nelle unità di input debbano essere trasferite in memoria, quando la ALU debba elaborarle, e quando queste debbano essere convogliate alle unità di output. 6. Unità di memorizzazione secondaria. Anche questa sezione memorizza i dati: a differenza della memoria primaria è un’unità di memorizzazione a lungo termine e ad alta capacità. I programmi e i dati che non vengono utilizzati dalle altre unità vengono posti normalmente in unità di memorizzazioni secondarie, come i dischi, finché non se ne ha nuovamente bisogno. L’accesso a queste unità è molto più lento rispetto a quello della memoria primaria, mentre il costo di un’unità di memorizzazione secondaria è molto più basso di quello della memoria primaria. 1.4 Levoluzione dei sistemi operativi I primi computer erano in grado di effettuare soltanto un’operazione per volta. Questa forma di elaborazione è anche detta elaborazione batch per un solo utente. Il computer esegue un solo programma per volta ed elabora i dati in raggruppamenti detti batch. In questi sistemi primitivi gli utenti immettevano i dati nel computer utilizzando delle schede perforate. Spesso bisognava attendere da un minimo di alcune ore a diversi giorni prima di vedere qualche risultato. In seguito furono inventati i cosiddetti sistemi operativi, allo scopo di rendere più agevole l’uso dei computer. I primi sistemi operativi gestivano la successione delle attività immesse dagli utenti e i passaggi da un’attività all’altra. In questo modo era possibile risparmiare il tempo necessario agli operatori per lanciare l’esecuzione delle attività una dopo l’altra, e di conseguenza aumentò il carico di lavoro sostenuto dai computer. Via via che i computer diventavano più potenti risultò chiaro che l’elaborazione batch per un solo utente non sfruttava pienamente le loro potenzialità. Si pensò allora che i vari processi potevano condividere le risorse del computer per utilizzarle al meglio. Da questa idea nacque la multiprogrammazione, ovvero l’elaborazione simultanea di diverse attività su uno stesso computer. Le risorse vengono condivise tra le diverse attività, via via che ciascuna di esse le richiede. Nei primi sistemi a multiprogrammazione gli utenti inserivano ancora le vecchie schede perforate, aspettando anche giorni per ottenere dei risultati. Negli anni ’60 gruppi industriali e università sperimentarono i sistemi operativi in timesharing (condivisione del tempo). Il timesharing è un caso particolare di sistema a multiprogrammazione, in cui gli utenti accedono al computer attraverso dei terminali, che sono dispositivi tipicamente composti da uno schermo e una tastiera. In un tipico sistema in timesharing possono esserci decine o anche centinaia di utenti che condividono, nello stesso momento, le risorse del computer centrale. Il computer non soddisfa simultanea- 6 CAPITOLO 1 mente tutte le richieste degli utenti, ma esegue una piccola parte delle attività di un utente, quindi passa a eseguire una piccola parte delle attività di un altro utente e così via. La velocità di esecuzione, tuttavia, è talmente elevata che il computer può tornare alla richiesta di un dato utente diverse volte in un secondo; per questo motivo i programmi degli utenti sembrano essere eseguiti tutti simultaneamente. Un vantaggio del timesharing consiste nel fatto che la richiesta di un utente viene soddisfatta quasi istantaneamente, anziché richiedere diverse ore come accadeva in precedenza. 1.5 I personal computer, i sistemi distribuiti e i sistemi client/server Nel 1977 Apple Computer rese popolari i personal computer. All’inizio si trattava soltanto di un bene di lusso destinato a una minoranza di appassionati, ma presto i computer divennero abbastanza economici da poter essere acquistati da aziende e privati. Nel 1981 IBM, leader mondiale nel campo dell’hardware, mise in commercio il Personal Computer IBM, che nel giro di pochissimo tempo divenne onnipresente in aziende, industrie e organizzazioni governative. Questi computer tuttavia erano unità singole e separate per cui, dopo avere lavorato su una macchina, era necessario trasportare le informazioni su dischetti per poterle condividere con altri. I primi personal computer non erano tanto veloci da permettere il timesharing per diversi utenti, ma tutti i computer di un’organizzazione potevano ugualmente essere collegati in rete, tramite la linea telefonica o delle reti LAN, ovvero reti locali. Questi sono stati gli albori dei sistemi distribuiti: le elaborazioni di un’organizzazione non venivano più effettuate rigorosamente su una postazione fissa, bensì venivano distribuite lungo delle reti, dove su ogni nodo era presente un computer che effettuava una parte di lavoro. Personal computer potenti come quelli di oggi potevano costare centinaia di milioni soltanto dieci anni fa. Le macchine più potenti (dette workstation) offrono prestazioni incredibili. Le informazioni vengono convogliate lungo reti telematiche, dove alcuni computer detti file server conservano le informazioni condivise: a queste informazioni accedono tanti computer detti client, sparsi su tutta la rete. Tali sistemi prendono appunto il nome di sistemi client/server. I linguaggi C e C++ sono diventati i linguaggi preferiti per la realizzazione di applicazioni per i sistemi operativi, i sistemi di rete e i sistemi distribuiti di tipo client/server; Java sta rapidamente diventando il linguaggio preferito per lo sviluppo di applicazioni basate su Internet. I sistemi operativi attualmente più utilizzati, come UNIX, Microsoft Windows e IBM OS/2 offrono i tipi di funzionalità viste in questa sezione. 1.6 I linguaggi macchina, assembly e ad alto livello I programmatori possono scrivere le istruzioni in vari linguaggi di programmazione. Alcuni linguaggi vengono compresi direttamente dai computer, mentre altri richiedono dei passaggi intermedi di traduzione. Allo stato attuale contiamo centinaia di linguaggi di programmazione diversi, che possono essere raggruppati in in tre grandi categorie: 1. Linguaggi macchina 2. Linguaggi assembly 3. Linguaggi ad alto livello INTRODUZIONE AI COMPUTER, A INTERNET E AL WEB 7 Un computer è in grado di capire soltanto il proprio linguaggio macchina, che deve essere considerato un po’ come la sua lingua naturale, in quanto è definito dalla sua progettazione hardware. In genere i linguaggi macchina consistono di stringhe numeriche (che si riducono infine a sequenze di 0 e 1) che ordinano al computer di eseguire le operazioni più elementari una alla volta. I linguaggi macchina dipendono dall’architettura del computer su cui sono stati definiti, e sono assolutamente enigmatici agli occhi di un essere umano. Se volete una prova, eccovi la sezione di un programma in linguaggio macchina che somma il salario extra al salario base e memorizza il risultato nel salario lordo: +1300042774 +1400593419 +1200274027 Con l’aumentare della popolarità dei computer ci si rese conto che continuare a programmare in linguaggio macchina era un’operazione decisamente noiosa e lenta. Anziché scrivere stringhe numeriche che i computer potevano capire direttamente, i programmatori cominciarono a far uso di abbreviazioni che rappresentavano le operazioni più elementari dei computer. Tali abbreviazioni costituirono la base dei linguaggi assembly. Parallelamente furono sviluppati dei programmi di traduzione, detti assembler, che convertivano i programmi scritti in linguaggio assembly in linguaggio macchina. Osservate ora come appare la stessa sezione del programma del salario in linguaggio assembly: LOAD BASEPAY ADD OVERPAY STORE GROSSPAY Questo codice è decisamente più chiaro per un essere umano, ma non è di nessun significato per un computer finché non viene tradotto nel suo linguaggio macchina. L’utilizzo dei computer aumentò sensibilmente con l’introduzione dei linguaggi assembly, ma in definitiva essi richiedevano ugualmente un gran numero di istruzioni per eseguire anche il compito più banale. Per velocizzare la programmazione furono allora inventati i linguaggi ad alto livello, nei quali una singola istruzione poteva eseguire compiti anche complessi. Programmi di traduzione detti compilatori convertivano poi i programmi scritti nel linguaggio ad alto livello in linguaggio macchina. I linguaggi ad alto livello consentivano di scrivere delle istruzioni che suonavano all’incirca come una normale frase in lingua inglese e che contenevano comuni operatori matematici. Ecco la versione del programma del salario in un ipotetico linguaggio ad alto livello: grossPay = basePay + overTimePay Come potete intuire, i linguaggi ad alto livello sono molto più chiari per i programmatori rispetto ai linguaggi assembly o macchina. I linguaggi C e C++ sono tra i linguaggi ad alto livello più utilizzati al giorno d’oggi. La compilazione di un programma ad alto livello in linguaggio macchina può comunque richiedere un certo tempo di elaborazione. Perciò furono anche inventati i cosiddetti interpreti, in grado di eseguire direttamente i programmi scritti in linguaggio ad alto livello senza doverli prima convertire in linguaggio macchina. Anche se i programmi compilati sono più veloci di quelli interpretati, gli interpreti sono spesso utilizzati negli ambienti di sviluppo in cui è necessario apportare continue modifiche ai programmi, così da non doverli compilare di frequente. Una volta raggiunta la versione definitiva di un programma, però, è possibile creare la sua versione compilata per avere un’efficienza migliore. 8 CAPITOLO 1 1.7 La storia del linguaggio C++ Il linguaggio C++ costituisce l’evoluzione naturale del linguaggio C, il quale a sua volta discende da altri due linguaggi, BCPL e B. Il linguaggio BCPL fu sviluppato nel 1967 da Martin Richards per scrivere programmi software destinati ai sistemi operativi e ai compilatori. Ken Thompson modellò poi molte delle caratteristiche del suo linguaggio B sulla base del BCPL, e utilizzò il B per creare le prime versioni del sistema operativo UNIX presso i Bell Laboratories nel 1970, su un computer DEC PDP-7. Sia il B che il BCPL erano linguaggi che non prevedevano tipi di dati: ogni dato occupava una parola di memoria e la responsabilità di vedere un dato come numero intero o numero reale ricadeva tutta sul programmatore. Il linguaggio C si sviluppò dal B grazie a Dennis Ritchie presso i Bell Laboratories, e fu implementato originariamente su un computer DEC PDP-11 nel 1972. Il C riprende molti concetti utili del B e del BCPL, e in più aggiunge il concetto fondamentale dei tipi di dati. Il C fu noto inizialmente come linguaggio di sviluppo del sistema operativo UNIX. Oggi la maggior parte dei sistemi operativi sono scritti in C e/o in C++. Nei due decenni alle nostre spalle il C è diventato disponibile sulla maggior parte dei computer ed è indipendente dall’hardware. Con una progettazione attenta è possibile scrivere programmi in C che possono essere eseguiti praticamente su qualsiasi tipo di computer. Alla fine degli anni ’70 il linguaggio C si è evoluto poi in quello che ora chiamiamo il “C tradizionale”, il “C classico” o il “C di Kernighan e Ritchie”. L’utilizzo del linguaggi C su diversi tipi di computer (che possiamo anche chiamare piattaforme hardware) ha portato purtroppo anche alla diffusione di molte sue varianti; la maggior parte di esse sono simili, ma spesso anche incompatibili. Ciò era visto come un problema dai programmatori, che avevano bisogno di scrivere software portabile su più piattaforme. A un certo punto si avvertì la necessità di una versione standard del linguaggio. Nel 1983 vide la luce la commissione tecnica X3J11, che faceva capo alla commissione americana per gli standard X3, con l’obiettivo di stabilire una definizione del linguaggio chiara e indipendente dall’hardware. Lo standard fu approvato nel 1989: l’organizzazione ANSI collaborò con l’organizzazione internazionale per gli standard (ISO) per standardizzare il C in tutto il mondo. Il documento congiunto per la definizione dello standard fu pubblicato nel 1990 ed è noto come ANSI/ISO 9899:1990. La seconda edizione del testo di Kernighan e Ritchie riguarda questa versione detta ANSI C: è questa la versione del linguaggio utilizzata oggi in tutto il mondo (Ke88). Il linguaggio C++, quale estensione del C, è stato sviluppato da Bjarne Stroustrup agli inizi degli anni ’80 presso i Bell Laboratories. Il linguaggio C++ offre una serie di funzionalità che potenziano il C e, cosa più importante, lo rendono un ottimo strumento per la programmazione orientata agli oggetti. La comunità del software sta attraversando un periodo di rivoluzione. Scrivere software in modo veloce, corretto ed economico rimane uno degli obiettivi più importanti, specialmente oggi che la domanda di software sempre più nuovo e potente è in crescita. Gli oggetti sono essenzialmente componenti software riutilizzabili, modellati sul mondo reale. Gli sviluppatori di software si rendono conto che una progettazione modulare e orientata agli oggetti può rendere i team di programmazione molto più produttivi rispetto al passato, quando la programmazione era strutturata. I programmi orientati agli oggetti, infatti, sono più semplici da leggere, da correggere e da modificare. INTRODUZIONE AI COMPUTER, A INTERNET E AL WEB 9 Sono stati sviluppati diversi altri linguaggi orientati agli oggetti, fra cui citiamo Smalltalk, sviluppato presso il PARC (Palo Alto Research Center) di Xerox. Smalltalk è un linguaggio “puro” orientato agli oggetti, il che significa che al suo interno esistono soltanto oggetti. Il C++ è invece un linguaggio ibrido: è possibile programmare in C++ nel vecchio stile C, nel nuovo stile orientato agli oggetti, o in entrambi. 1.8 La storia di Java Il contributo più importante della rivoluzione dei microprocessori è stato forse lo sviluppo dei personal computer, che hanno avuto un profondo impatto sulla vita delle persone, e ancora di più sull’organizzazione delle aziende. Sono in molti a credere che il prossimo settore in cui i microprocessori avranno un impatto di questo tipo sia quello dei dispositivi elettronici di uso comune. In vista di questa nuova rivoluzione, Sun Microsystems ha lanciato, nel 1991, un progetto di ricerca interno, chiamato Green. Questo progetto ha dato vita a un linguaggio basato su C e C++, inizialmente chiamato Oak dal suo creatore, James Gosling. Il nome è stato poi modificato in Java (nome di una marca di caffé) quando si è scoperto che già esisteva un linguaggio chiamato Oak. Il progetto Green ha incontrato delle difficoltà, in quanto il mercato dei dispositivi elettronici di consumo non si è sviluppato tanto rapidamente quanto Sun credeva. Fortunatamente, nel 1993 è esploso il World Wide Web e Sun ha intravisto immediatamente il potenziale di Java per creare pagine Web con i cosiddetti contenuti dinamici. Sun ha presentato ufficialmente Java nel maggio del 1995, sollevando un clamoroso interesse. Java viene attualmente utilizzato per creare pagine Web dai contenuti dinamici e interattivi, per sviluppare applicazioni aziendali su larga scala, per migliorare le funzionalità dei server World Wide Web (i computer che forniscono i contenuti che vedete con i vostri browser Web), per realizzare applicazioni destinate ai dispositivi di consumo (come telefoni cellulari e personal digital assistant) e così via. 1.9 Le librerie di classi Java I programmi Java si compongono di classi, che ha loro volta si compongono di metodi, i quali eseguono le varie attività e alla fine ritornano delle informazioni. Sebbene sia possibile programmare ogni singolo componente di un programma Java, normalmente si cerca di utilizzare l’enorme quantità di classi già esistenti, racchiuse nelle librerie di classi Java. Le librerie di classi sono conosciute anche come Java API (Application Programming Interface). Per conoscere il mondo di Java, quindi, è necessario studiare due cose: il linguaggio vero e proprio, per realizzare le proprie classi, e le librerie di classi già esistenti. Le librerie di classi sono distribuite principalmente da fornitori di compilatori, ma anche da fornitori di software indipendenti. Molte librerie di classi, comunque, sono disponibili anche in Internet, sotto forma di prodotti shareware (prodotti che è possibile scaricare dietro pagamento di un prezzo molto ridotto) o freeware (prodotti che è possibile scaricare gratuitamente). Ingegneria del software 1.1 Dove è possibile, utilizzate pezzi già esistenti: il principio del riutilizzo del software è alla base della programmazione orientata agli oggetti. 10 CAPITOLO 1 Ingegneria del software 1.2 Programmando in Java vi troverete a utilizzare generalmente i seguenti “pezzi”: classi delle librerie di classi, classi e metodi che avrete creato voi stessi e classi e metodi creati da altri. Il vantaggio di creare le proprie classi e i propri metodi è che, così facendo, si saprà sempre esattamente come funzionano; oltre a ciò, sarà possibile esaminarne il codice in qualsiasi momento. Lo svantaggio, invece, è costituito dalla quantità di tempo necessaria per progettare e sviluppare nuove classi e nuovi metodi. Obiettivo efficienza 1.1 L’utilizzo delle librerie di classi e di metodi al posto di codice scritto direttamente da voi può migliorare sensibilmente le prestazioni dei vostri programmi, in quanto queste sono state scritte con una particolare attenzione all’efficienza di esecuzione. Obiettivo portabilità 1.1 L’utilizzo di librerie di classi e di metodi al posto di codice scritto direttamente da voi può aumentare la portabilità dei vostri programmi, in quanto queste classi e questi metodi sono contenuti in quasi tutte le implementazioni Java. Ingegneria del software 1.3 Sono molte le librerie di classi contenenti componenti software riutilizzabili disponibili in Internet. Molte di queste librerie, poi, sono gratuite. 1.10 Altri linguaggi ad alto livello Sono centinaia i linguaggi ad alto livello sviluppati fino a oggi, ma soltanto pochi hanno conosciuto una vasta popolarità. Il linguaggio FORTRAN (FORmula TRANslator) fu sviluppato da IBM Corporation tra il 1954 e il 1957 per applicazioni scientifiche e ingegneristiche che richiedevano calcoli matematici complessi. Il linguaggio FORTRAN è ancora utilizzato, specialmente nel campo dell’ingegneria. Il linguaggio COBOL (Common Business Oriented Language) fu sviluppato nel 1959 da un gruppo di produttori di computer e di utenti nel campo industriale e governativo. Il linguaggio COBOL è utilizzato specialmente nelle applicazioni di tipo commerciale, dove è fondamentale la gestione efficiente di grandi quantità di dati. Attualmente, più del 50% delle applicazioni commerciali sono scritte in COBOL. Il linguaggio Pascal fu progettato più o meno negli stessi anni del C dal professor Niklaus Wirth, soprattutto per usi accademici. Parleremo più approfonditamente del linguaggio Pascal nella prossima sezione. Il linguaggio Basic fu sviluppato nel 1965 presso la Dartmouth University, con l’obiettivo di essere un linguaggio semplice per chi non sapeva nulla di programmazione. Bill Gates implementò Basic su molti dei primi personal computer e oggi Microsoft, la società creata da Bill Gates, è la prima azienda mondiale nello sviluppo software. INTRODUZIONE AI COMPUTER, A INTERNET E AL WEB 11 1.11 La programmazione strutturata Nel corso degli anni ’60 il mercato del software ha conosciuto grosse difficoltà. I progetti software venivano evasi generalmente in ritardo, i costi eccedevano di gran lunga i budget previsti e i prodotti finiti non erano poi così affidabili. Gli operatori si accorsero che la creazione di programmi software era un’attività decisamente più complessa di quanto immaginavano. L’attività di ricerca di quegli anni portò all’evoluzione della programmazione strutturata, ovvero un approccio disciplinato alla scrittura di programmi, in modo tale che questi risultassero più chiari e più semplici da collaudare e correggere. Nei capitoli 4 e 5 verranno presi in esame i principi della programmazione strutturata. Uno dei risultati più tangibili di questa ricerca fu lo sviluppo del linguaggio di programmazione Pascal, ad opera di Niklaus Wirth, nel 1971. Il linguaggio Pascal, chiamato così in onore del matematico del XVII secolo Blaise Pascal, fu progettato per insegnare la programmazione strutturata negli ambienti accademici, e divenne rapidamente il linguaggio di programmazione più utilizzato nelle università. Purtroppo il Pascal non possiede molte delle caratteristiche necessarie nelle applicazioni commerciali, industriali e governative, quindi non ha conosciuto una grossa popolarità al di fuori dell’ambito universitario. Il linguaggio Ada fu sviluppato con l’appoggio del Dipartimento della Difesa degli Stati Uniti tra la fine degli anni ’70 e l’inizio degli anni ’80. I sistemi di controllo complessi presenti presso questa organizzazione governativa necessitavano di programmi software scritti in numerosi linguaggi di programmazione, quindi si decise di sviluppare un unico linguaggio capace di soddisfare tutte esigenze del caso. Utilizzando come base il linguaggio Pascal, venne sviluppato il linguaggio Ada. Il nome Ada deriva da Lady Ada Lovelace, figlia del poeta Lord Byron. A Lady Lovelace si accredita il primo “programma” di inizio ‘800, che operava sul dispositivo meccanico analitico progettato da Charles Babbage. Una funzionalità degna di nota di Ada è il cosiddetto multitasking, ovvero la possibilità di svolgere più attività in esecuzione parallela. Gli altri linguaggi ad alto livello di uso comune, compresi C e C++, consentono generalmente ai programmatori di eseguire una sola attività per volta. Java, invece, attraverso una tecnica chiamata multithreading, consente ai programmatori di realizzare programmi con attività parallele. 1.12 Internet e il World Wide Web Internet è stato sviluppato circa trent’anni fa con l’appoggio del Dipartimento della Difesa degli Stati Uniti. In origine fu progettato per collegare i sistemi informativi centrali di una dozzina di università e organizzazioni di ricerca, ma oggi è diventato accessibile a centinaia di milioni di computer sparsi in tutto il mondo. Con l’introduzione del World Wide Web, che permette ai computer di trovare e visualizzare documenti multimediali riguardanti ogni tipo di argomento, Internet è letteralmente esploso in ciò che diventerà sicuramente il principale strumento di comunicazione a livello mondiale. Internet e il World Wide Web possono sicuramente essere considerati tra le più importanti creazioni dell’uomo. In passato, la maggior parte delle applicazioni informatiche venivano eseguite su computer che non erano collegati l’uno con l’altro; le applicazioni attuali, invece, possono essere scritte per comunicare con le centinaia di milioni di computer presenti nel mondo. 12 CAPITOLO 1 Internet riunisce varie tecnologie informatiche e di comunicazione, rendendo la vita e il lavoro di tutti molto più semplice. Le informazioni sono accessibili a tutti immediatamente e in tutto il mondo; singoli individui e piccole e grandi imprese acquistano visibilità mondiale; tutti possono cercare il miglior prezzo di ogni tipo di prodotto; le varie comunità sparse per il mondo possono rimanere in contatto le une con le altre; i ricercatori vengono a conoscenza immediatamente delle scoperte fatte da altri, e così via. Questo libro presenta vari capitoli riguardanti le tecniche di programmazione che permettono alle applicazioni Java di usare Internet e il World Wide Web per interagire con altre applicazioni e con i database. Queste funzionalità consentono ai programmatori Java di sviluppare applicazioni aziendali di tipo distribuito, che possono essere eseguite su qualsiasi piattaforma informatica, producendo sostanziali risparmi di tempo e costi. Per chi è interessato allo sviluppo di applicazioni da eseguire in Internet e sul Web, l’apprendimento di Java può rappresentare l’inizio di una carriera fatta di molte opportunità. 1.13 Gli elementi fondamentali di un tipico ambiente Java I sistemi Java si compongono generalmente di diverse parti: un ambiente di sviluppo, il linguaggio, la Java Application Programming Interface (API) e varie librerie di classi. Nei seguenti paragrafi viene preso in esame un tipico ambiente di sviluppo Java, illustrato nella figura 1.1. All’interno di un sistema UNIX, Windows 95/98 o Windows NT, prima di arrivare all’esecuzione, un programma Java attraversa generalmente cinque fasi (figura 1.1): scrittura/modifica, compilazione, caricamento, verifica ed esecuzione. La prima fase è quella della scrittura/modifica di un file. Allo scopo si utilizza un programma detto editor. Un programmatore scrive il proprio programma con l’editor e lo modifica se necessario. Il programma viene successivamente salvato su un’unità di memorizzazione secondaria, come per esempio il disco rigido. I nomi dei file dei programmi Java terminano generalmente con l’estensione .java . I due editor più utilizzati in ambiente UNIX sono vi e emacs. Nel caso di Windows 95/98 e Windows NT, invece, sono sufficienti dei semplici programmi di editing come il comando DOS Edit o Windows NotePad. Gli ambienti di sviluppo integrati di Java (integrated development environment, EDI) come per esempio NetBeans, JBuilder di Borland, Visual Cafè di Symantec e Microsoft Visual J++ possiedono degli editor incorporati che possono essere facilmente integrati nell’ambiente di programmazione. [Nota: NetBeans IDE è scritto in Java ed è disponibile gratuitamente per gli usi non commerciali. Si trova sul CD-ROM che accompagna questo libro, oppure può essere scaricato da: http://www.netbeans.com NetBeans può essere eseguito sulle piattaforme più importanti. Questo libro è stato scritto per qualsiasi ambiente di sviluppo Java 2 e non è legato in particolar modo a NetBeans. I programmi di esempio dovrebbero operare correttamente nella maggior parte degli ambienti di sviluppo integrati Java.] INTRODUZIONE AI COMPUTER, A INTERNET E AL WEB 13 Dopo averlo scritto, è necessario compilare il programma, attraverso il comando javac. Il compilatore Java converte il codice Java in bytecode, ovvero il linguaggio compreso dall’interprete Java. Per compilare un programma chiamato Welcome.java, per esempio, è necessario digitare il seguente comando: javac Welcome.java nella finestra dei comandi del vostro sistema (ovvero il prompt MS-DOS nel caso di Windows 95/98 e Windows NT e il prompt shell nel caso di UNIX). Se il programma è stato compilato correttamente, viene prodotto un file chiamato Welcome.class; questo è il file che contiene i bytecode che verranno interpretati durante la fase di esecuzione. La fase successiva è la fase del caricamento. Prima che un programma possa essere eseguito deve essere portato nella memoria. È il loader (o caricatore delle classi) che prende il file .class (o i file) contenente i bytecode e lo trasferisce nella memoria. Il file .class può essere caricato da un disco sul sistema o da una rete. Sono due i tipi di programmi per i quali il caricatore delle classi carica i file .class: le applicazioni e le applet. Un’applicazione è un programma che viene normalmente conservato e eseguito sul computer locale dell’utente, mentre un’applet è un piccolo programma che viene normalmente conservato su un computer remoto al quale gli utenti si collegano attraverso un browser Web. Le applet vengono caricate da un computer remoto nel browser, vengono eseguiti nel browser e poi vengono eliminati quando l’esecuzione è stata completata. Per eseguire nuovamente un’applet, l’utente deve puntare il browser al relativo indirizzo sul World Wide Web e ricaricare il programma nel browser. Le applicazioni vengono caricate in memoria ed eseguite usando l’interprete Java, attraverso il comando java. Durante l’esecuzione di un’applicazione Java chiamata Welcome, il comando java Welcome invoca l’interprete per l’applicazione Welcome e fa in modo che il caricatore delle classi carichi le informazioni utilizzate nel programma Welcome. Il loader viene eseguito anche quando un applet Java viene caricata in un browser Web (come per esempio Netscape Communicator, Microsoft Internet Explorer o Sun HotJava). I browser sono utilizzati per visualizzare documenti HTML (Hypertext Markup Language), un formato usato per i documenti Web e facilmente compreso dai browser. Un documento HTML può essere collegato a un’applet Java; quando il browser vede il riferimento a un’applet in un documento HTML, lancia il caricatore delle classi Java affinché carichi l’applet (normalmente dall’indirizzo in cui si trova il documento). I browser che supportano Java possiedono tutti un interprete Java incorporato; una volta caricata l’applet, l’interprete Java lo esegue. Le applet possono anche essere eseguite dalla riga comandi per mezzo del comando appletviewer fornito dal J2SDK (l’insieme di strumenti che comprende il compilatore javac, l’interprete appletviewer e altri strumenti utilizzati dai programmatori Java). Come nel caso di Netscape Communicator, Internet Explorer e HotJava, anche appletviewer richiede un documento HTML per invocare un’applet. Per esempio, se il file Welcome.html si riferisce all’applet Welcome, il comando appletviewer viene usato nel seguente modo: appletviewer Welcome.html 14 CAPITOLO 1 Fase 1 Editor Disco Il programma viene creato nell'editor e memorizzato sul disco. Fase 2 Compilatore Disco Il compilatore crea i bytecode e li memorizza sul disco. Memoria primaria Fase 3 Caricatore Il caricatore delle classi mette i bytecode in memoria. Disco Fase 4 Analizzatore bytecode . . . Memoria primaria L'analizzatore di bytecode conferma che tutti i bytecode siano validi e rispettino le regole di sicurezza di Java. . . . Memoria primaria Fase 5 Interprete . . . Figura 1.1 Un tipico ambiente Java L'interprete legge i bytecode e li traduce in un linguaggio che il computer è in grado di comprendere, possibilmente memorizzando i valori dei dati mentre il programma viene eseguito. INTRODUZIONE AI COMPUTER, A INTERNET E AL WEB 15 Così facendo, il caricatore delle classi carica le informazioni utilizzate nell’applet Welcome. L’appletviewer viene comunemente definito come il browser minimo, in quanto conosce soltanto come interpretare le applet. Prima che i bytecode di un’applet vengano eseguiti dall’interprete Java del browser o dall’appletviewer, devono essere analizzati dall’analizzatore di bytecode (questo avviene anche nel caso delle applicazioni che scaricano bytecode da una rete). In questo modo si garantisce che i bytecode delle classi scaricate da Internet siano validi e rispettino le norme di sicurezza di Java. Java prevede infatti regole molto severe nell’ambito della sicurezza, affinché i programmi Java provenienti dalla rete non possano causare danni ai file e ai sistemi, come invece avviene con i virus. Nella quinta e ultima fase, il computer, sotto il controllo della CPU, interpreta il programma un bytecode per volta, eseguendo tutte le azioni previste dal programma stesso. Non sempre i programmi funzionano al primo colpo. Ciascuna delle fasi che abbiamo descritto può fallire a causa di diversi tipi di errori. Per esempio, un programma può tentare una divisione per zero, operazione che non è consentita in informatica come in matematica; in questi casi, il computer segnala un errore tramite un apposito messaggio. Il programmatore deve quindi tornare alla fase di scrittura/modifica per correggere l’errore, e poi ripetere tutte le fasi successive e determinare se il programma ora funziona correttamente. Errore tipico 1.1 Errori come la divisione per zero si verificano in fase di esecuzione del programma, e sono detti perciò errori di run-time o di esecuzione. La divisione per zero è generalmente un errore fatale, ovvero fa terminare immediatamente l’esecuzione del programma. Gli errori non fatali, invece, consentono al programma di completare il proprio lavoro, anche se spesso i risultati non sono corretti. Nota: in alcuni sistemi la divisione per zero non è un errore fatale. Per maggiori informazioni, consultate la documentazione relativa al vostro sistema. La maggior parte dei programmi riceve dati in input e/o ne invia in output. Quando diciamo che un programma mostra (o visualizza) un risultato, intendiamo generalmente dire che lo visualizza sullo schermo. I dati, però, possono essere inviati in output anche su altri dispositivi, come i dischi o le stampanti. 1.14 Alcune considerazioni generiche su Java e su questo libro Java è un linguaggio molto potente. I programmatori più esperti si vantano a volte di scrivere il codice più contorto, oscuro e strano possibile; non si tratta di una pratica molto intelligente, in quanto i programmi risultano poi difficili da leggere e spesso assumono comportamenti inspiegabili, per non parlare della difficoltà di correggere eventuali errori o effettuare qualche piccola modifica. Questo libro si rivolge ai principianti, per cui porremo sempre l’accento sulla chiarezza. Quella che segue è la nostra prima nota Buona abitudine: 16 CAPITOLO 1 Buona abitudine 1.1 Scrivete i vostri programmi Java in modo semplice e diretto. In inglese questa pratica viene denominata KIS (keep it simple: non complicatevi la vita!). Non forzate le caratteristiche del linguaggio per creare del codice complesso e bizzarro. Nel testo includeremo diverse note di questo tipo per aiutarvi ad acquisire buone abitudini di programmazione, che vi consentano di scrivere codice chiaro, leggibile e semplice da mantenere e da correggere. Tutto ciò che possiamo darvi è qualche linea guida, ma con la pratica svilupperete senz’altro il vostro stile personale di programmazione. Evidenzieremo ogni tanto anche alcuni comuni errori di programmazione, alcuni problemi relativi alle prestazioni (per scrivere programmi più veloci e che utilizzino meno memoria), alcune questioni relative alla portabilità (perché i vostri programmi possano essere eseguiti sulla maggior parte di sistemi possibili), alcune problematiche relative allo sviluppo del software (per scrivere programmi ben strutturati) e infine alcuni problemi relativi alla verifica e al debugging dei programmi (per individuare e correggere eventuali errori). Abbiamo già detto che Java è un linguaggio portabile, in grado di essere eseguito su una moltitudine di sistemi differenti. La portabilità, però, è spesso un obiettivo difficile da raggiungere. Il documento dello standard ANSI C (An90) contiene una lunga lista di problematiche relative alla portabilità. Obiettivo portabilità 1.2 Anche se è più facile scrivere programmi portabili con Java, rispetto alla maggior parte degli altri linguaggi di programmazione, ci sono delle diversità tra i vari compilatori, interpreti e computer, che possono rendere la portabilità un obiettivo difficile da raggiungere. Il solo fatto di utilizzare Java non garantisce la portabilità di un programma; spesso il programmatore dovrà gestire direttamente il problema delle differenze tra sistemi e tra compilatori. Collaudo e messa a punto 1.1 Testate sempre i vostri programmi Java su tutti i sistemi su cui avete intenzione di eseguirli. Java è un linguaggio estremamente ricco, e questo libro non copre alcuni degli aspetti minori che lo riguardano. Per ulteriori informazioni su Java, il consiglio è quello di consultare la documentazione Java più recente, disponibile in Internet all’indirizzo http:// java.sun.com. Buona abitudine 1.2 Leggete la documentazione relativa alla versione di Java che state utilizzando. Fate spesso riferimento a questa documentazione per assicurarvi di utilizzare correttamente e al meglio le caratteristiche di Java. Buona abitudine 1.3 Il vostro computer e il vostro compilatore saranno i vostri migliori insegnanti. Se non vi sentite sicuri anche dopo aver letto la documentazione Java, il consiglio è quello di fare dei piccoli esperimenti e vedere cosa accade. Impostate il compilatore in modo tale che INTRODUZIONE AI COMPUTER, A INTERNET E AL WEB 17 segnali il maggior numero di avvertimenti e messaggi di errore. Potrete poi studiare ogni messaggio e correggere i vostri programmi di conseguenza. Con i primi sistemi Java, erano disponibili soltanto degli interpreti Java per eseguire i bytecode sui computer client; oggi, però, sono disponibili compilatori Java per le principali piattaforme. Questi compilatori prendono i bytecode Java (o, in alcuni casi, il codice sorgente Java) e li compilano in codice macchina nativo sul computer client. Dato che non ci sono compilatori per ogni piattaforma Java, però, i programmi Java non verranno eseguiti con lo stesso livello di prestazioni su tutte le piattaforme. Obiettivo efficienza 1.2 Gli interpreti hanno un vantaggio rispetto ai compilatori, ovvero che un programma interpretato può iniziare l’esecuzione immediatamente dopo essere stato scaricato sul computer client, mentre un programma sorgente da compilare richiede del tempo prima di poter essere eseguito. Le applet presentano aspetti ancor più interessanti. Ricordate che un’applet può arrivare praticamente da un qualsiasi server Web sparso per il mondo, quindi dovrà essere in grado di essere eseguita su qualsiasi piattaforma Java. Nel caso delle applet Java di piccole dimensioni, non ci sono particolari problemi per la loro interpretazione, ma nel caso delle applet più complesse il discorso cambia. In questi casi, infatti, l’utente potrebbe preferire attendere il tempo necessario per la compilazione al fine di avere migliori prestazioni in fase di esecuzione. Un passaggio intermedio tra gli interpreti e i compilatori è il compilatore just-in-time (JIT) che, mentre viene eseguito l’interprete, produce del codice compilato per i programmi, eseguendoli in linguaggio macchina anziché reinterpretarli. I compilatori JIT, però, non producono del linguaggio macchina efficiente quanto un compilatore vero e proprio. Dei compilatori Java completi sono attualmente in fase di sviluppo. Per ulteriori informazioni circa la traduzione dei programmi Java, potete visitare il sito http://java.sun.com/products/hotspot/ Nel caso delle aziende che desiderano sviluppare sistemi informativi, gli Integrated Development Environment (IDE) sono disponibili presso i maggiori fornitori di software. Gli IDE offrono molti strumenti per il supporto del processo di sviluppo dei programmi software. Molti degli IDE Java attualmente sul mercato sono potenti tanto quanto quelli disponibili per lo sviluppo di sistemi C e C++. Lo standard Java Database Connectivity (JDBC) di Sun è destinato a coloro che vogliono sviluppare applicazioni di database a livello aziendale. JDBC permette infatti di utilizzare Java nello sviluppo di sistemi informativi aziendali. 1.15 Una panoramica del libro In questa sezione vengono presentati i vari capitoli che compongono questo libro. Capitolo 1: Introduzione ai computer, a Internet e al World Wide Web Nel capitolo 1 vengono presentate alcune informazioni di carattere storico sui computer e la programmazione, oltre a informazioni introduttive su Java, Internet e il World Wide 18 CAPITOLO 1 Web. Viene inoltre offerta una panoramica degli strumenti forniti con il Java 2 Software Development Kit (J2SDK). Capitolo 2: Introduzione alle applicazioni Java Nel capitolo 2, vengono presentati i primi programmi Java. Il libro presenta ogni concetto nell’ambito di un programma Java vero e proprio, immediatamente seguito dall’output che il programma produce sullo schermo. Con Java è possibile scrivere due tipi di programmi: le applet e le applicazioni. Questo capitolo prende in esame le applicazioni, insegnandovi come scrivere applicazioni Java in grado di visualizzare delle informazioni sullo schermo e in grado di ricevere informazioni da parte dell’utente attraverso la tastiera. Capitolo 3: Introduzione alle applet Java Nel capitolo 3 vengono presentate le applet, riprendendo alcuni degli esempi del capitolo 2 per mostrare la differenza tra i due diversi approcci di programmazione. Nei primi capitoli del libro vengono presentate varie applet ma, una volta appresi i concetti fondamentali di Java, si passerà allo sviluppo di applicazioni. Nei capitoli 2 e 3 vengono introdotti vari componenti GUI (graphical user interface), che verranno poi ripresi nei capitoli 2 e 3 del volume Tecniche avanzate di programmazione, un naturale complemento a questo libro. Capitolo 4: Le strutture di controllo: Parte 1 Nel capitolo 4, viene preso in esame il processo di sviluppo dei programmi. Il capitolo mostra come sia possibile, partendo dall’esposizione di un problema, sviluppare un programma Java perfettamente funzionante. Il capitolo introduce alcuni dei tipi di dati più importanti e alcune semplici strutture di controllo che permettono al programma di prendere delle decisioni. Capitolo 5: Le strutture di controllo: Parte 2 Il capitolo 5 prende in esame le similitudini tra Java e C, specialmente nell’ambito delle strutture di controllo iterative, di selezione e sequenziali. Il capitolo utilizza dei diagrammi di flusso per mostrare ognuna delle strutture di controllo. Il capitolo si conclude con un riassunto della programmazione strutturata, dove vengono elencate tutte le strutture di controllo. Le tecniche discusse nei capitoli 4 e 5 costituiscono gran parte di ciò che è stato tradizionalmente insegnato nelle università nell’ambito della programmazione strutturata. La programmazione Java, invece, è orientata agli oggetti; il capitolo mostrerà come anche gli oggetti facciano uso delle strutture di controllo. Capitolo 6: I metodi Nel capitolo 6 vengono presi in esame più attentamente gli oggetti. Gli oggetti contengono dei dati (normalmente chiamati variabili di istanza) e delle unità eseguibili chiamate metodi (spesso chiamate funzioni nei linguaggi procedurali come il C). Parleremo dettagliatamente dei metodi e dei metodi ricorsivi (ovvero i metodi che chiamano sé stessi). Verrà ripresa la discussione delle interfacce utente grafiche (GUI) per mostrare come sia possibile creare pulsanti e campi di testo, aggiungendoli alle applet. Verrà presentata inoltre la programmazione guidata dagli eventi, dove un programma esegue delle attività in risposta all’interazione dell’utente con i componenti GUI. Le tecniche GUI introdotte in questo capitolo verranno utilizzate nelle applicazioni a partire dal capitolo 9. INTRODUZIONE AI COMPUTER, A INTERNET E AL WEB 19 Capitolo 7: Gli array Il capitolo 7 prende in esame l’elaborazione dei dati all’interno di elenchi e tabelle di valori chiamate array. In Java, gli array vengono elaborati come oggetti. Capitolo 8: La programmazione basata su oggetti Il capitolo 8 si concentra sul concetto di oggetti. Cos’è un oggetto? Cos’è una classe di oggetti? Com’è l’interno di un oggetto? Come vengono creati gli oggetti? Come vengono distrutti? Come comunicano tra di loro gli oggetti? Perché le classi sono il meccanismo migliore per creare dei componenti riutilizzabili? In questo capitolo inizieremo a definire le applicazioni che vengono eseguite nelle proprie finestre, con un’ampia varietà di componenti GUI aggiunti a queste finestre. Capitolo 9: La programmazione orientata agli oggetti Il capitolo 9 prende in esame le relazioni tra le classi di oggetti e la programmazione con queste classi. Come sfruttare le classi di oggetti per ridurre la mole di lavoro necessaria per realizzare sistemi software di grandi dimensioni? Cosa significa “programmare in generale” e cosa, invece, “programmare nello specifico”? Come può la programmazione generale semplificare la modifica dei sistemi software e l’aggiunta di nuove caratteristiche? Come è possibile programmare un’intera categoria di oggetti anziché programmare individualmente ogni tipo di oggetto? Questo capitolo introduce le applicazioni che vengono eseguite nelle proprie finestre (JFrame); queste applicazioni possiedono la propria interfaccia utente grafica (progettata dal programmatore). In questo contesto, il capitolo presenta le classi interne e continua con la discussione della gestione degli eventi. Capitolo 10: Stringhe e caratteri Il capitolo 10 prende in esame l’elaborazione di parole, frasi, caratteri e gruppi di caratteri. La differenza principale tra Java e C è che le stringhe Java sono degli oggetti, la cui manipolazione è quindi molto più semplice e sicura rispetto al linguaggio C. Aspetti più avanzati del linguaggio Java vengono presentati nel volume Tecniche avanzate di programmazione, naturale complemento al testo introduttivo che state leggendo. Esercizi di autovalutazione 1.1 Completate le seguenti frasi: a) La società che ha reso popolari i personal computer è stata _____________. b) Uno dei primi computer introdotti nelle aziende e nelle industrie è stato _____________. c) I computer elaborano i dati sotto il controllo di insiemi di istruzioni chiamati _____________. d) Le sei unità logiche principali di un computer sono _____________, _____________, _____________, _____________, _____________ e _____________. e) Le tre classi di linguaggi introdotte in questo capitolo sono _____________, _____________, _____________. f ) I programmi che convertono i programmi scritti in linguaggi ad alto livello in linguaggio macchina si chiamano _____________. g) Il linguaggio _____________ è stato sviluppato da Wirth per l’insegnamento della programmazione strutturata nelle Università. 20 CAPITOLO 1 h) Il Dipartimento della difesa degli Stati Uniti sviluppò il linguaggio Ada, con una funzionalità chiamata _____________, che consente ai programmatori di specificare più di un’attività da eseguire in parallelo. 1.2 Completate le seguenti frasi riguardanti l’ambiente Java. a) Il comando _____________ del Java 2 Software Development Kit esegue un’applet Java. b) Il comando _____________ del Java 2 Software Development Kit esegue un’applicazione Java. c) Il comando _____________ del Java 2 Software Development Kit compila un programma Java. d) Per invocare un’applet Java è necessario un file _____________. e) Un file di programma Java deve terminare con l’estensione _____________. f ) Quando un programma Java viene compilato, il file prodotto dal compilatore termina con l’estensione _____________. g) Il file prodotto dal compilatore Java contiene dei _____________ che vengono interpretati per eseguire un’applet o un’applicazione Java. 1.3 Completate le seguenti frasi, relative alle sezioni 1.12 e 1.15. a) Il _____________ permette agli utenti dei computer di trovare e visualizzare documenti multimediali riguardanti qualsiasi argomento. b) Le _____________ Java sono normalmente memorizzate sul computer e sono progettate per essere eseguite indipendentemente rispetto ai browser Web. c) Elenchi e tabelle di valori sono chiamati _____________. d) Il _____________ permette a un’applet o applicazione di eseguire più attività in parallelo. e) _____________ consente di accedere ai database relazionali. Risposte agli esercizi di autovalutazione 1.1 a) Apple. b) IBM Personal Computer. c) programmi. d) unità di input, unità di output, unità di memoria, unità aritmetico-logica, unità centrale di elaborazione, unità di memorizzazione secondaria. e) linguaggi macchina, linguaggi assembly, linguaggi ad alto livello. f ) compilatori. g) Pascal. h) multitasking. 1.2 a) appletviewer. b) java. c) javac. d) HTML. e) .java. f ) .class. g) bytecode. 1.3 a) World Wide Web. b) applicazioni. c) array. d) multithreading. e) JDBC. Esercizi 1.4 Suddividete le seguenti voci in hardware o software. a) CPU b) Compilatore Java c) ALU d) Interprete Java e) unità di input f ) programma editor 1.5 Per quali motivi si preferisce scrivere un programma in un linguaggio indipendente dalla macchina, anziché in uno dipendente? Per quali motivi un linguaggio dipendente dalla macchina può rivelarsi più appropriato per alcuni tipi di programmi? INTRODUZIONE AI COMPUTER, A INTERNET E AL WEB 1.6 21 Completate le seguenti frasi. a) Quale unità logica di un computer riceve i dati dall’esterno? _____________. b) Il procedimento con cui si ordina al computer di risolvere un problema specifico è detto ____________. c) Che tipo di linguaggio di programmazione utilizza delle abbreviazioni di termini inglesi come istruzioni? _____________. d) Qual è l’unità logica del computer che invia i dati che sono stati elaborati alle varie periferiche, in modo che possano essere utilizzati all’esterno del computer? _____________. e) Qual è l’unità logica del computer che conserva le informazioni? _____________. f ) Qual è l’unità logica del computer che esegue i calcoli? _____________. g) Qual è l’unità logica del computer che prende le decisioni logiche ? _____________. h) Il livello di linguaggio più conveniente per la scrittura delle applicazioni, in termini di velocità e di semplicità, è _____________. i) L’unico linguaggio che un computer comprende direttamente è il suo _____________. j) Qual è l’unità logica del computer che coordina le attività di tutte le altre unità? _____________. 1.7 Qual è la differenza tra un errore fatale e un errore non fatale? Perché dovrebbe essere meglio incontrare un errore fatale piuttosto che un errore non fatale? 1.8 Completate le seguenti frasi, relative alle sezioni 1.12 e 1.15. a) Le _____________ Java sono progettate per essere portate in Internet ed eseguite nei browser Web. b) La programmazione _____________ fa in modo che un programma esegua un’attività in risposta all’interazione dell’utente con i componenti dell’interfaccia utente grafica (GUI).