Fondamenti di Informatica Le basi del linguaggio Java

Corso di Laurea Ingegneria Civile
Fondamenti di Informatica
Dispensa 10
Le basi del linguaggio Java
Aprile 2010
Le basi del linguaggio Java
1
Prerequisiti
 Nozioni generali sulla sintassi e semantica
del linguaggio naturale
 Conoscenza delle varie fasi della scrittura di
un programma, fino alla sua esecuzione
 Introduzione alla programmazione
strutturata
 Concetto di variabile
Le basi del linguaggio Java
2
Contenuti
 Sintassi e semantica
 Introduzione alla sintassi di Java
 Introduzione alla semantica di Java
• semantica delle espressioni
• semantica delle istruzioni
 Sintassi, semantica ed errori
 Introduzione alle istruzioni di Java
Le basi del linguaggio Java
3
Obiettivi (competenze da acquisire)
Al termine dell’unità didattica lo studente sarà in grado di



Individuare gli errori presenti in un programma
Leggere le informazioni sugli errori, che si hanno in fase di
compilazione
Distinguere gli errori sintattici dagli errori semantici
Le basi del linguaggio Java
4
Linguaggi naturali . . .
 Per definire un linguaggio naturale si parte dalla
definizione di un alfabeto
 in italiano ci sono 21 lettere, in inglese 26, ...
 Con i caratteri dell’alfabeto possiamo formare un
insieme di sequenze, dette parole
 Non tutte le sequenze sono parole del linguaggio
naturale
 La grammatica del linguaggio fornisce le regole per
decidere quali sequenze sono parole del linguaggio
 parole corrette grammaticalmente
Le basi del linguaggio Java
5
. . . Linguaggi naturali
 Con le lettere dell’alfabeto italiano possiamo costruire
alcune sequenze
 ad esempio abcdef, ghil, rst - che non sono parole della
lingua italiana
 ad esempio andare, aula, corso, acqua, soqquadro, - che
sono parole della lingua italiana, cioè corrette
grammaticalmente
Le basi del linguaggio Java
6
. . . Linguaggi naturali
 Con le parole, corrette, possiamo formare un insieme
di parole, dette frasi
 Non tutte le sequenze sono frasi del linguaggio
naturale
 La sintassi del linguaggio fornisce le regole per
decidere quali sequenze sono frasi del linguaggio
 frasi corrette sintatticamente, o sintatticamente ben formate
Le basi del linguaggio Java
7
. . . Linguaggi naturali
 In italiano la regola base della sintassi dice che le
frasi sono costruite con sequenze di parole che
seguono la struttura
soggetto verbo complemento
 soggetto, verbo e complemento non sono altro che dei nomi,
cioè denotano, alcuni particolari e ben precisi sottoinsiemi
dell’insieme di tutte le parole del linguaggio.
 Ad esempio la sequenza di parole il lo la non è quindi una
frase della lingua italiana
 ad esempio la sequenza di parole gatto mangia topo è una
frase della lingua italiana, ovvero è sintatticamente ben
formata
Le basi del linguaggio Java
8
. . . Linguaggi naturali
 Solo alcune delle frasi del linguaggio, cioè di quelle
ben formate sono anche valide, cioè hanno un
significato
 La semantica del linguaggio stabilisce quali tra le frasi
ben formate sono anche valide e quindi si occupa
dell’interpretazione (del significato) delle frasi
 ad esempio la frase il gatto mangia il topo è una ben formata
ma è anche valida, cioè ha un significato
Le basi del linguaggio Java
9
Sintassi
 La sintassi di un linguaggio si occupa della forma delle
frasi del linguaggio, ovvero delle regole che permettono
di costruire frasi ben formate del linguaggio
 Esempio di frase in italiano
il gatto mangia il topo
 Frammento della sintassi della lingua italiana
frase  soggetto verbo complemento
soggetto  articolo nome
verbo  mangia, beve
complemento  articolo nome
articolo  il, lo, la
nome  gatto, monte, topo
Le basi del linguaggio Java
10
Semantica
 La semantica di un linguaggio si occupa
dell’interpretazione del linguaggio, ovvero del
significato delle frasi corrette sintatticamente
 Esempio di frasi corrette sintatticamente in italiano, ma
non tutte valide
 il gatto mangia il topo
 il topo mangia il monte
 il cane mangia il topo
 il monte beve il cane
Le basi del linguaggio Java
11
Regole sintattiche . . .
 Le regole della sintassi sono chiamate regole di
produzione, come nell’esempio precedente
 Nelle regole di produzione compaiono elementi (simboli)
