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 L’evoluzione 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).