Fondamenti di Informatica CdL Ingegneria Meccanica A.A. 2013/14

10/10/2013
Fondamenti di Informatica
CdL Ingegneria Meccanica
A.A. 2013/14
Docente:
Ing. Ivan Bruno
Elementi di programmazione
1.
2.
3.
Algoritmi e linguaggi di programmazione
Definizione di un linguaggio di
programmazione
Grammatica e Linguaggi
1
10/10/2013
Programmazione

È l’attività con cui si predispone
l’elaboratore a eseguire un particolare
insieme di azioni su particolari dati, allo
scopo di risolvere un problema.
Dati
Elaboratore
Elettronico
(input)
Risultati
(output)
Problemi da risolvere

I problemi che siamo interessati a risolvere con l’elaboratore
sono di natura molto varia:










Dati due numeri trovare il maggiore
Dato un elenco di nomi e relativi numeri di telefono trovare il
numero di telefono di una determinata persona
Dati a e b, risolvere l’equazione ax+b=0
Stabilire se una parola viene alfabeticamente prima di
un’altra
Somma di due numeri interi
Scrivere tutti gli n per cui l’equazione: Xn+Yn = Zn ha soluzioni
intere (problema di Fermat)
Ordinare una lista di elementi
Calcolare il massimo comun divisore fra due numeri dati.
Calcolare il massimo in un insieme.
….
2
10/10/2013
Risoluzione dei problemi

La descrizione del problema non fornisce (in
generale) un metodo per risolverlo.


Affinché un problema sia risolvibile è però necessario
che la sua definizione sia chiara e completa
Non tutti i problemi sono risolvibili attraverso l’uso
del calcolatore. Esistono classi di problemi per le
quali la soluzione automatica non è proponibile.
Ad esempio:



se il problema presenta infinite soluzioni
per alcuni dei problemi non è stato trovato un metodo
risolutivo
per alcuni problemi è stato dimostrato che non esiste un
metodo risolutivo automatizzabile
Risoluzione dei problemi

La risoluzione di un problema è il processo che,
dato un problema e individuato un opportuno
metodo risolutivo, trasforma i dati iniziali nei
corrispondenti risultati finali.

Affinché la risoluzione di un problema possa
essere realizzata attraverso l’uso del
calcolatore, tale processo deve poter essere
definito come sequenza di azioni elementari.
3
10/10/2013
Algoritmo


Un algoritmo è una sequenza finita di mosse che
risolve in un tempo finito una classe di problemi.
L'esecuzione delle azioni nell'ordine specificato
dall'algoritmo consente di ottenere, a partire dai dati di
ingresso, i risultati che risolvono il problema.
Metodo
Risolutivo
(algoritmo )
Esecutore
Dati
ESECUTORE
una macchina astratta
capace di eseguire le azioni
specificate dall’algoritmo.
Risultati
Algoritmi: proprietà

Eseguibilità: ogni azione dev’essere eseguibile
dall’esecutore in un tempo finito.

Non ambiguità: ogni azione deve essere
univocamente interpretabile dall'esecutore.

Finitezza: il numero totale di azioni da
eseguire, per ogni insieme di dati di ingresso,
deve essere finito.
4
10/10/2013
Algoritmi: proprietà (2)

Quindi, l’algoritmo deve:



essere applicabile a qualsiasi insieme di dati
di ingresso appartenenti al dominio di
definizione dell’algoritmo
essere costituito da operazioni appartenenti
ad un determinato insieme di operazioni
fondamentali
essere costituito da regole non ambigue,
cioè interpretabili in modo univoco
qualunque sia l’esecutore (persona o
“macchina”) che le legge.
Algoritmi e programmi



Ogni elaboratore è una macchina in grado di
eseguire azioni elementari su oggetti detti
DATI.
L’esecuzione delle azioni è richiesta
all’elaboratore tramite comandi elementari
chiamati ISTRUZIONI espresse attraverso un
opportuno formalismo: il LINGUAGGIO di
PROGRAMMAZIONE.
La formulazione testuale di un algoritmo in un
linguaggio comprensibile a un elaboratore è
detta programma.
5
10/10/2013
Programma