terminali, come - mangia, beve, il, lo, la, gatto, monte,
topo - ed elementi (simboli) non-terminali, come – frase,
soggetto, verbo, …. – che sono ―categorie sintattiche‖
cioè nomi che denotano insiemi di simboli terminali
 Una fissata categoria sintattica, detta assioma, è quella
dalla quale deve partire il processo di produzione
 Nel caso della lingua italiana l’assioma è frase
Le basi del linguaggio Java
12
. . . Regole sintattiche
frase  soggetto verbo complemento
soggetto  articolo nome
verbo  mangia, beve
complemento  articolo nome
articolo  il, lo, la
nome  gatto, monte, topo
 Una fissata categoria sintattica, detta assioma, è quella
dalla quale deve partire il processo di produzione
 Nel caso della lingua italiana l’assioma è frase
Le basi del linguaggio Java
13
Sintassi, semantica e linguaggi
 Un programma è un insieme di frasi in un
linguaggio di programmazione
• quali sono le frasi valide in un linguaggio di programmazione?
• qual è il significato delle frasi valide?
 Nello studio dei linguaggi (linguaggi naturali e
linguaggi di programmazione) vengono distinte
due componenti
• la sintassi del linguaggio
– si occupa della forma delle frasi del linguaggio, per formare le frasi ―ben
formate‖
• la semantica del linguaggio
– stabilisce quali tra le frasi ―ben formate‖ sono anche valide
– si occupa dell’interpretazione (del significato) delle frasi valide
Le basi del linguaggio Java
14
Introduzione alla sintassi di Java
 La sintassi di Java si occupa della formazione di
frasi valide in Java, mediante la formalizzazione
delle ―regole sintattiche‖
• la definizione di una classe è formata dalla parola class,
seguita dal nome della classe e dal corpo della classe
• il nome di una classe è un identificatore
• un identificatore è una sequenza non vuota di caratteri
alfanumerici, iniziante per un carattere alfabetico
• il corpo di una classe è formato da un elenco di dichiarazioni
della classe, racchiuso tra parentesi graffe { e }
• possibili dichiarazioni di una classe sono: la definizione di un
metodo, la definizione di un costruttore, la dichiarazione di una
variabile
• la definizione di un metodo è formata dall’intestazione del
metodo seguita dal corpo del metodo
• il corpo di un metodo è un blocco
• un blocco è una sequenza di istruzioni e dichiarazioni
racchiusa tra parentesi graffe { e }
Le basi del linguaggio Java
15
Sintassi e grammatiche
 La sintassi di Java è descritta da una grammatica
composta da
• elementi terminali — le parole e i simboli che possono
comparire nei programmi
– class public . , ; { } a b c d ... 0 1 2 ...
• elementi non terminali — le categorie sintattiche, utilizzate
per la descrizione dei programmi — ma che non compaiono
nei programmi
– definizione-classe identificatore corpo-classe definizione-metodo blocco
sequenza-istruzioni-blocco istruzione
• produzioni (o regole sintattiche) — le regole che specificano
come sia possibile derivare frasi da ciascun non terminale
• assioma — l’elemento non terminale che guida la scrittura di
un intero programma o classe
Le basi del linguaggio Java
16
Esempi di produzioni
definizione-classe:
class identificatore-classe corpo-classe
corpo-classe:
{ dichiarazioni-corpo-classeopt }
dichiarazioni-corpo-classe:
dichiarazione-corpo-classe
dichiarazione-corpo-classe dichiarazioni-corpo-classe
dichiarazione-corpo-classe:
definizione-metodo
definizione-costruttore
dichiarazione-variabile
definizione-metodo:
intestazione-metodo corpo-metodo
corpo-metodo:
blocco
blocco:
{ sequenza-istruzioni-bloccoopt }
Le basi del linguaggio Java
17
Produzioni


definizione-classe:
class identificatore-classe corpo-classe
• la prima riga di una produzione contiene un non terminale
– la produzione ha lo scopo di descrivere le possibili forme per questo non
terminale
• nelle righe successive alla prima vengono descritti i possibili
modi per espandere il non terminale
– questa produzione afferma che una definizione-classe è formata dal
terminale class, seguito da un identificatore-classe e da un corpo-classe
– le forme per identificatore-classe e corpo-classe sono descritte dalle
rispettive produzioni
Le basi del linguaggio Java
18
Alcuni elementi sintattici nella
definizione di una classe
identificatore-classe
definizione-classe
/* Applicazione che visualizza una frase sullo schermo. */
class ScrittoreSulloSchermo {
public static void main(String[] args) {
System.out.println("ciao a tutti");
System.out.println("questo testo introduce");
System.out.println("i fondamenti dell'informatica");
}
}
corpo-classe
definizione-metodo
Le basi del linguaggio Java
19
Alcuni elementi sintattici nella
definizione di un metodo
intestazione-metodo
definizione-metodo
public static void main(String[] args) {
System.out.println("ciao a tutti");
System.out.println("questo testo introduce");
System.out.println("i fondamenti dell'informatica");
}
corpo-metodo — blocco
istruzione-blocco — istruzione
sequenza-istruzioni-blocco
Le basi del linguaggio Java
20
Esempio — identificatori
 I nomi delle classi, dei metodi e delle variabili
