1 / 60

UNA RIFLESSIONE DI FONDO

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.

nia
Download Presentation

UNA RIFLESSIONE DI FONDO

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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

  2. 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

  3. 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

  4. 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

  5. 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

  6. 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

  7. 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

  8. 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

  9. 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

  10. 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

  11. 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

  12. 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

  13. 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

  14. 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

  15. 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

  16. 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

  17. 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

  18. 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

  19. 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

  20. 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

  21. Gli operatori & e * del C int x = 3; x = x; R-value L-value &x *(&x) AN FI 99-00 Concetti Imperativi

  22. Gli operatori & e * del C int x = 3; L’assegnamento *&x = *&x+1; equivale a x = x+1; AN FI 99-00 Concetti Imperativi

  23. 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

  24. y g 4 Puntatori in C int* x; int y = 4; x = &y; x g d AN FI 99-00 Concetti Imperativi

  25. 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

  26. 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

  27. 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

  28. 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

  29. Dalle espressioni alle istruzioni Dallo stile funzionale allo stile imperativo AN FI 99-00 Concetti Imperativi

  30. 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

  31. 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

  32. 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

  33. 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

  34. 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

  35. 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

  36. 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

  37. 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

  38. 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

  39. 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

  40. 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

  41. ..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

  42. 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

  43. 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

  44. 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

  45. 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

  46. 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

  47. 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

  48. 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

  49. 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

  50. 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

More Related