Il 0% ha trovato utile questo documento (0 voti)
7 visualizzazioni

Java Cap1

Caricato da

mapoxe1059
Copyright
© © All Rights Reserved
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Il 0% ha trovato utile questo documento (0 voti)
7 visualizzazioni

Java Cap1

Caricato da

mapoxe1059
Copyright
© © All Rights Reserved
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Sei sulla pagina 1/ 7

CAPITOLO 1 – UN NUOVO LINGUAGGIO DI PROGRAMMAZIONE: JAVA

1. Perché un nuovo linguaggio di programmazione?


Quando uno studente deve affrontare lo studio di un nuovo linguaggio di programmazione, ad un possibile
senso di curiosità quasi certamente si aggiunge una sensazione di fastidio, se non di frustrazione. “Ho
imparato il linguaggio C, con esso so fare programmi anche piuttosto complessi, ora con un nuovo
linguaggio dovrò tornare a fare programmi semplici, mi verrà spontaneo usare i costrutti e le parole chiave
del C, che però non saranno valide in questo linguaggio: insomma, mi dovrò sforzare di non fare quello che
so già fare bene! Dove sta il vantaggio?”

Può consolare il fatto che questo stesso senso di frustrazione lo hanno


provato milioni di programmatori che nel 1995 dovettero iniziare a studiare
questo nuovo linguaggio, appena sviluppato dalla Sun Microsystems da un
informatico di nome James Gosling. In realtà questo linguaggio non è nato
dal nulla, ma è il risultato di un ulteriore sviluppo di elementi di altri
linguaggi (in particolare il C, il Simula ed il C++: questo secondo è
un’evoluzione del linguaggio C che introduce la programmazione ad
oggetti, elemento fondante del linguaggio Java). Ci sono diversi motivi per
cui questo linguaggio ha avuto un successo così ampio ed immediato, ma il
principale di questi è che con esso è possibile sviluppare facilmente applicazioni orientate al web. Nel 2010
il marchio Java è stato acquisito dalla Oracle.

Dunque il passaggio da un linguaggio di programmazione di generazione precedente, come il C, ad un


linguaggio di programmazione di generazione successiva, come il Java, storicamente è stato causato da
questioni di opportunità e necessità: opportunità, nel senso che il linguaggio Java per molti versi è “più
semplice” del linguaggio C; necessità, nel senso che Java permette di realizzare applicazioni che con il
linguaggio C non si possono realizzare. Spiegheremo tra poco nel dettaglio tutti questi aspetti, facendo un
confronto tra le caratteristiche del C e del Java. Concludiamo questo prima riflessione dicendo che, proprio
perché il Java ha come “antenato” il C, molti costrutti base del linguaggio e molte operazioni si scrivono in
Java in modo identico a come si scrivono in C: l’assegnazione, alcune dichiarazioni, i cicli for, while, do-
while, la struttura delle dichiarazioni e delle chiamate di funzione. Questo, per un bravo programmatore
C che deve iniziare a studiare il Java è già una buona consolazione…

Dalla quercia alla tazzina di caffè - L’attività della scrittura del codice non lascia molto spazio alla
fantasia dei programmatori. Fatta eccezione per poche cose, come i nomi delle variabili e delle funzioni,
il resto del codice ha sempre parole chiave e costrutti obbligati in modo rigido dalla sintassi. Un’altra
delle cose su cui i programmatori possono dare sfogo alla fantasia è il nome da dare ad un linguaggio:
se il linguaggio C non ha un nome particolarmente fantasioso (il suo predecessore è il linguaggio B…), la
storia del nome del Java è più interessante. Originariamente il nome che Gosling diede a questo
linguaggio fu Oak, che significa quercia: infatti dalla finestra del suo ufficio Gosling vedeva proprio una
bella quercia. Purtroppo Oak era già il nome di un altro linguaggio, per cui Gosling decise di cambiare il
nome in Java. Java è una qualità di caffè proveniente dall’omonima isola indonesiana, quello che veniva
servito nel bar frequentato da Gosling e i suoi colleghi e nel quale avvenivano le discussioni sulle
caratteristiche del linguaggio che stava nascendo. Se si osserva un file prodotto in Java, si può notare
che il suo magic number (la sequenza di byte identificativa del tipo di file) è in esadecimale 0xCAFEBABE.
1
Corso di Informatica 2 – Francesco De Vincenzi