appartengono alla categoria grammaticale degli
identificatori
• alcuni esempi di identificatori
– Math, println, frase, sqrt, RadiceQuadrata
– System.out non è un identificatore
 La regola (informale) per la formazione degli
identificatori è
• un identificatore è una sequenza non vuota di caratteri
alfanumerici (alfabetici e numerici), iniziante con un carattere
alfabetico
– in realtà, sono ammessi anche alcuni caratteri speciali, come il carattere
―underscore‖ _
– alcune sequenze di caratteri sono riservate — come ad esempio class e
public — non sono identificatori
• l’uso dei caratteri minuscoli e maiuscoli è significativo
– ad esempio, alfa e Alfa sono identificatori diversi
Le basi del linguaggio Java
21
Sintassi per gli identificatori
identificatore:
sequenza-caratteri ma non parola-chiave
sequenza-caratteri:
carattere-alfabetico
sequenza-caratteri carattere-alfanumerico
carattere-alfanumerico:
carattere-alfabetico
cifra
carattere-alfabetico:
uno di a à b c ... x y z A À B C ... X Y Z
cifra:
uno di 0 1 2 ... 8 9
parola-chiave:
uno di abstract boolean break byte case catch char class const continue
default do double else extends final finally float for goto if implements
import instanceof int interface long native new package private protected
public return short static super switch synchronized this throw throws
transient try void volatile while
Le basi del linguaggio Java
22
Introduzione alla semantica di Java
 La semantica di un linguaggio
• stabilisce quali sono le frasi valide tra quelle ben formate
– la sintassi è uno strumento troppo povero
• si occupa dell’interpretazione (del significato) delle frasi valide
– legame stretto tra sintassi e semantica
Le basi del linguaggio Java
23
Frasi ben formate e frasi valide
 Una istruzione valida

System.out.println("ciao a tutti");
 Una istruzione ben formata – ma non valida

System.out.stampa("ciao a tutti");
 Una istruzione che non è ben formata