Un programma è un testo scritto in
accordo alla sintassi e alla semantica di
un linguaggio di programmazione.

Un programma è la formulazione
testuale, in un certo linguaggio di
programmazione, di un algoritmo che
risolve un dato problema.
Algoritmo & programma

Passi per la risoluzione di un problema:



individuazione di un procedimento risolutivo
scomposizione del procedimento in un insieme
ordinato di azioni  ALGORITMO
rappresentazione dei dati e dell’algoritmo attraverso
un formalismo comprensibile dal calcolatore
 LINGUAGGIO DI PROGRAMMAZIONE
Problema
Metodo risolutivo
Algoritmo
Programma
Linguaggio di Programmazione
6
10/10/2013
Algoritmi equivalenti

Due algoritmi si dicono equivalenti quando:




hanno lo stesso dominio di ingresso;
hanno lo stesso dominio di uscita;
in corrispondenza degli stessi valori del dominio di
ingresso producono gli stessi valori nel dominio di
uscita.
Due algoritmi equivalenti



forniscono lo stesso risultato
ma possono avere diversa efficienza
e possono essere profondamente diversi!
Algoritmi: esempi

Soluzione dell’equazione ax+b=0





leggi i valori di a e b
calcola -b
dividi quello che hai ottenuto per a e chiama x il
risultato
stampa x
Calcolo del massimo di un insieme



Scegli un elemento come massimo provvisorio max
Per ogni elemento i dell’insieme: se i>max eleggi i
come nuovo massimo provvisorio max
Il risultato è max
7
10/10/2013
Algoritmi: esempi
Stabilire se una parola P viene alfabeticamente
prima di una parola Q
leggi P,Q
ripeti quanto segue:






se prima lettera di P < prima lettera di Q
allora scrivi vero
altrimenti se prima lettera P > Q
 allora scrivi falso
 altrimenti (le lettere sono =) togli da P e Q la prima lettera
fino a quando hai trovato le prime lettere diverse.

Linguaggio & Programma

Dato un algoritmo, un programma è la
sua descrizione in un particolare
linguaggio di programmazione

Un linguaggio di programmazione è
una notazione formale che può essere
usata per descrivere algoritmi.
8
10/10/2013
Linguaggi di Programmazione
I linguaggi sono classificati in:

Low level
 Linguaggio macchina & Linguaggio
Assembly

High level
 C/C++, Pascal, Delphi, Java, Cobol….
Linguaggi di Programmazione




I linguaggi low level sono strettamente legati
all’architettura interna del computer
Ad ogni singola azione corrisponde una linea
di programma (rapporto 1 a 1)
I linguaggi high level sono più “vicini” al nostro
modo di pensare
Devono essere opportunamente tradotti per
essere compresi da un computer
9
10/10/2013
Relazione tra linguaggi di programmazione
START: MOV AX, BX
CMP AX, 12h
JZ EQUAL
INT 21h
RET
EQUAL: MOV BL, 82h
Linguaggio Assembly
Assemblatore
(Assembler)
void main ( ){
int x, y;
printf(“Hello world\n”);
if(x>=0)
stampa(y);
else
x++;}
// C/C++
Linguaggio High Level
Compilatore
o Interprete
Computer - Linguaggio
Macchina
Compilatore vs Interprete

I compilatori traducono automaticamente un
programma dal linguaggio L a quello
macchina (per un determinato elaboratore).



Durante la traduzione verificano la correttezza di
ciascuna istruzione.
La traduzione termina quando non ci sono più
errori sintattici.
Al termine della traduzione il programma è pronto
per essere eseguito.
10
10/10/2013
Compilatore vs Interprete

Gli interpreti sono programmi capaci di eseguire
direttamente un programma in linguaggio L istruzione
per istruzione.



Verificano la correttezza sintattica di ogni istruzione durante
l’esecuzione.
In presenza di istruzioni ripetute (cicli) queste sono verificate e
tradotte come se fossero da eseguire per la prima volta.
Prestazioni:

