Programmazione I - Dipartimento di Informatica

Università di Torino – Facoltà di Scienze MFN
Corso di Studi in Informatica
Programmazione I - corso B
a.a. 2008-09
prof. Ugo de’Liguoro
Blocco 2 – Linguaggi di programmazione. Introduzione a JAVA
Linguaggi di programmazione
• Programmare in assembly è complicato perché le sue
istruzioni sono molto elementari; sono necessarie lunghe
sequenze di codice anche per semplici operazioni:
stampa a*b + d*c;
Operazione
COPY AX a
MUL AX b
COPY temp AX
COPY AX d
MUL AX c
ADD AX temp
OUT AX
Codice assembly
Programmazione I B - a.a. 2008-09
Linguaggi di programmazione
• Per ovviare sono stati introdotti i linguaggi di
programmazione, lingue artificiali per la definizione di
programmi, simili all’algebra e ad un rudimentale inglese:
Per esempio Java, C, C++, BASIC, Pascal, …
• Proprietà:
– Non ambigui
– Concisi
– Espressivi
– Alto livello (si basano su astrazioni)
Programmazione I B - a.a. 2008-09
1
Codice in un linguaggio d’alto livello
Programmazione I B - a.a. 2008-09
Diversi tipi di linguaggi di programmazione
Diversi tipi di linguaggi (ad alto livello):
• Linguaggi imperativi
Basati sul concetto di assegnamento: le istruzioni sono
sostanzialmente operazioni di modifica delle strutture dati
[es: Fortran, Cobol, Basic (non strutturati); Pascal, C (strutturati)]
• Linguaggi funzionali
Basati sul concetto di funzione: le istruzioni sono funzioni che
vengono valutate [es: Lisp]
• Linguaggi logici
Basati sul concetto di dimostrazione: le istruzioni esprimono
relazioni logiche tra input e output [es: Prolog]
• Linguaggi ad oggetti
Basati sul concetto di dato come oggetto attivo, in grado di
ricevere e inviare messaggi [es: Smalltalk, C++, CLOS, Java]
Programmazione I B - a.a. 2008-09
Programmi traduttori: compilatori
Poiché l’unico linguaggio che un elaboratore è in grado di
“capire” è il proprio linguaggio macchina, programmi scritti con
linguaggi ad alto livello richiedono una traduzione: il
programma traduttore è un compilatore.
Programma
sorgente
compilatore
Programma
eseguibile
Programmazione I B - a.a. 2008-09
2
Le fasi della programmazione con un compilatore
Text editor
sorgente
compilatore
Parser
si
Ok?
no
Traduttore
eseguibile
log
Programmazione I B - a.a. 2008-09
Quali errori può scoprire il compilatore?
Non esiste alcuna procedura
automatica ed uniforme che possa
decidere se un programma è
logicamente corretto, né se una sua
esecuzione produrrà un risultato!
Alan M. Turing
Tuttavia possiamo descrivere
formalmente la grammatica di un
linguaggio di programmazione e
decidere se il testo di un
programma vi si conforma
Noam Chomsky
Programmazione I B - a.a. 2008-09
Una grammatica
Regole
Frase Æ ParteNominale ParteVerbale •
ParteNominale Æ Nome Relativaopt
ParteVerbale Æ VerboIntransitivo |
VerboTransitivo ParteNominale
Nome Æ NomeProprio | Articolo NomeComune
Relativa Æ che ParteVerbale
NomeProprio Æ Mario | Lucia
NomeComune Æ cane | gatto
Articolo Æ il | un
VerboIntransitivo Æ corre | scappa
VerboTransitivo Æ insegue | raggiunge
Nota:
opt = opzionale (cioè che può esserci oppure no)
Programmazione I B - a.a. 2008-09
3
Esempi di frasi corrette secondo la grammatica
precedente
Mario corre.
Il cane scappa.
Il cane insegue il gatto.
Mario insegue Mario.
Lucia insegue Mario che scappa.
Lucia che insegue Mario raggiunge il cane.
Mario insegue il cane che insegue un gatto che insegue Lucia.
Il gatto raggiunge il gatto che raggiunge il gatto che raggiunge il gatto che
corre.
Un cane raggiunge un gatto che insegue il cane.
Mario che insegue Mario raggiunge Lucia che insegue Lucia.
...
Programmazione I B - a.a. 2008-09
Esempi di frasi scorrette secondo la stessa
grammatica
Il Mario corre.
Mario corre
(manca il punto finale!)
Cane insegue cane.
Il gatto insegue.
Un cane raggiunge un Mario.
Il gatto insegue il topo.
Corre il cane.
Il cane che scappa.
Che cane.
...
Programmazione I B - a.a. 2008-09
Derivazione di una frase da una grammatica
Frase
→ ParteNominale ParteVerbale
→ Nome VerboTransitivo ParteNominale
→ Articolo NomeComune insegue Nome
→ il cane insegue Articolo NomeComune
→ il cane insegue il gatto
Programmazione I B - a.a. 2008-09
4
L’albero sintattico di una frase
il
cane
Art
NC
insegue
il
gatto
Art
NC
N
N
VT
PN
PN
PV
F
Programmazione I B - a.a. 2008-09
Ambiguità
Art
Nome
Verbo Art
Nome
la vecchia porta la sbarra
Art
Attrib
Nome Pron Verbo
Programmazione I B - a.a. 2008-09
Backus-Naur Form (BNF)
• E’ il formalismo utilizzato per descrivere la sintassi dei
linguaggi di programmazione, ed è essenzialmente un modo
per definire grammatiche.
<statement> ::= <block>
| "assert" <expression> [":" <expression>] ";"
| "if" <par expression> <statement> ["else" <statement>]
| "for" "(" <for control> ")" <statement>
| "while" <par expression> <statement>
| "do" <statement> "while" <par expression> ";"
| "try" <block> <catches>
| "try" <block> [<catches>] "finally" <block>
| "switch" <par expression> "{" <switch block statement groups> "}"
| "synchronized" <par expression> <block>
| "return" [<expression>] ";"
| "throw" <expression> ";"
| "break" [<identifier>] ";"
| "continue" [<identifier>] ";"
| ";"
| <statement expression> ";"
| <identifier> ":" <statement>
Programmazione I B - a.a. 2008-09
5
Interpreti
In alternativa ai compilatori, alcuni linguaggi utilizzano gli
interpreti:
interprete, programma che legge il sorgente
riga per riga, ne riconosce le istruzioni ed
esegue le azioni corrispondenti.
Sono linguaggi interpretati il BASIC, Javascript (e la
maggioranza dei linguaggi di scripting), il LISP ed il PROLOG
(usati per l’intelligenza artificiale e le applicazioni della logica),
ecc.
Programmazione I B - a.a. 2008-09
Macchina Virtuale
• JAVA nasce come linguaggio per la rete, indipendente dalla
piattaforma; un programma JAVA può migrare da una
macchina all’altra ed essere eseguito nel nuovo ambiente.
• Un’interprete per JAVA non sarebbe però efficiente
• Si usa allora la JVM, macchina virtuale di JAVA, ossia
un’interprete di un linguaggio a basso livello, detto bytecode
che viene generato dal compilatore JAVA.
• La macchina virtuale è un’astrazione di un elaboratore
“generico”
Programmazione I B - a.a. 2008-09
VM = Macchina Virtuale
Programmazione I B - a.a. 2008-09
6
Passi concettuali (I)
Programmazione I B - a.a. 2008-09
Passi concettuali (II)
Programmazione I B - a.a. 2008-09
Concetti della programmazione imperativa: dati e procedure
Un programma di un linguaggio, imperativo ad esempio il C, si
compone di due parti, la specifica dei dati e quella delle
procedure:
Dichiarazione e
definizione di
variabili (globali) e
tipi def. dall’utente
int n = 0;
double v[100];
struct Record
{int a; char c};
Procedure e
funzioni, tra cui una
principale (main)
int main()
{
…
return 0;
}
.c
Programmazione I B - a.a. 2008-09
7
Concetti della programmazione imperativa: le variabili
Una variabile è una locazione di memoria astratta
tipo
nome
double
indirizzo
(fissato)
x
16F7A008
500.65
prima dell’uso
bisogna dichiarare
le variabili!
Valore
(modificabile)
Programmazione I B - a.a. 2008-09
Concetti della programmazione imperativa: comandi
La programmazione imperativa si basa sulla nozione di
comando
Vi sono due specie di comandi:
• Assegnamenti
• Istruzioni di controllo
Programmazione I B - a.a. 2008-09
Concetti della programmazione imperativa: comandi
• Assegnamenti
n = 7 + 5*m;
Significato: sia n il
numero che si ottiene
valutando
l’espressione 7 + 5*m
(quindi si deve sapere
quanto vale m!)
Programmazione I B - a.a. 2008-09
8
Concetti della programmazione imperativa: comandi
• Assegnamenti
Simbolo di
assegnazione (NON
di eguaglianza)
n = 7 + 5*m;
Variabile,
astrazione di
una locazione
di memoria
(deve essere
stata
dichiarata
prima)
Espressione, può
contenere
costanti (7, 5)
operatori (+ e *) e
variabili (che
devono avere già
un valore)
Programmazione I B - a.a. 2008-09
Concetti della programmazione imperativa: comandi
• Istruzioni di controllo
Questa è un’iterazione, ossia
un modo controllato per
ripetere un certo numero di
istruzioni
while (r > 0)
{
true
n = m;
r>0
false
=
m = r;
r = n mod m;
n=m …
}
Programmazione I B - a.a. 2008-09
Concetti della programmazione imperativa: procedure
Le istruzioni o comandi sono raggruppati in procedure (in C
sono chiamate funzioni, in JAVA metodi), le quali possono
avere dei parametri:
int MassimoComunDivisore (int n, int m)
// pre: n, m positivi e non entrambi nulli
// post: ritorna l’MCD tra n ed m
{ ….}
Tra di esse deve esservi una procedura principale (il main),
che viene eseguita per prima, e che attiva in cascate le altre.
Programmazione I B - a.a. 2008-09
9
Oggetti e …
Nei linguaggi orientati agli oggetti, come JAVA, le unità del
programma sono gli oggetti.
Oggetto:agente
agentecaratterizzato
caratterizzatoda
da
Oggetto:
unostato
stato
••uno
uninsieme
insiemedi
dicomportamenti
comportamenti
••un
Stato: power = on;
trackNo = 12;
title = “Oh sole mio”, …
Comportamenti:
On/Off, select, play, stop, pause, ...
Lettore MP3
Programmazione I B - a.a. 2008-09
… classi
Nei linguaggi class-based (come JAVA) gli oggetti esistono
solo durante l’esecuzione; il programma contiene soltanto le
loro descrizioni prototipali, ossia le classi.
Campi privati
accessibili solo
dai metodi della
classe
public class LettoreMP3 {
private bool OnOff;
private int trackNo;
…
public void PowerSwitch() { …};
public void Play() { …};
…
};
Metodi pubblici
accessibili dall’
esterno (ma ve
ne sono anche di
privati)
Programmazione I B - a.a. 2008-09
Istanziazione delle classi
Per generare oggetti (istanze) da una classe occorre che sia
eseguita un’istruzione di istanziazione
lettoreDiUgo
lettoreDiUgo = new LettoreMP3()
Stato: power = on;
public class LettoreMP3 {
private bool OnOff;
private int trackNo;
…
public void PowerSwitch() { …};
public void Play() { …};
…
};
trackNo = 12;
title = “Oh sole mio”, …
lettoreDiMario
lettoreDiMario = new LettoreMP3()
Stato: power = on;
trackNo = 3;
title = “Only you”, …
Programmazione I B - a.a. 2008-09
10
Il primo programma Java
Programmazione I B - a.a. 2008-09
Formato generale
Programmazione I B - a.a. 2008-09
main(…): la porta sul mondo Java
public static void main(String[] args){
/* istruzioni ... */
}
• Punto di ingresso di ogni applicazione
– Invocato automaticamente dalla VM Java
– static perché non appartiene ad alcun oggetto ….
Programmazione I B - a.a. 2008-09
11
Java: Hello
Parametro di main, che contiene
Argomenti di riga di comando
Nel file Hello.java
public class Hello {
public static void main(String[] args){
String s = “Ciao”;
Assegnamento
System.out.println(s);
}
}
stampa a video il valore
della variabile output
Programmazione I B - a.a. 2008-09
Java: javac e java
Compiliamo le classi Hello:
> javac Hello.java
compilatore
→ Hello.class
> javac = invocazione del compilatore Java
(che "traduce" il codice sorgente Java in bytecode)
Interpretiamo/eseguiamo il bytecode Hello.class:
> java Hello
→ ciao!
java = invocazione dell'interprete Java
(che interpreta ed esegue il bytecode)
interprete (Java
Virtual Machine)
Programmazione I B - a.a. 2008-09
Java: javac e java
Attenzione! Java è case sensitive!
⇒ Hello.java ≠ hello.java
•
il nome del file e il nome della classe devono essere identici
(anche rispetto all'uso di maiuscole e minuscole)
•
quando compilate o interpretate/eseguite attenzione a scrivere i
nomi corretti
Vien da sé che non si possono usare, per le classi Java, nomi
di file con spazi!
Programmazione I B - a.a. 2008-09
12
Al lavoro!
1.
Aprite Blocco Note oppure TextPad (scelta consigliata!)
2.
Digitate il codice per la classe Hello1 e salvatelo nel file Hello1.java
(nella directory c:\esempi)
3.
Digitate il codice per la classe Test1 e salvatelo nel file Test1.java
(nella directory c:\esempi)
4.
Avviate il Prompt dei comandi (Start > Programmi > Accessori) →
5.
Posizionatevi nella directory che contiene le classi (cd examples)
6.
Compilate Hello.java
(javac Hello.java)
5.
Lanciate Hello (java Hello)
Con tanti
AUGURI!
Programmazione I B - a.a. 2008-09
13