System.out.println("ciao a tutti";
• la sintassi caratterizza le frasi ben formate
• le frasi valide sono un sottoinsieme delle frasi ben formate
• i tipi rivestono un ruolo importante nel discriminare tra frasi
valide e no
Le basi del linguaggio Java
24
Semantica di una frase
 La semantica di una frase dipende anche dal tipo
della frase
• la semantica di una espressione viene data in termini di un tipo
e di un valore
• la semantica di una istruzione viene data in termini dell’effetto
dell’esecuzione dell’istruzione
– in modo diverso per istruzioni semplici e istruzioni strutturate
Le basi del linguaggio Java
25
Semantica delle espressioni
a+b
• è una espressione ben formata
• è anche valida se (ad esempio)
– a e b sono variabili di tipo int
– alle variabili a e b è stato già assegnato un valore
– in questo caso è una espressione di tipo int
 Semantica statica
• controllata durante l’analisi statica del codice (dal compilatore)
– assegna un tipo a ogni espressione
 Semantica dinamica
• valutata durante l’esecuzione dinamica del codice
– assegna un valore a ogni espressione
• il valore di a+b è dato dal valore di a sommato a quello di b
– è noto solo durante l’esecuzione
Le basi del linguaggio Java
26
Semantica delle istruzioni

somma = a + b;
• è una istruzione ben formata
• è anche valida se (ad esempio)
– a, b e somma sono variabili di tipo int
– alle variabili a e b è stato già assegnato un valore
 Semantica statica
• principalmente compatibilità tra tipi
 Semantica dinamica
• in questo caso
– valuta l’espressione a+b
– memorizza il valore calcolato nella variabile somma
Le basi del linguaggio Java
27
Semantica delle istruzioni semplici

System.out.println("ciao a tutti");
 Semantica statica
• esiste l’oggetto System.out?
• qual è il tipo dell’oggetto System.out?
• per il tipo dell’oggetto System.out esiste una operazione di
nome println che ha come parametro una stringa?
 Semantica dinamica
• invia il messaggio println("ciao a tutti") all’oggetto
System.out
– poi System.out sa che cosa fare...
Le basi del linguaggio Java
28
Semantica delle istruzioni strutturate
 La semantica di Java si occupa anche della
semantica delle istruzioni strutturate (istruzioni
che al loro interno contengono altre istruzioni)
while (i<=n) {
somma = somma + i;
i = i + 1;
}
 la semantica delle istruzioni strutturate viene data in
termini di
– esecuzioni delle istruzioni contenute
– valutazioni delle condizioni di controllo
Le basi del linguaggio Java
29
Sintassi, semantica ed errori
 Possibili errori di programmazione
• la frase non è ben formata
– errori sintattici o grammaticali
• la frase è ben formata ma non è valida
– errori semantici
– errori di semantica statica ed errori di semantica dinamica
• la frase è valida – ma il suo significato è diverso da quello
voluto
– errori logici
Le basi del linguaggio Java
30
Errori sintattici
System.out.println(ciao a tutti);
// ERRORE: mancano le virgolette
System.out println("ciao a tutti");
// ERRORE: manca un punto
a = 10,
// ERRORE: virgola al posto di
punto e virgola
 Gli errori sintattici sono riconosciuti e segnalati dal
compilatore
Le basi del linguaggio Java
31
Errori semantici
System.out.stampa("ciao a tutti");
// ERRORE: il metodo stampa non è definito
system.out.println("ciao a tutti");
// ERRORE: system.out non è un
// riferimento valido
 Gli errori semantici sono di due tipi
• errori di semantica statica
– riconosciuti e segnalati dal compilatore (come i due errori mostrati qui sopra)
• errori di semantica dinamica
– possono verificarsi durante l’esecuzione del programma (non sono
riconosciuti dal compilatore)
Le basi del linguaggio Java
32
Errori logici
System.out.print("ciao a tutti");
// ERRORE: andava usato il metodo println
doppiodin = n+2;
// ERRORE: + anziché *
 Gli errori logici non sono riconosciuti dal
compilatore, e possono verificarsi durante
l’esecuzione del programma
Le basi del linguaggio Java
33
Introduzione alle istruzioni di Java
 Una applicazione Java, nella sua forma più
semplice
eventuale clausola di importazione
commento sull’applicazione
/* Applicazione che visualizza una frase sullo schermo. */
class ScrittoreSulloSchermo {
public static void main(String[] args) {
System.out.println("ciao a tutti");
System.out.println("questo testo introduce");
System.out.println("i fondamenti dell'informatica");
}
}
nome dell’applicazione
sequenza di istruzioni e dichiarazioni
• il corpo del metodo main è una sequenza di istruzioni e
dichiarazioni
Le basi del linguaggio Java
34
Una classificazione delle principali
istruzioni di Java
istruzione o
dichiarazione
dichiarazione
variabile locale
istruzione
istruzione
semplice
istruzione
espressione
istruzione
strutturata
istruzione istruzione istruzione istruzione
return
break
continue
vuota
blocco
istruzione
istruzione
istruzione
di incremento
assegnazione invocazione
di metodo o decremento
istruzione
condizionale
istruzione
ripetitiva
istruzione
creazione
di oggetto
istruzione
if
istruzione
if-else
Le basi del linguaggio Java
istruzione
while
istruzione
for
istruzione
do-while
35
Una classificazione delle principali
istruzioni di Java
 Dichiarazioni
• di variabili, locali a un metodo
 Istruzioni
• istruzioni semplici
– invocazione di metodo, assegnazione, ...
– istruzioni atomiche
• istruzioni strutturate
– blocco, istruzioni condizionali, istruzioni ripetitive
– istruzioni non atomiche, ― molecolari‖
– sono istruzioni di controllo
Le basi del linguaggio Java
36
Riepilogo della dispensa
Le basi del linguaggio Java
37
Conoscenze acquisite
 Analogia tra il linguaggio naturale e il
linguaggio di programmazione
 Modalita’ di generazione delle regole
grammaticali in un linguaggio
Le basi del linguaggio Java
38
Competenze acquisite
 Saper individuare gli errori presenti in un programma
 Saper leggere le informazioni sugli errori, che si hanno in
fase di compilazione
 Saper distinguere gli errori sintattici dagli errori semantici
Le basi del linguaggio Java
39
Parole chiave
Alfabeto, grammatica, frase, sintassi,
semantica
Frase ben formata, frase valida
Categoria sintattica, produzioni, assioma,
parole chiave
Errori sintattici, semantici, logici
Le basi del linguaggio Java
40
Rifermimenti al libro di testo
 Capitolo 6
Le basi del linguaggio Java
41