I programmi compilati sono in generale più efficienti e più
veloci di quelli interpretati.
Le fasi della compilazione:



Compilatore: opera la traduzione di un programma
sorgente (scritto in un linguaggio ad alto livello) in un
programma oggetto.
Linker: (collegatore) nel caso in cui la costruzione del
programma oggetto richieda l’unione di più moduli o
librerie (compilati separatamente), il linker provvede a
collegarli formando un unico programma eseguibile.
Debugger: consente di eseguire passo-passo un
programma, controllando via via quel che succede,
al fine di scoprire ed eliminare errori non rilevati in
fase di compilazione.
11
10/10/2013
Ambiente di sviluppo
Editor
File sorgente
Compilatore
Ambiente/Software
File oggetto
di Sviluppo
Debugger
Librerie
Linker
File eseguibile
Risultati
Programma
in memoria
Loader
S.O
Come sviluppare un programma

Qualunque sia il linguaggio di programmazione
scelto occorre:


Se il linguaggio è compilato:



Scrivere il testo del programma e memorizzarlo su
supporti di memoria permanenti (fase di editing);
Compilare il programma, ossia utilizzare il compilatore che
effettua una traduzione automatica del programma scritto in
un linguaggio qualunque in un programma equivalente
scritto in linguaggio macchina;
Eseguire il programma tradotto.
Se il linguaggio è interpretato:

Usare l’interprete per eseguire il programma.
12
10/10/2013
Definizione di un linguaggio
Aspetti caratteristici del linguaggio:

Esistenza di un insieme di parole chiave

Sintassi: l’insieme di regole formali per la
scrittura di programmi in un linguaggio, che
dettano le modalità per costruire espressioni
legali nel linguaggio stesso.

Semantica: l’insieme dei significati da attribuire
alle espressioni legali (sintatticamente corrette)
costruite nel linguaggio.
Sintassi di un linguaggio
Un vocabolario V è un insieme di simboli. L’insieme V* di tutte
le sequenze finite di simboli in V viene indicato come universo
linguistico.
 Esempio: Sia V={p,c}, allora V* contiene tutte le parole
composte con le due lettere di qualsiasi lunghezza e la parola
nulla (λ)
V*={λ,p,c,pp,pc,cp,cc,ppp,ppc,….}
 Un linguaggio L sul vocabolario V è un sottinsieme di V*
 un linguaggio costruito sull’insieme V={p,c} potrebbe essere
costituito da tutte le parole in cui la p compare in posizione pari

L  { , c, cp, cc, ccc, cpc, cccp,}  V*
13
10/10/2013
Sintassi di un linguaggio



La definizione della sintassi di un linguaggio
è legata alla determinazione dei limiti del
sottoinsieme V*
Limiti che devono consentire la definizione di
una rappresentazione finita.
Tali limiti possono essere imposti attraverso
la formalizzazione di una grammatica
Grammatica di un linguaggio
Si definisce grammatica G=<V,N,S,P> dove:
 V è il vocabolario e i simboli sono detti simboli
terminali
 N è un insieme disgiunto da V, i cui elementi sono
detti categorie sintattiche
 S è un elemento di N detto simbolo iniziale
 P è un insieme di relazioni di N su (N U V)* detto
produzioni o regole sintattiche, definito come
sottoinsieme del prodotto cartesiano N x (N U V)*
p = <n, η> oppure n→η

con:
nN e η sequenza di elementi appartenenti o ad N o a V
14
10/10/2013
Esempio di grammatica




S = frase;
V = {UN, GATTO, MANGIA, TOPO, VELOCEMENTE, GIRA,
LENTAMENTE, BIANCO, IL, GRASSO, MAGRO};
N = {frase, soggetto, predicato, frase-nominale, lista-di-aggettivi,
articolo, nome, aggettivo, verbo, avverbio};
P={
frase→soggetto predicato,
soggetto →frase_nominale,
frase_nominale → articolo nome aggettivo,
frase_nominale → articolo nome,
articolo →”UN”, articolo →”IL”,
nome →”Gatto”, nome →”Topo”,
predicato →verbo frase_nominale, predicato →verbo avverbio,
verbo →”Gira”, verbo →”Mangia”,
aggettivo →”Grasso”, aggettivo →”Magro”,
avverbio →”Lentamente”, avverbio →”Velocemente”
….
}
Grammatica e linguaggio

