MODULO 2 - Linguaggi di Programmazione

Transcript

MODULO 2 - Linguaggi di Programmazione
Materiale didattico preparato dal
dott. Stefano Ferilli
Corso di Programmazione
Linguaggi di Programmazione
Dott. Pasquale Lops
[email protected]
Università degli Studi di Bari
Dipartimento di Informatica
Corso di Programmazione - DIB
1/47
Linguaggio
• Insieme di sequenze di simboli
appartenenti ad un definito lessico,
posti in sequenza secondo una opportuna
grammatica o sintassi)
• Per descriverlo è necessario un
meta-linguaggio
– Linguaggio che parla di un linguaggio
Corso di Programmazione - DIB
2/47
Messaggio
• Sequenza di frasi espresse in un
linguaggio
– Analizzabile dal punto di vista
• Sintattico
– Si verifica la forma linguistica in cui è codificato
(sintassi)
• Semantico
– Si individua il significato associato alla forma
linguistica (semantica)
Corso di Programmazione - DIB
3/47
1
Comunicazione Diretta
• Requisiti per i due interlocutori:
l’estensore del messaggio
– al momento della sua formulazione
e il ricevitore
– al momento della ricezione
diano al messaggio eguale significato
Corso di Programmazione - DIB
4/47
Comunicazione Indiretta
• Cause:
– Il ricevitore non conosce il linguaggio usato per
la stesura del messaggio
– Estensore e ricevitore hanno un diverso grado
di conoscenza del linguaggio
– Tra i due mancano adeguate convenzioni per
un’interpretazione unica del messaggio
• Occorre un traduttore
Corso di Programmazione - DIB
5/47
Programma
• Messaggio di comunicazione fra l’uomo e
la macchina
– Insieme di frasi costruite secondo regole molto
rigide
• Eliminazione di ambiguità nell’interpretazione dei
comandi da parte della macchina
– Necessità di linguaggi molto precisi
• Le istruzioni obbediscono a rigorose regole
grammaticali
Corso di Programmazione - DIB
6/47
2
Sistema di Calcolo
• Gerarchia di componenti software e hardware
– Software applicativo (es. pacchetti ad usi speciali)
• Insieme di programmi da utilizzare per applicazioni particolari
• Generalmente scritti in un linguaggio ad alto livello
• Forniti direttamente da costruttori di computer o ditte
specializzate nella produzione di programmi
– Software di sistema (sistemi operativi, traduttori, ecc.)
• Insieme dei programmi che forniscono servizi e svolgono
funzioni vitali per il software applicativo
– Hardware (CPU, memorie, dispositivi di I/O, ecc.)
Corso di Programmazione - DIB
7/47
Comunicazione Uomo-Macchina
• Processore nudo
– La macchina comprende il linguaggio macchina
• Costituito da un insieme di istruzioni elementari
• Ogni istruzione è una stringa di cifre binarie che specifica
un’operazione e la cella di memoria implicata nell’operazione
• Processore vestito
– Macchina in grado di comprendere un linguaggio di
livello superiore
• Usato per facilitare il compito di programmare la soluzione di
un problema
Corso di Programmazione - DIB
8/47
Linguaggio Naturale
• Usato per la comunicazione verbale fra esseri
umani
– Fonti di ambiguità:
• Evoluzione
– Neologismi, Arcaismi
• Polisemia
– Parole con significati differenti a seconda del contesto
• Intrinseca
– …una vecchia porta la sbarra…
– Inadatto alla comunicazione con la macchina
Corso di Programmazione - DIB
9/47
3
Linguaggi di Programmazione
• A basso livello
• Ad alto livello
– Più vicini alla struttura
reale della macchina ed
al suo linguaggio
– Più vicini al linguaggio
dei problemi
– Più facili da
comprendere per
l’uomo
– Portabili
• Utilizzabili, senza
modifiche, su diversi
tipi di macchine
Corso di Programmazione - DIB
10/47
Linguaggi di Programmazione
ad alto livello
• Procedurali
• Non procedurali
– Descrivono i passi
necessari per ottenere i
risultati desiderati
– Esprimono le proprietà
dei risultati che si
vogliono ottenere
• “come”
• “cosa”
– Basati sui concetti di
• Variabile
• Assegnamento
– Esempio
Radice quadrata di y
• Quel valore x tale che
x*x = y
Corso di Programmazione - DIB
11/47
Linguaggi di Programmazione
Sintassi
• L’insieme delle regole che indicano quali
sono le istruzioni formali permesse
– Poche, semplici, rigide
• Il programma va accuratamente controllato
dal punto di vista formale per garantire la
correttezza sintattica
– Codifica ambigua o non interpretabile
• Controllo delegato al traduttore
Corso di Programmazione - DIB
12/47
4
Linguaggi di Programmazione
Semantica
• Riguarda il contenuto informativo ed il
significato di una frase
– Il lavoro più grosso è verificare e controllare il
programma sul fronte logico per garantire la
correttezza a livello semantico
• Informazione trasmessa non corrispondente allo
scopo desiderato
– Connessa all’analisi del problema e l’algoritmo
Corso di Programmazione - DIB
13/47
Sintassi e Semantica
Esempio
• “Io ho andato”
– Errata sintatticamente
• “La penna sta mangiando”
– Corretta sintatticamente
• Forma
– Errata semanticamente
• Significato
Corso di Programmazione - DIB
14/47
Traduttore
• Programma che traduce in linguaggio macchina
programmi in un linguaggio di livello superiore
– Analizza i messaggi (comandi) e verifica che siano
scritti (codificati) in un linguaggio a lui noto
• Correttezza sintattica
– Attribuisce alle sequenze di simboli l’opportuno
significato in modo da eseguire le giuste azioni
• Interpretazione unica di ogni istruzione
– Fa parte del software di sistema
• Livello intermedio della gerarchia software-hardware
Corso di Programmazione - DIB
15/47
5
Traduttori
• Nei programmi ad alto livello operano su
due tipi di entità:
– Istruzioni
• Molto più potenti che nel linguaggio macchina
– Strutture di dati (liste, sequenze, alberi, ecc.)
• Non direttamente disponibili al livello di linguaggio
macchina
• Devono essere rappresentate in termini di bit,
indirizzi e legami tra locazioni
Corso di Programmazione - DIB
16/47
Traduttori
Processore
nudo
Processore
vestito
Linguaggio di Traduzione
Programmazione
Linguaggio
Macchina
• Interpreti
• Compilatori
– Specifici per ogni linguaggio
– Forniti entrambi dai sistemi di sviluppo del
software per i linguaggi supportati
Corso di Programmazione - DIB
17/47
Interpretazione
• Dopo l’analisi sintattica, la traduzione
procede passo passo con l’esecuzione
– Traduzione ed esecuzione istruzione per
istruzione
• Ogni istruzione tradotta tante volte quante viene
eseguita
Programma
Dati
Interprete
Risultati
Corso di Programmazione - DIB
18/47
6
Compilazione
• Il programma originale (Sorgente) è
analizzato sintatticamente e tradotto in
codice oggetto, quindi eseguito
– Traduzione completamente effettuata prima che
cominci l’esecuzione
• Ogni istruzione è tradotta una sola volta
Programma
Codice
Oggetto
Compilatore
Macchina
Fisica
Dati
Risultati
Corso di Programmazione - DIB
19/47
Interpreti vs. Compilatori
Programma sorgente
residente in memoria
Programma sorgente
non residente in memoria
+ Semplici
– Efficienti
+ Ottimizzabili
+ Efficienti
Tempo e Spazio
Tempo e Spazio
+ Interattivi
+ Errori comprensibili
– Interattivi
+ Errori scoperti prima
Riferiti al sorgente
Riferiti al codice oggetto
Corso di Programmazione - DIB
20/47
Processo di Compilazione
Fasi
• Analisi Lessicale
– Divisione della stringa di caratteri del programma in
token
• Segni di interpunzione, nomi di dati, operatori, parole riservate
• Analisi Sintattica
– Definizione della struttura sintattica del programma
usando le regole grammaticali del linguaggio
• Generazione del Codice
– Generazione di appropriate istruzioni in linguaggio
macchina per ogni elemento sintattico del programma
• L’insieme finale di queste istruzioni è il programma oggetto
Corso di Programmazione - DIB
21/47
7
Processo di Compilazione
• Le fasi sono tra loro interrelate
– I moduli di programma responsabili dell’analisi
sintattica possono utilizzare
• I moduli dell’analisi lessicale per ottenere un token
• I moduli di generazione del codice per produrre il
codice oggetto dell’istruzione analizzata
• Per capire come vengono effettuate le
analisi è necessaria la teoria dei linguaggi
Corso di Programmazione - DIB
22/47
Alfabeto
• Insieme finito e non vuoto di simboli
primitivi (caratteri) tramite i quali è
possibile costruire gli elementi base del
linguaggio
– Esempio:
Alfabeto dei numeri reali
A = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0, +, –, .}
• 23
354.35
–86.6
+5589.0
Corso di Programmazione - DIB
23/47
Concatenazione di Simboli
di un alfabeto
• L’oggetto ottenuto prendendo nell’ordine i
simboli da concatenare
– Esempio:
Dato l’alfabeto per i numeri reali
• La concatenazione di 3 e 4 è 34
• La concatenazione di +, 4, 7, . e 5 è +47.5
• La concatenazione di 4, ., 7, . e 5 è 4.7.5 !!!!
– Non tutte le sequenze di simboli che si possono costruire
sono frasi significative del linguaggio
Corso di Programmazione - DIB
24/47
8
Stringa o Parola
su un alfabeto
• Sequenza di simboli ottenuta come concatenazione
di un numero finito di elementi dell’alfabeto
– Λ denota la stringa non contenente alcun simbolo
(parola vuota)
• La concatenazione di due parole
– Parola formata dai simboli della prima seguiti da quelli
della seconda
– Esempi:
Λp = pΛ = p
per ogni parola p
la concatenazione di +3 con 4.5 è +34.5
Corso di Programmazione - DIB
25/47
Prodotto di Insiemi di Parole
su un alfabeto
• Insieme ottenuto concatenando ogni parola
di un insieme con ogni parola dell’altro
– Esempio:
concatenando {1, 21, 1.4} con {2, 398}
si ottiene {12, 1398, 212, 21398, 1.42, 1.4398}
Corso di Programmazione - DIB
26/47
Potenza di un Alfabeto A
• A è un particolare insieme di parole su A
– Si possono considerare i prodotti
• AA
• AAA
• …
– Esempio:
per l’alfabeto dei numeri reali fanno parte di A3
• 213
3.5
–29
+55
21.
.65
4..
…
– Le ultime due stringhe non fanno parte dei numeri reali
Corso di Programmazione - DIB
27/47
9
Potenza
di un Alfabeto A
• An
– Parole costituite da n simboli dell’alfabeto A
•
•
•
•
•
A0 = {Λ}
A1 = A
A2 = AA
A3 = AAA
…
– n è detta lunghezza della parola
Corso di Programmazione - DIB
28/47
Chiusura
di un Alfabeto A
• Bisogna delimitare l’universo linguistico
esprimibile
– Tutte le possibili parole di lunghezza finita costituite da
simboli dell’alfabeto
• A+ = A1 ∪ A2 ∪ … ∪ An ∪ …
– Insieme di tutte le parole su A di lunghezza finita
• Unione di tutti gli insiemi di parole di varia lunghezza
• A* = {Λ} ∪ A+
– Chiusura di A
Corso di Programmazione - DIB
29/47
Linguaggio
su un alfabeto A
• Un sottoinsieme di A*
– Tra le parole di A* ci sono parole ammesse nel
linguaggio e parole non ammesse
• Linguaggio Generato da una Grammatica
– Insieme delle frasi costruite, a partire
dall’alfabeto, secondo le regole specificate da
una grammatica
Corso di Programmazione - DIB
30/47
10
Simboli Non Terminali
• Non fanno parte dell’alfabeto
– Sono variabili
– Rappresentano opportune sequenze di simboli
• Nomi che specificano le categorie sintattiche
– Componenti delle frasi del linguaggio generato dalla
grammatica
• Il loro insieme è detto alfabeto dei simboli
non terminali
– Su di esso è costruito il metalinguaggio
Corso di Programmazione - DIB
31/47
Simboli Non Terminali
Esempio
• Linguaggio naturale
– Parole classificate in
• frase, soggetto, predicato, articolo, nome, verbo, ecc.
– <soggetto > → <articolo> <nome>
il
cane
• Linguaggio algebrico
– <formula> → <variabile> = <espressione aritmetica>
x
=
y + z * 12
Corso di Programmazione - DIB
32/47
Regola o Produzione
• Coppia ordinata di parole (p, q) tale che, se
– A è l’alfabeto dei simboli terminali
– N è l’alfabeto dei simboli non terminali
p e q possono appartenere tanto ad A* ∪ N*
• Scriviamo p → q
• “la stringa p produce la stringa q”
• “la stringa p può essere riscritta come q”
– p (≠ Λ) è detta parte sinistra
– q è detta parte destra
Corso di Programmazione - DIB
33/47
11
Regola o Produzione
Convenzione
• Le parti destre di produzioni con la stessa
parte sinistra si possono riunire come
alternative in un’unica parte destra,
separate col simbolo | (“oppure”)
– Esempio
p→q
p→r
si può compattare in
p→q|r|s|t
p→s
p→t
Corso di Programmazione - DIB
34/47
Grammatica
• Insieme delle regole che consentono di
definire, tra tutte le possibili sequenze di
simboli di lunghezza finita che si possono
costruire, quelle lecite (frasi)
– Le regole di formazione delle frasi del
linguaggio si dicono regole di produzione
• Coinvolgono simboli dell’alfabeto ed altri simboli
che rappresentano categorie sintattiche
Corso di Programmazione - DIB
35/47
Grammatica
• Quadrupla [Chomsky]
G = < A, N, α, P >
–A
–N
–α
–P
alfabeto terminale
alfabeto non terminale
scopo della grammatica
(simbolo di partenza)
insieme delle regole di produzione
Corso di Programmazione - DIB
36/47
12
Grammatica
Esempio
• Grammatica che genera il linguaggio dei
numeri pari
– A = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
– N = {α, β}
• α indica il numero pari
– Scopo per cui costruiamo la grammatica
• β indica un numero qualunque
– P = { α → βα | 0 | 2 | 4 | 6 | 8,
β→ 0|1|2|…|8|9|
β0 | β1 | β2 | … | β8 | β9 }
Corso di Programmazione - DIB
37/47
Grammatica
Esempio
• A = {il, la, cane, donna, mangia, dorme}
• N={
<frase>, <soggetto>,
<articolo>, <nome>, <verbo>}
• α = <frase>
• P={
<frase> → <soggetto> <verbo>
<soggetto> → il <nome> | la <nome>
il <nome> → il cane
la <nome> → la donna
<verbo> → dorme | mangia
}
Corso di Programmazione - DIB
38/47
Generazione di Stringhe
• Una stringa di terminali e non, S1, genera un’altra
stringa S2
– Direttamente (S1 ⇒ S2)
– Indirettamente (S1 ⇒* S2)
se quest’ultima si ottiene dalla prima applicando
– Una produzione
– Una sequenza di produzioni
della grammatica
Corso di Programmazione - DIB
39/47
13
Forma (Normale) di Backus-Naur
BNF
• Notazione per scrivere la grammatica
– Usata per specificare la sintassi di un
linguaggio di programmazione
• Simboli non terminali scritti fra parentesi
angolari <…>
• Simbolo → sostituito da ::=
Corso di Programmazione - DIB
40/47
Forma di Backus-Naur
Esempio
• Grammatica per i numeri pari (infiniti)
– <numero pari>::= 0 | 2 | 4 | 6 | 8 |
<numero><numero pari>
– <numero> ::= 0 | 1 | 2 | … | 8 | 9 |
<numero> 0 | … | <numero> 9
– 64932 è ottenibile?
• <numero pari>::= <numero><numero pari> ::=
<numero>2 ::= <numero>32 ::= <numero>932 ::=
<numero>4932 ::= 64932
Corso di Programmazione - DIB
41/47
Forma di Backus-Naur
Esempio
• Grammatica per le stringhe palindrome
– Simmetria speculare
– <frase> ::= Λ
– <frase> ::= a<frase>a
– <frase> ::= b<frase>b
• È possibile derivare infinite stringhe
Corso di Programmazione - DIB
42/47
14
Carte Sintattiche
• Grafi costituiti da blocchi uniti da frecce
– Blocchi arrotondati
• Simboli terminali del linguaggio
– Blocchi rettangolari
• Simboli non terminali
– Rimandi alla corrispondente carta sintattica
– Frecce
• Indicano le vie percorribili per costrutti validi
– I bivi rappresentano possibilità alternative
Corso di Programmazione - DIB
43/47
Carte Sintattiche
• Iniziando dalla carta principale, seguire le frecce
– Quando si dipartono scegliere una strada
• Attraversando un blocco arrotondato
– Trascriverne il contenuto
• Attraversando un blocco rettangolare, passare alla
carta corrispondente e seguirla
– Ogni carta ha esattamente un inizio e una fine, come il
blocco
Corso di Programmazione - DIB
44/47
Carte Sintattiche
• Ogni traiettoria percorsa nel verso delle
frecce definisce un costrutto sintattico
valido del linguaggio
• Tutti i simboli terminali incontrati nel
percorso ed in quella data sequenza
costituiscono una frase legale del linguaggio
Corso di Programmazione - DIB
45/47
15
Carte Sintattiche
Esempio
Corso di Programmazione - DIB
46/47
Carte Sintattiche
Esempio
• Identificatore:
– Lettera seguita (eventualmente) da lettere o cifre
• <identificatore> ::= <lettera> | <lettera><stringa alfanumerica>
• <stringa alfanumerica> ::= <lettera> | <cifra> |
<lettera><stringa alfanumerica> |
<cifra><stringa alfanumerica>
• <lettera> ::= a | b | c | d | e | f | g | h | … | z
• <cifra> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
lettera
lettera
cifra
Corso di Programmazione - DIB
47/47
16