600 likes | 730 Views
UNA RIFLESSIONE DI FONDO. L’impostazione funzionale è sempre costruttiva. Ma si può sempre solo creare? Perché creare una versione nuova di un accumulatore ad ogni passo, quando l’elaboratore di Von Neumann permette la modifica del contenuto di una cella di memoria?. UNA PROPOSTA.
E N D
UNA RIFLESSIONE DI FONDO • L’impostazione funzionale è sempre costruttiva. Ma si può sempre solo creare? • Perché creare una versione nuova di un accumulatore ad ogni passo, quando l’elaboratore di Von Neumann permette la modificadel contenuto di una cella di memoria? AN FI 99-00 Concetti Imperativi
UNA PROPOSTA • È possibile riusare una stessa area datisenza bisogno di crearne una nuova ad ogni passo computazionale? • Ci sono controindicazioni? AN FI 99-00 Concetti Imperativi
VARIABILI NEI LINGUAGGI IMPERATIVI Una variabilein un linguaggio imperativo • non è solo un sinonimo per un datocome in matematica • è un’astrazione della cella di memoria • associata a due diverse informazioni: • il contenuto (R-value) • l’indirizzo a cui si trova (L-value) 3.22 a x AN FI 99-00 Concetti Imperativi
ESPRESSIONI CON EFFETTI COLLATERALI • Le espressioni che contengono variabili, oltre a denotare un valore,possono a volte comportare effetti collaterali sulle variabili coinvolte. • Un effetto collaterale è una modifica del valore della variabile (R-value) causato da particolari operatori: • operatore di assegnamento • operatori di incremento e decremento AN FI 99-00 Concetti Imperativi
ASSEGNAMENTO • L’assegnamento è un particolare tipo di espressione • come tale denota comunque un valore!! con un effetto collaterale:quello di cambiare il valore della variabile. • Sintassi variabile = espressione • Esempi di espressioni di assegnamento: j = 0 k = j + 1 AN FI 99-00 Concetti Imperativi
ASSEGNAMENTO L’espressione di assegnamento variabile = espressione • denota il valore dell’espressione • ma cambia anche il valore della variabile: il nuovo valore della variabile è quello denotato dalla espressione. AN FI 99-00 Concetti Imperativi
ESEMPIO Se k valeva 2, l’espressione k = 7 • denota il valore 7 • e cambia il valore di k,che d’ora in poi vale 7 (non più 2) AN FI 99-00 Concetti Imperativi
ESEMPIO Se k valeva 2, l’espressione j = k+1 • denota il valore 3 • e cambia il valore di j,che d’ora in poi vale 3 (qualunque valore avesse prima) L’assegnamento è distruttivo AN FI 99-00 Concetti Imperativi
ESPRESSIONI DI ASSEGNAMENTO Il valore denotato dall’espressione di assegnamento può essere usato in altre espressioni.Ad esempio, 3 + (k=7) • denota il valore 10 • e cambia in 7 il valore di k AN FI 99-00 Concetti Imperativi
ASSEGNAMENTO & VARIABILI Una variabile in una espressione di assegnamento: • è intepretata come il suo R-value, se compare a destra del simbolo = • è intepretata come il suo L-value, se compare a sinistra del simbolo = 3.22 a x AN FI 99-00 Concetti Imperativi
ESEMPIO Se x valeva 2, l’espressione x = x + 1 • denota il valore 3 • e cambia in 3 il valore di x • il simbolo x a destra dell’operatore = denota il valore attuale (R-value) di x, cioè 2 • il simbolo x a sinistra dell’operatore = denota la cella di memoria associata a x (L-value), a cui viene assegnato il valore dell’espressione di destra (3) • l’espressione nel suo complesso denota il valore della variabile dopo la modifica, cioè 3. AN FI 99-00 Concetti Imperativi
ASSEGNAMENTO: ASSOCIATIVITÀ • Come tutti gli operatori, anche l’operatore di assegnamento deve avere una sua associatività k = j = 1 Prima k=j, o prima j=1 ? • l’operatore di assegnamento è associativo a destra:ciò consente espressioni di assegnamento multiplo AN FI 99-00 Concetti Imperativi
ASSEGNAMENTO: ASSOCIATIVITÀ Esempi k = j = 1interpretato come k = (j = 1) i = j = k = 0interpretato come i = (j = (k=0)) i = k + 5 = 6NO: k+5 non ha un L-value! Nota: anche volendo, sarebbe stato impossibile farlo associativo a sinistra, in quanto ciò avrebbe reso molte espressioni prive di significato. Ad esempio: k = j = 2 interpretato come (k=j) = 2 ??? Equivarrebbe a scrivere 1 = 2 !!!! AN FI 99-00 Concetti Imperativi
INCREMENTO (++) E DECREMENTO (--) Gli operatori di incremento e decremento sono usabili in due modi • come pre-operatori: ++v • come post-operatori: v++ primaincremento, poiuso primauso, poiincremento AN FI 99-00 Concetti Imperativi
ESEMPI int i, j, k = 5; i = ++k /* i vale 6, k vale 6 */ i = k++ /* i vale 5, k vale 6 */ int i=4, j, k = 5; j = i + k++; /* j vale 9, k vale 6 */ j = ++k - k++; /* in cerca di guai! */ AN FI 99-00 Concetti Imperativi
ATTENZIONE…!! int k = 6; j = ++k - k++; /* in cerca di guai! */ Detti x = ++k e y = k++, • è certo che l’espressione venga valutata come j = x - y (da sinistra a destra) • è certo che alla fine k valga 8 • ma non si sa se venga calcolato prima x o prima y, e qui la cosa fa molta differenza! • se prima x, poi y j = 7 - 7 = 0 • se prima y, poi x j = 8 - 6 = 2 AN FI 99-00 Concetti Imperativi
Riferimenti • Molti linguaggi imperativi permettono di trattare gli indirizzi di memoria come valori e di introdurre variabili che possono assumere come valore un indirizzo a a 3.22 px b x AN FI 99-00 Concetti Imperativi
Il valore null • un simbolo (0, nil, oppure null) che denota un indirizzo cui non corrisponde alcuna cella fisica dell'elaboratore. null px b AN FI 99-00 Concetti Imperativi
Dereferenziamento • L'operazione che permette, data una variabile che ha come valore un riferimento, di accedere al contenuto delle celle di memoria referenziate AN FI 99-00 Concetti Imperativi
Puntatori • le variabili (i cui valori sono riferimenti) che il linguaggio permette possano comparire in espressioni aritmetiche. • px+1 denota l'indirizzo a+k essendo k il numero di celle di memoria occupate dal valore puntato da px Vedremo meglio più avanti AN FI 99-00 Concetti Imperativi
Gli operatori & e * del C int x = 3; x = x; R-value L-value &x *(&x) AN FI 99-00 Concetti Imperativi
Gli operatori & e * del C int x = 3; L’assegnamento *&x = *&x+1; equivale a x = x+1; AN FI 99-00 Concetti Imperativi
Puntatori in C int* x; la variabile x è un puntatore, destinata ad avere come r-value l’indirizzo di una cella di memoria AN FI 99-00 Concetti Imperativi
y g 4 Puntatori in C int* x; int y = 4; x = &y; x g d AN FI 99-00 Concetti Imperativi
y g 4 Puntatori in C int* x; int y = 4; x = &y; R-value di x = g L-value di x =d R-value di *x = 4 L-value di *x = g x g d AN FI 99-00 Concetti Imperativi
Operazioni sui puntatori • Assegnamento di valori (compatibili) • espressi come indirizzi di variabili • espressi come valori di puntatori • espresso come NULL (#include <stdlib.h>) • Applicazione dell’operatore * (dereferenziamento) • Confronti con valori di altri puntatori • Operazioni + e - AN FI 99-00 Concetti Imperativi
Puntatori e type system int x = 3; double y = 3.0; int* px = &x; double* py = &y; int* q; q = px; //ok q = py; • Warning: assignment from incompatible pointer type AN FI 99-00 Concetti Imperativi
Puntatori e type system int x = 3; double y = 3.0; int* px = &x; double* py = &y; int* q; *px= *py = 5.4;//ok • cambiano i valori associati a y e a x • x vale 5 AN FI 99-00 Concetti Imperativi
Dalle espressioni alle istruzioni Dallo stile funzionale allo stile imperativo AN FI 99-00 Concetti Imperativi
Espressioni ... int f( int n,int i,int v ){ //inizialmente v = 1 //invariante di ciclo: v=i! return (i==n)?v:f(n,i+1,(i+1)*v); } Chiamata: …f(n,0,1) AN FI 99-00 Concetti Imperativi
Procedure • costrutti che permettono di attribuire un nome ad un macrocomando e renderlo parametrico if( x == 3 ) printf(“%f\n”, 2+x*sin(0.75) ); else writeln( "errore" ); void f1( int x ){ if( x == 3 ) printf(“%f\n”, 2+x*sin(0.75) ); else printf( "errore\n" ); } AN FI 99-00 Concetti Imperativi
Comandi • notazioni che esprimono azioni che, una volta eseguite, comportano una modifica permanente dello stato interno del programma o quello del mondo circostante. • Le strutture di controllo (if,-then-else, while-do, for, repeat-unitl, switch, etc.) permettono di aggregare comandi semplici in macrocomandi AN FI 99-00 Concetti Imperativi
ISTRUZIONI • Le istruzioni esprimono azioni che, una volta eseguite, comportano una modifica permanente dello stato interno del pro-gramma o del mondo circostante. • Le strutture di controllo permettono di aggregare istruzioni semplici in istruzioni più complesse. AN FI 99-00 Concetti Imperativi
ISTRUZIONI • Una istruzione C è espressa dalle seguenti produzioni: <istruzione> ::= <istruzione-semplice> <istruzione> ::= <istruzione-di-controllo> <istruzione-semplice> ::= <espressione>; • Quindi, qualsiasi espressione seguita da un punto e virgola è una istruzione semplice. AN FI 99-00 Concetti Imperativi
ESEMPI DI ISTRUZIONI SEMPLICI x = 0; y = 1; /* due istruzioni */ x = 0, y = 1; /* una istruzione */ k++; 3; /* non fa nulla */ ; /* istruz. vuota*/ AN FI 99-00 Concetti Imperativi
ISTRUZIONI DI CONTROLLO Una istruzione di controllo può essere: • una istruzione composta(blocco) • una istruzione condizionale(selezione) • una istruzione di iterazione(ciclo) come specificato dalla produzione: < istruzione-di-controllo > ::=<blocco> | <selezione> | <iterazione> AN FI 99-00 Concetti Imperativi
ISTRUZIONI DI CONTROLLO Le istruzione di controllo sono alla base della programmazione strutturata (Dijkstra, 1969). Concetti chiave: • concatenazioneocomposizione • selezione o istruzione condizionaleramifica il flusso di controllo in base al valore vero o falso di una espressione (“condizione di scelta”) • ripetizione o iterazioneesegue ripetutamente un’istruzione finché rimane vera una espressione (“condizionedi iterazione”) AN FI 99-00 Concetti Imperativi
TEOREMA DI JACOPINI-BÖHM • Le strutture di concatenazione, iterazione e selezione costituiscono un insieme completoin grado di esprimere tutte le funzioni calcolabili. • Dunque, l’uso di queste sole strutture di controllo non limita il potere espressivo. • La dimostrazione del teorema è basata sulla Turing-equivalenza di un “mini-linguaggio” che fornisca solo tali strutture di controllo. AN FI 99-00 Concetti Imperativi
BLOCCO <blocco> ::= { [ <dichiarazioni e definizioni> ] { <istruzione> } } • dopo un blocco non occorre il punto e virgola (esso termina le istruzioni semplici, non separa istruzioni) Lo scope dei simboli che compaiono entro il blocco è il blocco stesso AN FI 99-00 Concetti Imperativi
ESEMPIO DI BLOCCO main() {/* INIZIO BLOCCO */ const float F1=9.0, F2=5, SH=32; int c, f, temp = 20; char scala = 'C'; c = (scala != 'F') ? temp : (F2 / F1 * (temp - SH)) ; f = (scala != 'F') ? (SH+temp*F1/F2) : temp; }/* FINE BLOCCO */ AN FI 99-00 Concetti Imperativi
..una nota “en passant”... main() { /* INIZIO BLOCCO */ const float F1=9.0, F2=5, SH=32; int c, f, temp = 20; char scala = 'C'; c = (scala != 'F') ? temp : (F2 / F1 * (temp - SH)) ; f = (scala != 'F') ? (SH+temp*F1/F2) : temp; } /* FINE BLOCCO */ Il qualificatore const rendequeste variabili non modificabili AN FI 99-00 Concetti Imperativi
ESEMPIO DI BLOCCHI ANNIDATI main() {/* INIZIO BLOCCO ESTERNO */ const float F1=9.0, F2=5, SH=32; int c, f, temp = 20; {/* INIZIO BLOCCO INTERNO */ char scala = ‘C’; c = (scala != 'F') ? temp : (F2 / F1 * (temp - SH)) ; f = (scala != 'F') ? (SH+temp*F1/F2) : temp; }/* FINE BLOCCO INTERNO */ }/* FINE BLOCCO ESTERNO */ AN FI 99-00 Concetti Imperativi
ISTRUZIONI CONDIZIONALI <selezione> ::= <scelta> | <scelta-multipla> • la seconda non è essenziale, ma migliora l’espressività. • l’espressione condizionale ternaria (.. ? … : …) fornisce già un mezzo per fare scelte, ma è poco leggibile in situazioni di medio/alta complessità. L’istruzione di scelta fornisce un altro modo per esprimere alternative. AN FI 99-00 Concetti Imperativi
vera falsa condizione istruzione1 istruzione2 ISTRUZIONE DI SCELTA SEMPLICE <scelta> ::= if <condizione> <istruzione1> [ else <istruzione2> ] Una espressione logica o relazionale,che viene valutata al momento dellaesecuzione dell’istruzione if. AN FI 99-00 Concetti Imperativi
vera falsa condizione istruzione1 istruzione2 ISTRUZIONE DI SCELTA SEMPLICE <scelta> ::= if <condizione> <istruzione1> [ else <istruzione2> ] La parte else è opzionale:se omessa, in caso dicondizione falsa si passasubito all’istruzione chesegue l’if. AN FI 99-00 Concetti Imperativi
ESEMPIO DI ISTRUZIONE if • <istruzione1> e <istruzione2> sono ciascuna una singola istruzione • Qualora occorra specificare più istruzioni, si deve quindi utilizzare un blocco. if (n > 0){ /* inizio blocco */ a = b + 5; c = (x<3) ? a : b; } /* fine blocco */else n = b; AN FI 99-00 Concetti Imperativi
ISTRUZIONE if ANNIDATE • Come caso particolare, <istruzione1> o <istruzione2> potrebbero essere un altro if • Occorre attenzione ad associare le parti else (che sono opzionali) all’ if corretto if (n > 0) if (a>b) n = a; else n = b; /* riferito a if(a>b) */ if (n > 0) { if (a>b) n = a; } else n = b; /* riferito a if(n>0) */ Regola semantica:l’else è sempre associato all’if più interno Se ciò non soddisfa occor-re inserire esplicitamenteun blocco. AN FI 99-00 Concetti Imperativi
espressione di selezione caso A break istruzioni1 caso B break istruzioni2 break … default istruzioni ISTRUZIONE DI SCELTA MULTIPLA • Consente di scegliere fra molte istruzioni (alternative o meno) in base al valore di una espressione di selezione. • L’espressione di sele-zione deve denotare un valore numerabile (intero, carattere,…). AN FI 99-00 Concetti Imperativi
ISTRUZIONE DI SCELTA MULTIPLA Se nessuna etichetta corri-sponde, si prosegue col ilramo default. <scelta-multipla> ::= switch(selettore){case <etichetta1> : < istruzioni> [ break; ] case <etichetta2> : < istruzioni> [ break; ] …[ default: < istruzioni> ] } Il valore dell’espressione selettoreviene confron- tato con le etichette dei vari casi: l’esecuzione prosegue dal ramo corrispondente (se esiste). Se neanche quello esiste, si prosegue con l’istruzionesuccessiva allo switch. AN FI 99-00 Concetti Imperativi
ISTRUZIONE DI SCELTA MULTIPLA Le etichette sono costantidello stesso tipo del selettore. <scelta-multipla> ::= switch(selettore){case <etichetta1> : < istruzioni> [ break; ] case <etichetta2> : < istruzioni> [ break; ] …[ default: < istruzioni> ] } Il valore dell’espressione selettoreviene confron- tato con le etichette dei vari casi: l’esecuzione prosegue dal ramo corrispondente (se esiste). Attenzione: <istruzioni>denota una sequenza di istruzioni (non occorre un blocco) AN FI 99-00 Concetti Imperativi