Java/Dal sorgente all'esecuzione: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
riscrivo parte, rendo più newb-friendly
Riga 38:
 
; Spiegazione del passo 1
Il testo del programma è chiamato ''codice sorgente'' e contiene le istruzioni che il programma dovrà eseguire quando sarà lanciato sulla macchina virtuale. La sequenza delle istruzioni comincia in un punto preciso del codice sorgentetesto, che è individuato da questa riga (chiamata anche ''punto di ingresso'' o ''entry point''):
<source lang="Java">
public static void main(String[] args) {
</source>
eLe terminaistruzioni terminano con la parentesi graffa corrispondente. In Java, tutte le parentesi - tonde, quadre, graffe - vanno sempre a coppie: per ogni parentesi aperta devevuole essercila sempre unasua parentesi chiusa corrispondente.
 
In questo caso, il programma contieneha quattro parentesi graffe: due aperte e due chiuse. La prima parentesi graffa aperta appartiene alla classe e la seconda appartiene al main(), di conseguenza la prima parentesi graffa chiusa chiude il main() e la seconda chiude la classe.
 
Per scrivere il testo si usa un qualunque programma che permette di salvare i testi in formato *.txt. Tuttavia, ciCi sono programmi specializzati, che si chiamano IDE (''Integrated Development Environment''), che hanno funzioni speciali come la colorazione della sintassi, il completamento automatico dei nomi, ecc.
 
; Spiegazione del passo 2
Il ''compilatore'' è un programma che crea un duplicato del file sorgente, scrittoma peròlo scrive in un formato diverso, che il computer è in grado di eseguire. Il compilatore usato primanell'esempio di sopra è <tt>javac</tt> (''Java ccompiler''ompiler). Alcuni IDE hanno un tasto apposito che lancia in automatico il compilatore "dietro le quinte", il che è più comodo che invocarlo ogni volta da terminale.
 
Il testo prodotto dal compilatore si trova in alcuni file che hanno estensione <tt>.class</tt>. Questi sono leggibili solo dalla macchina virtuale.
 
; Spiegazione del passo 3
La macchina virtuale prende in ingresso il nome della classe da avviare, cerca il file *.class corrispondente, ed esegue la sequenza di istruzioni identificata dal main(). Ogni classe può avere un solo main(), quindi non ci sono ambiguità.<ref>Se Viceversa,nel secodice lasorgente classece nonne contienesono ildi main()più, lail macchina virtualecompilatore si rifiuta di eseguire alcunché: ripeterecompilare i passi sopra usando questo codice sorgente, e vedere cheil succede.testo
<source lang="Java">
public class PrimoProgramma {
public static void main(String[] args) {
System.out.println("Funziona!");
}
public static void main(String[] args) {
Syetem.out.println("Non funziona!");
}
}
</source>
 
</ref> Viceversa, se la classe non contiene il main(), la macchina virtuale si rifiuta di eseguire alcunché: ripetere i passi sopra usando questo codice sorgente, e vedere che succede.
<source lang="Java">
public class PrimoProgramma {
Line 62 ⟶ 74:
In molti IDE c'è un pulsante che lancia la macchina virtuale in automatico. Il pulsante, in genere, è chiamato ''Run''; alcuni offrono anche l'opzione ''Compile and Run''.
 
Se <tt>javac</tt> termina senza scrivere nulla su console, la compilazione è avvenuta con successo. Altrimenti, ipossono apparire dei messaggi di errore possono essere errori (''errors'') e/o messaggi di avviso (''warnings'').
 
In genere, il programmatore neofita può ignorare i messaggi di avviso. Invece, se ci sono errori, il testo sorgente viola le regole del linguaggio, quindi è necessario '''leggere i messaggi di errore''' (che spesso sono in inglese), correggere i file interessati, facendo attenzione anche agli errori di battitura e all'accoppiamento delle parentesi graffe, e riprovare a compilare finché la procedura non riesce. Si noti che uno stesso errore può far sì che il compilatore interpreti male il testo che segue, fino alla fine del file, generando messaggi di errore superflui.
 
''Se il prodotto del compilatore è eseguibile, perché devo lanciare la macchina virtuale? Non posso eseguirlo direttamente da terminale?''<br />
Dipende dal compilatore in uso. <tt>javac</tt> restituisce un formato che non è legato ad alcun sistema operativo, ed è appunto questo che rende Java portabile. L'altra faccia della medaglia è che il SO non riconosce direttamente il programma, quindi ci vuole un eseguibile a parte, che fa da intermediario tra il sistema operativo e il programma scritto in un formato di terze parti.<br />
Esistono compilatori - come [[w:gcc|gcc]] - che restituiscono un formato binario eseguibile direttamente sul sistema operativo in uso, cioè avviabile senza la macchina virtuale, ma in quel caso si perde la portabilità: i file prodotti sono inutilizzabili su un sistema differente.
 
''Perché devo compilare? La macchina virtuale non può leggere direttamente il codice sorgente?''
È una scelta di chi scrive la macchina virtuale. È possibile scrivere una macchina virtuale che esegua direttamente il codice sorgente, ma finora gli sviluppatori della Sun (e della Oracle) non l'hanno ritenuto necessario.
 
== Informazioni e consigli ==