informatica 3 lezione 2: sintassi e semanticahome.deib.polimi.it/comai/info3/file/lezione 2 -...
TRANSCRIPT
Politecnico di Milano - Prof. Sara Comai 1
LEZIONE 2: Sintassi e semantica
• Modulo 1: Introduzione ai concetti di sintassi e semantica
• Modulo 2: Il concetto di binding• Modulo 3: Variabili• Modulo 4: Routine – Convenzioni dei nomi
Informatica 3
Politecnico di Milano - Prof. Sara Comai 2
Lezione 2- Modulo 1
Introduzione ai concetti di sintassi e semantica
Informatica 3
Politecnico di Milano - Prof. Sara Comai 3
Le componenti di un linguaggio di programmazione
• Un linguaggio di programmazione è una notazione formale caratterizzata da due componenti: – Sintassi: insieme di regole formali che specificano
la composizione di programmi• Per determinare se un programma è valido
– Semantica: insieme di regole che specificano il “significato” di un programma sintatticamente valido
• Per determinare l’effetto di un programma– Notazioni formali– Semantica operazionale: comportamento di un processore
astratto che esegue il programma scritto nel linguaggio di programmazione
Politecnico di Milano - Prof. Sara Comai 4
Sintassi di un linguaggio
• Sintassi: regole che definiscono le sequenze valide di simboli– Frasi come sequenze di parole– Parole: definite su un alfabeto
• Regole lessicali: insieme di caratteri che costituiscono l’alfabeto del linguaggio
– Esempi:• Caratteri maiuscoli e minuscoli differiscono in C/C++ ma
sono identici in Pascal• L’operatore “diverso” è: != in C/C++ e <> in Pascal
Politecnico di Milano - Prof. Sara Comai 5
EBNF – regole sintattiche
EBNF=Extended Backus Naur FormMetalinguaggio con metasimboli ::= < > | * +
• Regole sintattiche: <programma> ::= { <istruzione>* }<istruzione> ::= <assegnamento> | <condizione> |
<ciclo><assegnamento> ::= <identificatore> = <espr> ;<condizione> ::= if <espr> { <istruzione> + } |
if <espr> { <istruzione> + } else { <istruzione> + }
<ciclo> ::= while <espr> { <istruzione> + }<espr> ::= <identificatore> | <numero> |
( <espr> ) | <espr> <operatore> <espr>
non terminale
non terminale definito da regole lessicali
terminale
Politecnico di Milano - Prof. Sara Comai 6
EBNF – regole lessicali
• Regole lessicali:
<operatore> ::= + | - | * | / | = | /= | < | > | <= | >=<identificatore> ::= <lettera> <ld>*<ld> ::= <lettera> | <cifra><numero> ::= <cifra>+<lettera> ::= a | b | c | . . . | z<cifra> ::= 0 | 1 | . . . | 9
Politecnico di Milano - Prof. Sara Comai 7
Diagrammi sintattici
istruzione
{ }programma
ciclo
istruzioneassegnamento
condizione
identificatore =assegnamento
espressione
Politecnico di Milano - Prof. Sara Comai 8
Diagrammi sintattici
istruzione{ }condizione
if espressione
istruzione{ }else
istruzione{ }ciclo
while espressione
espressioneespressione operatore espressione
identificatore
numero
espressione{ }
Politecnico di Milano - Prof. Sara Comai 9
• Costrutti in linguaggi diversi possono avere la stessa struttura concettuale, ma avere regole lessicali diverse:
– Stessa sintassi astratta– Diversa sintassi concreta
Sintassi astratta e concreta
while (x!=y){…
}
while x<>y dobegin…
end
Politecnico di Milano - Prof. Sara Comai 10
Sintassi concreta e usabilità
• <> è più leggibile di !=
• Se il ciclo contiene una singola istruzione le { } possono essere omesse– Facile commettere errori!!
while (num!=0){cin >> num;
}
while (num!=0)cin >> num;
while num <> 0 do…
end
Politecnico di Milano - Prof. Sara Comai 11
Lezione 2- Modulo 2
Il concetto di binding
Informatica 3
Politecnico di Milano - Prof. Sara Comai 12
Il concetto di binding
• I programmi sono costituiti da entità– variabili, routine, istruzioni
• Le entità sono caratterizzate da attributi– Variabile: nome, tipo, area di memoria– Routine: nome, parametri, modalità di passaggio
parametri• Binding: associa un valore agli attributi
• Per ogni entità le informazioni sulle entità sono contenute in un descrittore
Politecnico di Milano - Prof. Sara Comai 13
Binding
• Concetto fondamentale nella definizione della semantica di un linguaggio– Linguaggi diversi presentano
• Un numero di entità diverse• Un numero di attributi diversi per ogni entità• Tempi di binding diversi (es. a tempo di compilazione o
esecuzione)• Stabilità differenti di binding (fissi o modificabili)
– Binding statico: non può essere modificato– Binding dinamico: modificabile durante l’esecuzione
Politecnico di Milano - Prof. Sara Comai 14
Linguaggi e binding
• Binding definito dalla definizione del linguaggio: – Esempio: interi insieme di operazioni eseguibili (Fortran,
Ada, C, C++)• Binding definito dall’implementazione del linguaggio:
– Esempio: interi rappresentazione in memoria (Fortran, Ada, C, C++)
• Binding definito a tempo di compilazione:– Esempio: in Pascal il binding degli interi avviene durante la
compilazione• Binding definito a tempo di esecuzione:
– Maggior parte dei linguaggi di programmazione– Esempio alle variabili vengono associati dei valori durante
l’esecuzioneBinding dinamico
Politecnico di Milano - Prof. Sara Comai 15
Lezione 2- Modulo 3
Variabili
Informatica 3
Politecnico di Milano - Prof. Sara Comai 16
Variabili
• I linguaggi di programmazione possono essere visti come un’astrazione del comportamento dei computer convenzionali: – Memoria centrale consiste di celle elementari identificate da un
indirizzo– Il contenuto di una cella rappresenta un valore (codificato)– Il valore può essere modificato (nuova codifica) durante
l’esecuzione di un programma
– Variabile: astrazione del concetto di cella di memoria– Nome di variabile: astrazione dell’indirizzo della cella di memoria– Istruzione di assegnamento: astrazione della modifica del valore di
una cella
• Formalmente: variabile = <nome, scope, tipo, l-value, r-value>
Politecnico di Milano - Prof. Sara Comai 17
Nome e regole di visibilità
variabile = <nome, scope, tipo, l-value, r-value>
• Nome: stringa di caratteri che denota la variabile– Solitamente introdotto tramite una dichiarazione
• Visibilità (o scope): insieme di istruzioni a cui il nome è “noto”– Dal punto in cui la variabile viene dichiarata fino ad un punto
“di chiusura” successivo
Un programma può manipolare le variabili tramite il loro nome all’interno del loro scope
Una variabile è visibile con il suo nome all’interno del suo scope
Politecnico di Milano - Prof. Sara Comai 18
Nome e regole di visibilità
• Le regole di binding di una variabile all’interno del suo scope dipendono dal linguaggio
– Binding statico dello scope• Lo scope viene definito staticamente, tramite una
dichiarazione implicita o esplicita, senza dover eseguire il programma
• Maggior parte di linguaggi di programmazione (C/C++)
– Binding dinamico dello scope• Lo scope viene definito durante l’esecuzione del
programma• APL, vecchi LISP, SNOBOL4
Politecnico di Milano - Prof. Sara Comai 19
Esempio di binding dinamico dello scope
{/* blocco A */int x;
}{
/* blocco B */int x;
}{
/* blocco C */x = ...;
}
•Regole semplici da implementare
•Implementazione meno efficiente
•Programmi difficili da leggere
Esempio: A C; B C
Politecnico di Milano - Prof. Sara Comai 20
Tipo
variabile = <nome, scope, tipo, l-value, r-value>
• Tipo di una variabile: – insieme di valori che possono essere associati alla
variabile
+– operazioni per creare, accedere, modificare tali
valori
Politecnico di Milano - Prof. Sara Comai 21
Tipi e binding
• Tipi predefiniti (esempio: int)– Il nome del tipo viene associato tramite binding alla classe di valori e
all’insieme di operazioni definite dal linguaggio– I valori e le operazioni vengono associate tramite binding alla
rappresentazione della macchina durante l’implementazione
• Dichiarazioni di tipo (esempio: typedef float reale;)– Definisce il binding tra il nome del tipo e l’implementazione– Eredita tutte le operazioni del tipo specificato
• Tipi di dati astrattinome_nuovo_tipo ={
struttura dati degli oggetti del nuovo tipo;operazioni per manipolare gli oggetti del nuovo tipo;
}– Associano il nuovo tipo alle operazioni definite
Politecnico di Milano - Prof. Sara Comai 22
Tipizzazione statica e dinamica
• Tipizzazione statica (C/C++, Pascal, ecc.)– Il binding delle variabili al loro tipo avviene a tempo di
compilazione– Il binding non può essere cambiato durante l’esecuzione
• Permette la verifica del corretto uso delle variabili a tempo dicompilazione
• Tipizzazione dinamica (LISP, APL, Smalltalk, ecc.)– Il binding avviene a tempo di esecuzione– Le variabili sono polimorfiche (il tipo dipende dal valore associato
dinamicamente)• Non è possibile verificare l’uso corretto delle variabili staticamente
• Linguaggi non tipizzati (linguaggi di script, assemblatori)– Le variabili non sono tipizzate– Celle di memoria e registri contengono stringhe che possono
essere interpretate come valori di qualsiasi tipo
Politecnico di Milano - Prof. Sara Comai 23
l-value
variabile = <nome, scope, tipo, l-value, r-value>
• l-value: – area di memorizzazione associata ad una variabile durante
l’esecuzione• Tempo di vita (lifetime o extent):
– durata di tale binding
• Allocazione della memoria: – Allocazione di un’area della memoria ad una variabile– Il tempo di vita di una variabile va dalla sua allocazione alla sua
disallocazione• Allocazione statica: prima dell’esecuzione e disallocazione al termine
dell’esecuzione (automaticamente)• Allocazione dinamica: durante l’esecuzione e disallocazione durante
l’esecuzione (automaticamente o su richiesta)
Politecnico di Milano - Prof. Sara Comai 24
r-value
variabile = <nome, scope, tipo, l-value, r-value>
• r-value: – Valore codificato memorizzato nella locazione associata alla
variabile (l-value)• Interpretato a seconda del tipo della variabile
• Istruzioni di un programma– Accedono alle variabili attraverso l-value (left)– Modificano r-value (right)
• x=y; // x indica una locazione, y un valore
• Binding tra una variabile ed il valore:– Dinamico operazione di assegnamento: x=10;– Statico costanti simboliche: const int MAX = 10;
Politecnico di Milano - Prof. Sara Comai 25
Inizializzazione di variabili
• Qual è l’r-value di una variabile dopo la sua creazione?– In alcuni linguaggi il binding deve essere definito quando la
variabile viene creata (ML)– Altri lo supportano ma non lo richiedono (C/C++)
• int i=0;– Se l’inizializzazione non viene specificata la soluzione
adottata dipende dall’implementazione• Ignorata: considera la stringa nell’area di memoria come valore
iniziale• Definita dal sistema: es. int inizializzati a 0• Valore speciale non definito per inizializzare la variabile che
non permette di usare la variabile finchè non viene assegnato un valore (verifica di correttezza del programma)
Politecnico di Milano - Prof. Sara Comai 26
Reference e variabili senza nome
• Variabili che possono essere accedute tramite l’r-value di altre variabili – reference o puntatore alla variabile
• Possono non avere un nome (ma esiste percorso di accesso)
• Esempio: int x = 5; //r-value di x è 5int *px;px = &x; //r-value di px è 5
*px = 0; //r-value di px è 0 int y = *px; //r-value di px è 0
Dereferenziazione: accesso tramite il puntatore
Condivisione di oggettiAccessibili:•direttamente (x)•indirettamente (px)
Politecnico di Milano - Prof. Sara Comai 27
Lezione 2- Modulo 4
RoutineConvenzioni dei nomi
Informatica 3
Politecnico di Milano - Prof. Sara Comai 28
Routine
• Routine: unità di decomposizione di un programma che implementa un’operazione astratta– Assembler: sottoprogramma– C: funzione– Pascal: procedure e funzioni
• Procedure: non restituiscono valori• Funzioni: restituiscono valori
Politecnico di Milano - Prof. Sara Comai 29
Oggetti di una routine
Routine = <nome, scope, tipo, l-value, r-value>
– Il nome della routine può essere introdotto tramite la dichiarazione della routine
• int sum(int n); //prototipo C
– Lo scope va dalla dichiarazione ad un punto di chiusura (C: fine del file che contiene la dichiarazione)
• L’attivazione di una routine avviene tramite l’invocazione o chiamata della routine– Dev’essere nello scope della routine – Specifica il nome della routine ed i parametri
Politecnico di Milano - Prof. Sara Comai 30
Oggetti di una routine
• La routine definisce lo scope per le dichiarazioni in essa annidate– Dichiarazioni locali (visibili solo dalla routine)– Non locali (visibili da altre unità)– Globali (visibili da tutte le unità del programma)
Routine = <nome, scope, tipo, l-value, r-value>
• Il tipo della routine è definito dalla sua intestazione– Signature: tipi dei parametri di input e tipo restituito
• int funzione(int, int, float)– Una chiamata di una routine è corretta se è conforme al suo
tipo
Politecnico di Milano - Prof. Sara Comai 31
l-value e r-value
Routine = <nome, scope, tipo, l-value, r-value>
• l-value: area di memoria che contiene il corpo della routine
• r-value: corpo della routine correntemente associato tramite binding – Normalmente è statico, definito a tempo di traduzione– Alcuni linguaggi supportano un binding dinamico:
• Variabili di tipo routine a cui si può assegnare una routine• Es. linguaggio C
int sum(int);int (*ps)(int);ps=∑ int i = (*ps)(5);
• Routine come “first-class objects”
Politecnico di Milano - Prof. Sara Comai 32
Dichiarazione e definizione
• Dichiarazione: intestazione della routine– Definisce lo scope
• Definizione: intestazione e corpo della routine
• La distinzione serve per poter avere mutua ricorsione – Esempio:
int funzA (int x); //dichiarazione float funzB (int y){ //definizione…z=funzA (y); //chiamata di funzione (visibile!)…
}
Politecnico di Milano - Prof. Sara Comai 33
Parametri della routine
• Per passaggio informazioni– Oggetti di dati– Routine (in alcuni linguaggi)
• Parametri– Formali: parametri che appaiono nella definizione– Attuali: parametri che appaiono nella chiamata alla
routine• Binding
– Secondo il metodo posizionaleRoutine: R(F1,F2,…,Fn);Chiamata: R(A1,A2,…,An);
– Tramite associazione del nomeRoutine: R(A:T1; B:T2; C:T3);Chiamata: R(C=>Z, A=>X, B=>Y);
Politecnico di Milano - Prof. Sara Comai 34
Routine generiche• Esempio:
– Routine per ordinare array di interi• … int i,j; … swap(i,j); //caso 1
– Routine per ordinare array di float• … float i,j; … swap(i,j); //caso 2
• Template con tipo generico in C++: template <class T> void swap(T& a, T& b){
T temp = a;a = b;b = temp;
}– Nel caso 1 viene istanziata una routine con interi, – nel caso 2 una routine con float
• I parametri generici vengono associati tramite binding ai parametri attuali a tempo di compilazione
Politecnico di Milano - Prof. Sara Comai 35
Overloading
int i,j,k; a=b+c+b();float a,b,c;…i=j+k; a=b()+c+b(i);a=b+c;
Overloading: la stessa entità viene utilizzata con significati diversi.
• Il binding per l’entità viene stabilito a tempo di compilazione in base alle informazioni disponibili– Esempio: per l’operatore + il binding con la corrispondente
operazioni viene stabilito in base al tipo dei parametri
Operatore +
Somma tra interi
Somma tra float
b variabile
b() funzione
b() e b(int) funzioni distinte
Politecnico di Milano - Prof. Sara Comai 36
Aliasing
Aliasing: contrario di overloading• Due nomi sono alias se denotano la stessa entità
nello stesso punto del programma
int x;int *y=&x;
int q1 (int a){
return a*= a;}
void q2 (int &a){
a *= a;}
x e *y rappresentano la stessa variabile
i e a rappresentano la stessa variabile
int x=2;
cout << q1(x); cout << x; // stampa 4 e 2
q2(x); cout << x; // stampa 4