2. Linguaggi C e Java a confronto


Per iniziare a conoscere il linguaggio Java e scoprire le motivazioni della sua diffusione, mettiamolo a
confronto con il linguaggio C.

JAVA è un linguaggio di ALTO LIVELLO

Una delle caratteristiche che si voleva dare al linguaggio Java era quello di essere “più semplice”.
Scopriremo che il Java non è affatto semplice, nel senso che ha un’infinità di estensioni, librerie, strumenti
e di conseguenza può essere utilizzato in innumerevoli situazioni e campi di applicazione. Ma Java avrebbe
dovuto essere più intuitivo, contenere meno tecnicismi ed essere più vicino al modo di pensare di un essere
umano. Se pensiamo ai vari aspetti di un linguaggio di programmazione in relazione alla loro vicinanza o
lontananza rispetto all’effettivo funzionamento di un calcolatore, metteremmo il C più in basso ed il Java
più in alto: il C consente al programmatore di fare operazioni che hanno una azione diretta su processore e
Ram: si pensi ai puntatori, che permettono di accedere a una posizione della memoria indicandone il valore
oppure si pensi all’istruzione GOTO (che è tanto sconsigliata, ma in C comunque esiste) per saltare
direttamente ad un punto di un programma, quindi cambiare di fatto il valore del Program Counter senza
passare per una istruzione controllo e di salto condizionato. Java non consente al programmatore di fare
queste operazioni (i puntatori in realtà ci sono, come scopriremo, ma sono “nascosti” al programmatore e
soprattutto su di essi non sono permesse operazioni aritmetiche. Viceversa il Java, come vedremo, è un
linguaggio orientato agli oggetti (da cui la sigla OOP, Object Oriented Programming), il che significa che il
programmatore è invitato a organizzare il suo programma ragionando sugli elementi che lo compongono
pensandoli come oggetti, concreti o astratti, così come li osserva nella realtà: una persona, un tavolo, un
contenitore, un contratto di lavoro, una bicicletta, una partita di calcio…

Il concetto che stiamo analizzando si chiama astrazione: l’astrazione è una proprietà che indica il livello di
vicinanza o lontananza di un pensiero logico rispetto alla sua realtà fisica. Facciamo un esempio: un
programmatore deve realizzare un programma per la gestione degli acquisti di merce in un negozio. Se il
programmatore ragiona in termini di byte che vengono manipolati dal processore, è a livello di astrazione
basso; se invece ragiona pensando all’ insieme delle merci e alle persone le quali acquistano dei beni, è a
livello di astrazione alto.

Questo schema mostra come mettere in scala vari linguaggi di programmazione in base al loro livello di
astrazione; per ogni linguaggio c’è un frammento di codice esemplificativo:
Livelli di astrazione

Linguaggio Java cliente.acquista(borsa);

Linguaggio C int a=10; if(a==20) a--;

Linguaggio Assembly ADD AX,05 INC BX

Linguaggio macchina 11010110 01011001 …


2
Corso di Informatica 2 – Francesco De Vincenzi

JAVA è un linguaggio ORIENTATO AGLI OGGETTI

Ciascun linguaggio ha un insieme di strumenti che il programmatore può usare per realizzare il proprio
codice. Il C, ad esempio, ha i tipi (short, int…), i puntatori, le strutture dati (array, struct,…) le funzioni, e così
via. Quelli sono gli strumenti base che il programmatore tiene a mente quando si accinge a realizzare un
programma. Avendo questi strumenti, il programmatore sarà indotto ad organizzare il programma in una
determinata maniera, che sarebbe stata diversa con altri linguaggi ed altri strumenti. Questo concetto
viene indicato col termine paradigma di un linguaggio di programmazione.

Paradigma di un linguaggio di programmazione – Per paradigma di un linguaggio di programmazione si


intende l’insieme di strumenti concettuali messi a disposizione dal linguaggio e attraverso i quali il
programmatore può concepire il programma stesso. Il paradigma induce ad uno stile di programmazione.

Esistono molti paradigmi diversi, i quali hanno avuto più o meno fortuna nel corso degli anni: alcuni sono
più specifici per determinati settori della programmazione, altri più general purpose, come quello del C.
Vediamo in questa tabella i più comuni paradigmi:

Anni Paradigma Es. linguaggi Caratteristiche


1960 Procedurale Fortran Il programmatore crea blocchi di codice sorgente a cui dà un
nome: a seconda dei contesti questi vengono chiamati
sottoprogrammi, procedure o funzioni.
1970 Strutturato C Il programmatore utilizza le strutture di controllo: sequenza,
scelta, iterazione. Questo paradigma include anche i concetti
del paradigma procedurale.
1970 Logico Prolog Il programmatore organizza la realtà da codificare definendo
un insieme di affermazioni logiche (booleane). L’esecuzione di
un programma produce come output le “conseguenze logiche”
delle affermazioni inserite. Questo paradigma chiede al
programmatore di descrivere non il procedimento risolutivo
ma i fatti: cosa è vero e cosa è falso; non il “come risolvere ”,
ma il “cosa c’è”.
1970 Funzionale Lisp Il programmatore scrive un insieme di funzioni matematiche.
L’esecuzione del programma consiste nella valutazione delle
funzioni stesse.
1980 Ad oggetti Java Il programmatore organizza il problema identificando gli
“oggetti” che ne fanno parte; in esecuzione questi oggetti
interagiscono tra di loro scambiandosi messaggi al fine di
risolvere il problema in questione.
1990 Ad eventi Javascript Il programmatore prepara blocchi di codice che vengono
attivati al verificarsi di eventi (interazione dell’utente con
mouse, tastiera, arrivo di un pacchetto dati dalla rete). Il
programma è concepito con un insieme di applicazioni che
silenziosamente restano vigili in attesa di eventi e si attivano al
loro verificarsi. E’ un paradigma adatto ad applicazioni real-
time e interfacce grafiche.

Dunque, Java è un linguaggio orientato agli oggetti. Tale paradigma è spesso indicato con la sigla OOP, che
sta per Object Oriented Programming. Per studiare le caratteristiche di questo paradigma dedicheremo
diversi capitoli.
3
Corso di Informatica 2 – Francesco De Vincenzi

JAVA è un linguaggio modulare

Un programma scritto in C consiste in generale di un listato unico: dopo aver importato le varie librerie, il
programmatore scrive tutte le funzioni di cui ha bisogno, per poi terminare col programma principale. Tutto
il programma viene salvato in un unico file con estensione .c (o .cpp). In Java il programma viene strutturato
in modo diverso: il programmatore individua gli elementi che dovranno interagire in esecuzione e per
questi ne dà una descrizione. Questi elementi potranno essere di tipo diverso: per ciascuno di questi tipi,
scriverà un file con il codice che lo implementa (con estensione .java). Anticipiamo che questo codice
prende il nome di classe. Quindi non c’è una situazione di “programma principale” e “allegati”, ma di
insieme di componenti che interagiscono. Lo schema che segue rappresenta graficamente questa
differenza tra il C ed il Java:

Struttura di un programma C Struttura di un programma Java

Libreria1 Libreria1
Libreria2

Classe Java
Classe Java (file.java)
(file.java)
Programma C

(file.c)
Classe Java Classe Java
(file.java) (file.java)

Il termine modulo (e quindi la modularità, ovvero la proprietà di essere modulare) si riferisce proprio alla
caratteristica di un programma Java di essere pensato non come un blocco unico, ma come un insieme di
moduli separati che interagiscono; tali moduli vengono chiamati appunto classi. I vantaggi della modularità
sono molti:

- riuso: una classe appartenente ad un progetto già realizzato può essere copiata ed inserita in un
nuovo progetto
- lavoro in team: la modularità facilita la divisione logica dei compiti, per cui in un team di
sviluppatori ciascuno può lavorare a classi diverse, dopo aver concordato con il resto del team in
che modo le classi devono interagire
- controllo errori: se un programma è scomposto in porzioni più piccole, è più semplice analizzare e
testare i singoli blocchi di codice alla ricerca di eventuali bug
- estensione: con un meccanismo che affronteremo più avanti, detto ereditarietà, sarà possibile
realizzare un classe “evolvendo” una classe già esistente
4
Corso di Informatica 2 – Francesco De Vincenzi

JAVA è in parte compilato, in parte interpretato

Questo è uno dei punti di originalità del linguaggio Java ed anche il motivo della sua immediata popolarità e
versatilità di impiego in vari campi.

Abbiamo discusso di come il linguaggio C sia a livello di astrazione più vicino alla macchina rispetto a Java.
Un programma scritto in C può fare operazioni anche di basso livello sui singoli bit della memoria. Questo
forte legame del linguaggio con la macchina su cui viene eseguito è un punto di forza per le prestazioni del
programma, che in sostanza è stato scritto e compilato proprio per quella macchina su cui va in esecuzione,
ma ne è anche un limite nel senso che il programma eseguibile generato da quella compilazione non è
utilizzabile su una architettura (hardware+sistema operativo) diversa da quella. In parole povere, se
compilo un programma C su un PC con installato sopra Windows 10 poi non posso prendere l’eseguibile (il
.exe) generato ed eseguirlo su un PC con Linux e a maggior ragione su un McIntosh con MacOS. Quello che
devo fare è riprendere il codice sorgente che ho scritto e ricompilarlo sulla nuova piattaforma. Infatti il
compilatore effettua una conversione delle istruzioni adatte al set di istruzioni del processore su cui si trova
ed effettua dei collegamenti tra il programma e le librerie del sistema operativo installato sulla macchina
stessa.

Gli anni in cui è stato sviluppato il Java sono anche gli anni in cui iniziava ad affermarsi il Web, ed in tale
contesto in cui diverse piattaforme venivano messe in contatto era necessario un linguaggio che potesse
essere indifferentemente eseguito su tutte le apparecchiature connesse alla rete. Java al suo tempo vinse la
sfida, con un’idea semplice ma efficace: il codice sorgente Java viene compilato e trasformato in un codice
che può essere eseguito non da un processore reale, ma da un programma che emula un processore, una
macchina virtuale. Sviluppando su ogni tipo di piattaforma una macchina virtuale adatta, si riesce a far
eseguire lo stesso programma Java su tutte le piattaforme. Ecco uno schema che sintetizza il tutto:

Codice sorgente
JAVA
(file .java)

Compilazione

Bytecode
(file .class)

Interpretazione

Java Virtual Java Virtual Java Virtual


Machine 1 Machine 2 Machine n
Esecuzione …
S.Operativo 1 S.Operativo 2 S.Operativo n
Hardware a Hardware b Hardware z
5
Corso di Informatica 2 – Francesco De Vincenzi

Il codice sorgente Java scritto da un programmatore viene salvato in uno (o più) file di testo con estensione
.java. Il programma viene compilato dal compilatore java, il quale produce un file con estensione
.class per ciascun file sorgente compilato. Questo file .class contiene il cosiddetto bytecode, ovvero
una serie di istruzioni scritte in un linguaggio di basso livello, paragonabile ad un linguaggio macchina. Il
fatto è che però queste istruzioni non sono destinate al processore(che su ogni tipo di macchina ha un
instruction set); in realtà queste istruzioni sono date in pasto ad un programma, chiamato macchina
virtuale java (JVM: Java Virtual Machine), il quale le interpreta ad una ad una, eseguendo le corrispondenti
operazioni sul processore reale su cui è in esecuzione. Quindi esiste una JVM diversa per ciascuna
architettura: Windows 32 bit, Windows 64 bit, Linux, Unix, MacOs, Android,… Ciascuna JVM si può pensare
divisa in due parti: una parte “superiore”, uguale per tutte, è quella che analizza il bytecode per capire cosa
deve eseguire; una parte “inferiore”, diversa per ogni architettura, che conosce la macchina su cui è in
esecuzione ed attiva le operazioni corrette del processore.

Le prime JVM erano degli interpreti a tutti gli effetti: le istruzioni venivano preparate al volo al momento
dell’esecuzione. Questo è però sempre stato causa di lentezza nell’esecuzione di applicazioni Java. Oggi
le JVM hanno un compilatore JIT (Just in Time), ovvero un programma che al momento dell’esecuzione
traduce tutto il bytecode in un programma eseguibile. Questa scelta richiede qualche istante in più in
fase di avvio, ma prestazioni migliori nel corso dell’esecuzione di un programma Java.

Grazie a questa versatilità, a Java viene associato lo slogan WORE: Write Once, Run Everywhere (“scrivi una
volta, esegui dappertutto”). In effetti il primo effetto tangibile della portabilità di Java sono state le Applet:
piccoli programmi grafici scritti in Java, che venivano eseguiti all’interno di pagine Web, quindi scritte
appositamente per essere eseguite su qualsiasi dispositivo. Oggi le Applet sono di fatto scomparse,
sostituite prima da applicazioni Flash, poi da HTML5 e Javascript, ma Java offre diversi altri strumenti
software e resta un linguaggio, come recita lo splash screen di installazione, eseguito su “bilioni di
dispositivi”: computer laptop, desktop, tablet, palmari, smartphone etc.

3. Cosa serve per programmare in Java?


Cosa serve per programmare in Java? Contrariamente a quanto a volte si sente dire, per programmare in
Java non serve necessariamente installare un ambiente di sviluppo. Di questi ambienti ce ne sono diversi (i
più noti sono NetBeans, Eclipse, IntelliJ), ma in realtà è possibile programmare in Java anche scrivendo
direttamente i file java con un blocco note. Devono però essere installate due applicazioni: la prima è la
macchina virtuale, che è il file java.exe. Il secondo è il compilatore, javac.exe. E’ frequente trovare la
macchina virtuale già installata, perché questa viene richiesta da diversi altri programmi. Per verificare se è
presente su un computer, basta aprire una finestra DOS con il comando CMD e digitare java, premendo
invio.
6
Corso di Informatica 2 – Francesco De Vincenzi

Il programma java.exe dovrebbe essere richiamabile da qualsiasi posizione nel pc (cioè, non bisogna
navigare fino alla cartella in cui è installato) perché il percorso del file viene inserito nella variabile
d’ambiente PATH del sistema operativo (se java.exe non viene eseguito, un problema possibile è proprio
l’assenza del percorso di java.exe nel PATH).

Il compilatore Java si trova nella stessa directory e, come detto, si chiama javac.exe. Per compilare un file
java basta avviare il programma javac specificando il nome del file java da compilare (ad esempio: javac
prova.java).

Se il sistema operativo non trova questo file, è possibile che Java non sia installato completamente sul
proprio computer. In questo caso occorre scaricare (gratuitamente) l’ultima versione di Java dal sito della
Oracle: l’ultima versione rilasciata è la 12.

Potrebbero piacerti anche