Una grammatica definisce un linguaggio se valgono le seguenti
regole
Derivazione diretta

Siano pre e post elementi di (N U V)*. Sia a0N e 1 (N U V)*.
Si dice che pre 1 post deriva direttamente da pre a0 post, e si
indica con:
1 pre  post
pre a0 post →
1
se P contiene la produzione a0→1
Esempio:
1
articolo nome aggettivo →
articolo “Gatto” aggettivo
nome →”Gatto”
15
10/10/2013
Grammatica e linguaggio
Derivazione indiretta:
 Sia 0 e N elementi in (N U V)*. Si dice che N deriva 0 , e si
indica con:
0 → N
se esiste una sequenza di elementi i (N U V)* tali che:
1
i [1,N] i-1→
i
Esempio:
frase_nominale → “IL” “Gatto” “Magro”
Produzioni:
frase_nominale → articolo nome aggettivo
nome →”Gatto”
articolo →”IL”
aggettivo → “Magro”
Grammatica e linguaggio

Un linguaggio LG definito dalla grammatica
G=<V,N,S,P> sul vocabolario V è l’insieme
degli elementi di V* che derivano dal simbolo
iniziale S attraverso le categorie sintattiche N
e le produzioni P
16
10/10/2013
Produzioni descritte
mediante Diagrammi Sintattici

frase
Frase nominale

Mangi
a
Frase nominale
Gira
Velocement
e
Frase nominale
Un
Gatto
Il
Topo
Aggettivo
Esempio: espressioni aritmetiche
Definire un linguaggio per cui:
a+b*(c-d) è legale mentre a+b-*c non lo è





a, b, c e d sono delle variabili  l’insieme che le contiene lo
chiamiamo var = {a,b,c,…,pippo,….}
+,-,/,* sono gli operatori
(,) indicano una precedenza
Da un punto di vista simbolico il vocabolario V del linguaggio è
costituito da questi simboli:
V = var U {+,-,*,/,(,)}
Poiché stiamo considerando espressioni aritmetiche, possiamo
denotare con expr una categoria sintattica e assumerla come
simbolo iniziale della grammatica:
S = expr
17
10/10/2013
Esempio: espressioni aritmetiche

Produzioni:

expr→var




Una espressione legale tra parentesi è essa stesa una
espressione legale
expr → expr op expr



una variabile è essa stessa una espressione legale
expr →(expr)
Una combinazione di due espressioni legali per mezzo di un
operatore op è ancora una espressione legale
op costituisce anche una categoria sintattica costruita sugli
operatori +,-,*,/
op →+, op →-, op →*, op →/

Produzioni associate ad op
Esempio: espressioni aritmetiche

Categorie sintattiche N
N = {expr, var, op}


Nota: var vale anche come categoria sintattica
Insieme delle produzioni P
P = { expr→var , expr→expr , expr→(expr) ,
expr→expr op expr, op→+, op→-, op→*,
op→/, var→a, …..}
18
10/10/2013
Esempio: espressioni aritmetiche

Verifica se a+b*(c-d) è un espressione legale ovvero si può
ridurre al simbolo iniziale expr
Essendo a, b, c e d simboli di var:
var+var*(var-var) → a+b*(c-d)
Applicando expr→var più volte

Applicando le produzioni di op più volte

Applicando poi expr → expr op expr e expr →(expr)

E nuovamente expr → expr op expr

Concatenando il tutto (tornando indietro)
expr → a+b*(c-d)


expr+expr*(expr - expr ) → var+var*(var-var)
expr op expr op (expr op expr ) → expr+expr*(expr - expr )
expr op expr → expr op expr op (expr op expr )
expr → expr op expr
Esempio: espressioni aritmetiche



Nel caso a+b-*c applicando le produzioni si
arriva al caso:
expr op op expr → a+b-*c
Ci si ferma perché non esiste alcuna regola
di produzioni da applicare
L’espressione non può essere ridotta al
simbolo iniziale expr e pertanto l’espressione
di partenza non è legale
19
10/10/2013
Albero sintattico
Nodo radice


Il processo di riduzione visto
nell’esempio può essere
convenientemente
rappresentato attraverso un
albero sintattico
Un albero è una struttura
costituita da un insieme di nodi
sui quali è definita una
relazione di successione



Nodi
intermedi
Livello i
Nodi foglia
Un nodo ha un unico
predecessore e più
 Nell’albero sintattico:
successori
 I nodi rappresentano simboli
Il nodo che non ha
elementari e produzioni
predecessori è definito radice
 Gli archi esprimono le relazioni
(root) dell’albero
di derivazione diretta tra nodi in
Nodi senza successori si
base all’insieme P della
definiscono nodi foglia
grammatica
Albero sintattico

Validità - Data una sequenza di simboli del vocabolario, se sulla
sequenza può essere costruito un albero che si chiude su una
radice (simbolo iniziale) allora la sequenza costituisce un’istanza
della categoria sintattica associata alla radice stessa


(a) e (b) sono valide ed esprimono due diverse forme di riduzione
per l’espressione a+b*(c-d)
(c) mostra l’albero non richiudibile sul simbolo iniziale per
l’espressione non legale a+b-*c
20
10/10/2013
Ambiguità

a+b*(d-c) produce 2 alberi sintattici validi ma genera Ambiguità

Da evitare con la definizione di regole di precedenza
nell’applicazione delle riduzioni ad esempio sugli operatori
aritmetici
Definizione: Una grammatica è ambigua se: esiste almeno una
stringa di simboli terminali che ammette più alberi di derivazione

Ambiguità di una grammatica

La riduzione dell’ambiguità di una grammatica può essere
raggiunta con l’introduzione di nuove categorie sintattiche e
regole di produzione aggiuntive
nel caso della grammatica delle espressioni aritmetiche
introduzione di regole che definiscono le precedenze degli
operatori aritmetici.
Categorie sintattiche:




fatt (fattore)
term (termine)
expr (espressione)
Regole di produzione modificate
 <expr>::=<expr> “+” < term > |<expr> “-” < term > | < term >
 <term>::=< term >”*”< fatt > | < term > “/” < fatt > | < fatt >
 < fatt >::=“(“< expr >”)” | <var>
21
10/10/2013
Ambiguità di una grammatica

Verifica: a+b*c








var+var*var
var+fatt*fatt
var+term*fatt
var+term
fatt+term
term+term
expr+term
expr
<expr>::=<expr> “+” <term> |<expr> “-” <term> | <term>
<term>::=< term >”*”< fatt > | <term> “/” <fatt> | <fatt>
<fatt>::=“(“<expr>”)” | <var>
Codifica BNF



I diagrammi sintattici consentono di descrivere l’insieme delle
produzioni P.
Esiste un formalismo alternativo che semplifica la rappresentazione
delle produzioni: BNF (Backus Naur Form)
Convenzioni BNF:





η::= n significa che P contiene la produzione η→ n
η::= n1 | n2 significa che P contiene le produzioni η→n1 e η→ n2 e che sono
alternative
η::= npre [n] npost significa che P contiene le produzioni η→ npre npost e η→ npre
n npost , e che n è opzionale
η::= npre {n}min npost significa che P contiene le produzioni che riducono η ad
una sequenza aperta npre e chiusa da npost e che può contenere un numero di
ripetizioni del termine n variabile tra il min e max. Se non specificati è valido
un qualunque numero >=0
EBNF (Extended Backus Naur Form) è una estensione della
precedente, dove le categorie sintattiche sono definite racchiuse tra
parentesi angolari < >
22
10/10/2013
Esempio




S = frase;
V = {UN, GATTO, CANE, MONTE, MANGIA, TOPO, VELOCEMENTE,
GIRA, LENTAMENTE, BIANCO, IL, GRASSO, MAGRO};
N = {frase, soggetto, predicato, frase-nominale, lista-di-aggettivi, articolo,
nome, aggettivo, verbo, avverbio};
P = { “Rappresentazione EBNF”}
Rappresentazione EBNF:
<frase> ::= <soggetto> <predicato> “.”
<soggetto> ::= <frase-nominale>
<predicato> ::= <verbo> (<frase-nominale> |
<avverbio>)
<frase-nominale> ::= <articolo> <nome> [<lista-diaggettivi>]
<lista-di-aggettivi> ::= <aggettivo> {“,” <aggettivo>}
<articolo> = “UN” | “IL”
<nome> ::= “GATTO” | “TOPO” |
”MONTE” | “CANE”
<aggettivo:: = “NERO” |
“BIANCO” | “MAGRO” |
“GRASSO”
<verbo> ::= “GIRA” | “MANGIA”
<avverbio> ::= “VELOCEMENTE”
| “LENTAMENTE”
( | = oppure; { } = ripetizione; ( ) = raggruppano alternative con una sola occorrenza;
[ ] = parte opzionale)
Esempio

Per la grammatica delle espressioni
aritmetiche:
P = { expr→var , expr→expr , expr→(expr) ,
expr→expr op expr, op→+, op→-, op→*, op→/,
var→a, …..}

In EBNF le regole di produzione diventano:



<expr>::= <var> | <expr><op><expr>| “(“<expr>”)” | <expr>
<op>::= + | - | * | /
<var> ::= a | b | c | ….
23
10/10/2013
Grammatica Contestuale (Cenni)

Là dove le regole di produzione non sono in grado di risolvere il problema di
ambiguità o dove servano delle condizioni di applicazione si ricorre a
caratterizzare la grammatica con “vincoli contestuali” attraverso annotazioni
complementari  Grammatica contestuale

Esempio di vincoli (linguaggio di programmazione):




numero parametri attuali = parametri formali
un identificatore deve essere dichiarato prima dell’uso
compatibilità dei tipi in un assegnamento
ecc

Nonostante aumenti la complessità della grammatica aumenta la
comprensibilità

Il processo di interpretazione si articola ora in 3 fasi



Verifica lessicale: l’espressione appartiene all’universo linguistico V* (è composta da
simboli del vocabolario V)
Verifica sintattica: l’espressione è legale
Verifica contestuale: le espressioni legali sono comparati contro i vincoli contestuali
Semantica e Sintassi

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 – in grassetto le frasi valide





il gatto mangia il topo
il topo mangia il monte
il cane mangia il topo
il monte beve il cane
La semantica di un’espressione legale consiste nel
valore  che questa restituisce
24
10/10/2013
Semantica e Sintassi

Si consideri le espressioni della logica Booleana
<expr>::= var | “(“<expr>”)”|<expr1> | <expr1><expr2>|
<expr1><expr2>

<expr>::=<var>  (<expr>) = (<var>)





Nel caso di variabili booleane il valore restituito da (<var>) vale
true o false;
<expr>::=“(“<expr1>”)”  (<expr>) = (<expr1>)
<expr>::= <expr1> (<expr>) = (<expr1>)
<expr>::= <expr1><expr2> (<expr>) = (<expr1>) 
(<expr2>)
<expr>::= <expr1>  <expr2> (<expr>) = (<expr1>) 
(<expr2>)
Operatori booleani
A
B
AB
A
A
A
B
AB
0
0
0
0
1
0
0
0
0
1
1
1
0
0
1
0
1
0
1
1
0
0
1
1
1
1
1
1
OR
NOT
AND
25
10/10/2013
Sematica e Sintassi

Valutazione semantica
dell’espressione:





a  (b  c)
assumendo a=true, b=false
e c=false
e indicando Ttrue e
Ffalse
Si costruisce l’albero
sintattico e si valutano le
espressioni intermedie con

Il valore di <expr> è true
26