4e9f0e28a73a00877f7eccd0eccffe61c543b035
linguaggi/s02/20260303.md
| ... | ... | @@ -0,0 +1,371 @@ |
| 1 | +# Strutturare il controllo |
|
| 2 | + |
|
| 3 | +Controllo del flusso |
|
| 4 | + |
|
| 5 | +**Espressioni**: |
|
| 6 | + |
|
| 7 | +- notazioni |
|
| 8 | +- valutazione |
|
| 9 | +- problemi |
|
| 10 | + |
|
| 11 | +**Comandi** |
|
| 12 | + |
|
| 13 | +- assegnamento |
|
| 14 | +- sequenziale |
|
| 15 | +- condizionale |
|
| 16 | + |
|
| 17 | +**Comandi iterativi** |
|
| 18 | +**Ricorsione** |
|
| 19 | + |
|
| 20 | +## Espressioni |
|
| 21 | + |
|
| 22 | +Un’espressione un’entità sintattica la cui valutazione produce un valore oppure non termina, nel qual caso l’espressione è indefinita. |
|
| 23 | +– infissa a + b |
|
| 24 | +– prefissa (polacca) + a b |
|
| 25 | +– postfissa (polacca inversa) a b + |
|
| 26 | + |
|
| 27 | +### Semantica delle espressioni: notazione infissa |
|
| 28 | + |
|
| 29 | +Precedenza fra gli operatori: |
|
| 30 | + |
|
| 31 | +a + b \* c ** d ** e / f ?? |
|
| 32 | +if A < B and C < D then ?? |
|
| 33 | +(in Pascal Errore se A,B,C,D non sono tutti booleani) |
|
| 34 | + |
|
| 35 | +Di solito operatori aritmetici precedenza su quelli di confronto che hanno precedenza su quelli logici (nono pascal) |
|
| 36 | +APL, Smalltalk: tutti gli op hanno eguale precedenza (si devono usare le parentesi) |
|
| 37 | + |
|
| 38 | +Associativita' |
|
| 39 | + |
|
| 40 | +15 - 4 - 3 ?? (15 -4) -3 |
|
| 41 | +5 ** 2 ** 3 ?? 5 ** (2 ** 3) |
|
| 42 | + |
|
| 43 | +Non sempre ovvio (apl: 15-4-3 diventa 15-(4-3)) |
|
| 44 | + |
|
| 45 | +### Semantica delle espressioni: notazione postfissa |
|
| 46 | + |
|
| 47 | +Molto piu semplice della infissa |
|
| 48 | + |
|
| 49 | +- non servono le regole di precedenza |
|
| 50 | +- non servono regole di associativita' |
|
| 51 | +- non servono parentesi |
|
| 52 | +- valutazione semplice usando una pila |
|
| 53 | + |
|
| 54 | +Valutazione usando una pila |
|
| 55 | + |
|
| 56 | +1. Leggi il prossimo simbolo dell’exp. e mettilo sulla pila |
|
| 57 | +2. Se il simbolo letto è un operatore: |
|
| 58 | + – applica a operandi immediatamente precedenti sulla pila, |
|
| 59 | + – memorizza il risultato in R, |
|
| 60 | + – elimina operatore ed operandi dalla pila |
|
| 61 | + – memorizza il valore di R sulla pila. |
|
| 62 | +3. Se la sequenza da leggere non è vuota torna a (1). |
|
| 63 | +4. Se il simbolo letto un operando torna a (1). |
|
| 64 | + |
|
| 65 | +### Semantica delle espressioni: notazione prefissa |
|
| 66 | + |
|
| 67 | +Molto piu semplice della infissa: |
|
| 68 | + |
|
| 69 | +- no regole di precedenza |
|
| 70 | +- no regole di associativita |
|
| 71 | +- no parentesi |
|
| 72 | +- valutazione smplce usando una pila (piu complicata di quella postfissa, dobbiamo contare gli operandi che vengono letti) |
|
| 73 | + |
|
| 74 | +## Valutazione delle espressioni |
|
| 75 | + |
|
| 76 | +• Le espressioni internamente sono rappresentate da |
|
| 77 | +alberi |
|
| 78 | +• Visite diverse dell’albero producono le varie notazione |
|
| 79 | +lineari: |
|
| 80 | +– Simmetrica -> infissa |
|
| 81 | +– Anticipata -> prefissa |
|
| 82 | +– Differita -> postfissa |
|
| 83 | + |
|
| 84 | +A partire dall'albero il compilatore prodice il codice oggetto oppure l'interprete valuta l'espressione |
|
| 85 | +In entrambi i casi l'ordine di valutazione delle sottoespressioni e' importante per vari motivi: |
|
| 86 | +– Effetti collaterali (modifiche di var che non sono ) |
|
| 87 | +– Aritmetica finita (overflow) |
|
| 88 | +– Operandi non definiti () |
|
| 89 | +– Ottimizzazione |
|
| 90 | + |
|
| 91 | +Es: |
|
| 92 | +`a+f(b)) * (c+f(b))` |
|
| 93 | + |
|
| 94 | +se f(n) = {x++ return x} |
|
| 95 | +chiamate diverse della stessa funzione possono provocare una modifica di valori e channo effetti diversi. |
|
| 96 | +Altro es: |
|
| 97 | +`a+f(b)) * (c+f(b))` |
|
| 98 | +Se f modifica b il risultato da sinistra a destra e diverso di quello da destra a sinistra |
|
| 99 | +• In alcuni linguaggi non sono ammesso funzioni con effetti laterali nelle espressioni |
|
| 100 | +• In Java è specificato chiaramente l’ordine (da sinistra a destra) |
|
| 101 | + |
|
| 102 | +### Operandi non definiti |
|
| 103 | + |
|
| 104 | +in C: |
|
| 105 | + |
|
| 106 | +```c |
|
| 107 | +a == 0 ? b : b/a |
|
| 108 | +``` |
|
| 109 | + |
|
| 110 | +presuppone una valutazione **lazy**: si valutano solo gli op strettamente necessari. |
|
| 111 | +E'importante sapere se il ling adotta una valutazione lazy oppure **eager** (tutti gli operandi sono comunque valutati) |
|
| 112 | + |
|
| 113 | +### Valutazione corto-circutio |
|
| 114 | + |
|
| 115 | +Nel caso delle espressioni booleane spesso la vlutazione lazy è detta corto-circuito: |
|
| 116 | + |
|
| 117 | +```c |
|
| 118 | +a == 0 || b/a > 2 |
|
| 119 | +``` |
|
| 120 | + |
|
| 121 | +– Con valutazione lazy (corto circuito, come in C) => VERO |
|
| 122 | +– Con valutazione eager => possibile errore |
|
| 123 | + |
|
| 124 | +Visto che eager controlla tutti i parametri puo stare facendo una divisione con zero se a=0 |
|
| 125 | + |
|
| 126 | +``` |
|
| 127 | +p := lista; |
|
| 128 | +while (p <> nil ) and (pˆ.valore <> 3) do |
|
| 129 | +p := pˆ.prossimo; |
|
| 130 | +``` |
|
| 131 | + |
|
| 132 | +(in pascal da errore) |
|
| 133 | + |
|
| 134 | +## Comandi |
|
| 135 | + |
|
| 136 | +Un comando e'un entita' la cui valutazione non necessariamente restituisce un valore, ma puo avere un affetto collaterale |
|
| 137 | + |
|
| 138 | +- effetto collaterale: modifica stato della computazione senza restituire un valore |
|
| 139 | + |
|
| 140 | +I comandi: |
|
| 141 | + |
|
| 142 | +- sono tipici del paradigma imperativo |
|
| 143 | +- non sono presenti nei paradigmi funzionali e logici |
|
| 144 | +- in alcuni casi restituiscono un valore |
|
| 145 | + |
|
| 146 | +## Variabili |
|
| 147 | + |
|
| 148 | +Nei ling imperativi (pascal, c, Ada...) la variabile e' modificabile (contenitore di val, normalmente di un certo tipo ed ha un nome) |
|
| 149 | + |
|
| 150 | +Il val nel contenitore puo essre modificato mediante il comando di assegnamento |
|
| 151 | + |
|
| 152 | +### Assegnamento |
|
| 153 | + |
|
| 154 | +`x:=2` |
|
| 155 | +`X = X +1` si noti il diverso ruolo delle X |
|
| 156 | + |
|
| 157 | +- la X di sinistra e'un **l-value**, ossia un valore che denota una locazione (e puo comparire a sinistra di un assegnamento) |
|
| 158 | +- la X di destra e'un **r-value** ossia un valore puo'essere contenuto in una locazione (e puo comparire a destra di un assegnamento) |
|
| 159 | + |
|
| 160 | +In generale |
|
| 161 | +exp1 Opass exp2 |
|
| 162 | + |
|
| 163 | +Normalmente la valutazione di un assegnamento non restituisce un valore ma produce un ``side effect’’ (effetto collaterale) |
|
| 164 | +– In alcuni linguaggi l’assegnamento resituisce anche un valore. In C: |
|
| 165 | +x= 2 restituisce 2 quindi possiamo scrivere Y = X = 2 |
|
| 166 | + |
|
| 167 | +### Modelli di variabile diversi |
|
| 168 | + |
|
| 169 | +Linguaggi funzionali (Lisp, ML, Haskell, Smalltalk): modello analogo a quella della matematica. Una variabile denota un valore e non è modificabile |
|
| 170 | +• Linguaggi logici: modello analogo a quello dei funzionali, ma con la possibilità di modificare (entro certi limiti) il valore associato alla variabile |
|
| 171 | +• Clu: modello a oggetti, chiamato anche modello a riferimento |
|
| 172 | +• Java: |
|
| 173 | +– variabile modificabile per i tipi primitivi (interi, booleani ecc.) |
|
| 174 | +– modello a riferimento per i tipi classe |
|
| 175 | + |
|
| 176 | +### Modello a riferimento |
|
| 177 | + |
|
| 178 | +na variabile è un riferimento ad un valore, che ha un nome X ----> 2 |
|
| 179 | +Analogo alla nozione di puntatore, ma senza le possibilità di manipolazione delle locazioni dei puntatori: le locazioni qui possono essere manipolate solo implicitamente |
|
| 180 | + |
|
| 181 | + |
|
| 182 | +A destra, se gli oggetti riferiti da X e Y sono modificabili (es.oggetti Java) modifiche fatte attraverso la X si riflettono sull’oggetto riferito da Y |
|
| 183 | + |
|
| 184 | +### Operatori di assegnamento |
|
| 185 | + |
|
| 186 | +X := X+1 |
|
| 187 | + |
|
| 188 | +- doppio accesso alla locazione di a (a meno di ottimizzazione del compilatore) |
|
| 189 | +- poco chiaro; in alcuni casi puo’ causare errori |
|
| 190 | +  |
|
| 191 | + |
|
| 192 | +### Espressioni e comandi (l. imperativi) |
|
| 193 | + |
|
| 194 | +lgol 68: expression oriented |
|
| 195 | +– non c’e’ nozione separata di comando |
|
| 196 | +– ogni procedura restituise un valore |
|
| 197 | + |
|
| 198 | +Pascal: comandi separati da espressioni |
|
| 199 | +– un comando non puo’ comparire dove e’ richiesta un’espressione |
|
| 200 | +– e viceversa |
|
| 201 | + |
|
| 202 | +C: comandi separati da espressioni |
|
| 203 | +– espressioni possono comparire dove ci si aspetta un comando |
|
| 204 | +– assegnamento (=) permesso nelle espressioni |
|
| 205 | + |
|
| 206 | +### Ambiente e memoria |
|
| 207 | + |
|
| 208 | +Due variabili diverse possono denotare lo stesso oggetto (aliasing) |
|
| 209 | +– come si rappresenta questa situazione in termini di stato ? |
|
| 210 | +– la semplice funzione Stato: Nomi ---> Valori non basta |
|
| 211 | + |
|
| 212 | +La semantica dei linguaggi imperativi usa: |
|
| 213 | +– Ambiente: Nomi ----> Valori Denotabili |
|
| 214 | +– Memoria: Locazioni ---> Valori Memorizzabili |
|
| 215 | + |
|
| 216 | +Nei linguaggi imperativi sono presenti tre importanti domini semantici: |
|
| 217 | +– Valori Denotabili (quelli a cui si può dare un nome) |
|
| 218 | +– Valori Memorizzabili (si possono memorizzare) |
|
| 219 | +– Valori Esprimibili (risultato della valutazione di una exp.) |
|
| 220 | + |
|
| 221 | +> Nota: I linguaggi funzionali usano sono l’ambiente |
|
| 222 | + |
|
| 223 | +### Comandi per il controllo sequenza |
|
| 224 | + |
|
| 225 | +Comandi per il controllo sequenza esplicito |
|
| 226 | +– ; |
|
| 227 | +– blocchi |
|
| 228 | +– goto |
|
| 229 | +Comandi condizionali |
|
| 230 | +– if |
|
| 231 | +– case |
|
| 232 | +Comandi iterativi |
|
| 233 | +– iterazione determinata (for) |
|
| 234 | +– iterazione indeterminata (while) |
|
| 235 | + |
|
| 236 | +### Comando sequenziale e blocchi |
|
| 237 | + |
|
| 238 | +C1 ; C2 (significa che viene prima eseguito c1 e poi c2) |
|
| 239 | +– E’ il costrutto di base dei linguaggi imperativi |
|
| 240 | +– Ha senso solo se ci sono side-effects |
|
| 241 | +– in alcuni linguaggi il ``;’’ più che un comando sequenziale è un |
|
| 242 | +terminatore |
|
| 243 | + |
|
| 244 | +Algol 68, C: Il valore di un comando composto e’ quello dell’ultimo comando. |
|
| 245 | + |
|
| 246 | +Comando composto |
|
| 247 | +– può essere usato al posto di un comando semplice |
|
| 248 | +– Algol 68, C (no distinzione espressione-comando): il valore di un comando composto e’ quello dell’ultimo comando |
|
| 249 | + |
|
| 250 | +````{ begin |
|
| 251 | +… … |
|
| 252 | +} end``` |
|
| 253 | +```` |
|
| 254 | + |
|
| 255 | +### GOTO |
|
| 256 | + |
|
| 257 | +Acceso dibattito negli anni 60 sull'utilita del goto |
|
| 258 | +Alla fine considerato dannoso |
|
| 259 | + |
|
| 260 | +## Programmazione strutturata |
|
| 261 | + |
|
| 262 | +- GOTO sconfitto perche'considerato contrario alla programmazione strutturata |
|
| 263 | +- Nata negli anni 70 antesignana della programmazione OOP |
|
| 264 | + |
|
| 265 | +Caratteristiche: |
|
| 266 | + |
|
| 267 | +- design top down |
|
| 268 | +- codice modulare |
|
| 269 | +- nomi identificatori significativi |
|
| 270 | +- uso esteso commenti |
|
| 271 | +- tipi di dato strutturato |
|
| 272 | +- comandi per il controllo strutturato |
|
| 273 | +- ... |
|
| 274 | + |
|
| 275 | +### Comandi di controllo strutturati |
|
| 276 | + |
|
| 277 | +Un solo punto di ingressoe un solo punto d'uscita |
|
| 278 | + |
|
| 279 | +- la scansione lineare del testo corrisponde al flusso di esecuzione |
|
| 280 | +- fondamentale per la comprensione del codice |
|
| 281 | + |
|
| 282 | +Comandi strutturati |
|
| 283 | + |
|
| 284 | +- for if while case |
|
| 285 | +- non e'il caso del goto |
|
| 286 | + |
|
| 287 | +Permette codice strutturato e non spaghetti code |
|
| 288 | + |
|
| 289 | +### Comando condizionale |
|
| 290 | + |
|
| 291 | +`if B then C_1 esle C_2` |
|
| 292 | + |
|
| 293 | +Introdotto con algol 60 |
|
| 294 | +Varie regole per evitare ambiguita' in presenza di if annidati (es. `if B then C1 else C2 endif`) |
|
| 295 | + |
|
| 296 | +Case: |
|
| 297 | +Discendente del goto di fortran e del switch di algol 60 |
|
| 298 | + |
|
| 299 | +- Molte versioni nei vari linguaggi |
|
| 300 | + |
|
| 301 | +Il case, in confronto all'if-then-else e' piu leggibile e piu efficiente se compilato bene |
|
| 302 | + |
|
| 303 | +## Iterazione |
|
| 304 | + |
|
| 305 | +iterazione e ricorsione sono due meccanismi fondamentali che permettono di ottenere formalismi di calcolo Turing completi. Senza di essi avremmo automi a stati finiti. |
|
| 306 | + |
|
| 307 | +Iterazione: |
|
| 308 | + |
|
| 309 | +- indeterminata: cicli controllati logicamente (while, repeat) |
|
| 310 | +- determinata: cicli controllati numericamente (for, do) con numero di ripetizioni del ciclo determinate all'inizio di esso |
|
| 311 | + |
|
| 312 | +### Iterazione indeterminata |
|
| 313 | + |
|
| 314 | +``` |
|
| 315 | +while condizione do comando |
|
| 316 | +``` |
|
| 317 | + |
|
| 318 | +Introdotto in Algol-W rimasto in pascal e moli altri linguaggi |
|
| 319 | + |
|
| 320 | +In pascal esiste anche la versione post-test: |
|
| 321 | + |
|
| 322 | +``` |
|
| 323 | +repeat comando until codizione |
|
| 324 | +``` |
|
| 325 | + |
|
| 326 | +Equivalente a `while not condizione do comando` |
|
| 327 | + |
|
| 328 | +L'iterazione e'indeterminata perche'il numero di iterazioni non e' noto a priori. |
|
| 329 | +L'iterazione indeterminata permette il potere espressivo di una MdT |
|
| 330 | + |
|
| 331 | +### Iterazione determinata |
|
| 332 | + |
|
| 333 | +``` |
|
| 334 | +for indice := inizio TO fine BY passo DO |
|
| 335 | +... |
|
| 336 | +END |
|
| 337 | +``` |
|
| 338 | + |
|
| 339 | +Non si possono modificare: _indice, inizio, fine, passo_ all'interno del loop |
|
| 340 | +e'determinato (al momento dell'exec del ciclo) il numero di ripetizioni del ciclo |
|
| 341 | +Il potere espressivo e'minore rispetto all'iterazione indeterminata: non si possono esprimere computazioni che non terminano |
|
| 342 | +In molti ling (es il C) il _for_ non e'un costrutto di iterazione determinata (in C il for e' un while mascherato) |
|
| 343 | + |
|
| 344 | +#### Semantica del for |
|
| 345 | + |
|
| 346 | +Supponendo passo positivo: |
|
| 347 | + |
|
| 348 | +1. valuta le espressioni inizio e fine e ``congela’’ i valori ottenuti |
|
| 349 | +2. inizializza I con il valore di inizio; |
|
| 350 | +3. se I > fine termina l’esecuzione del for altrimenti |
|
| 351 | + - si esegue corpo e si incrementa I del valore di passo; |
|
| 352 | + - si torna a (3). |
|
| 353 | + |
|
| 354 | +In alcuni lig se il passo e'negativo si usa una sistassi diversa: downto (Pascal), reverse (ada) |
|
| 355 | +Per non fare istruzioni diverse, si puo usare un IC: |
|
| 356 | +IC = `(fine - inizio + passo) / passo` |
|
| 357 | + |
|
| 358 | +#### Cicli controllati numericamente |
|
| 359 | + |
|
| 360 | +I vari lig differiscono nei seguenti aspetti: |
|
| 361 | + |
|
| 362 | +1. possibilita' di **modificare gli indici** |
|
| 363 | +2. **Numero di iterazioni** (dove avviene il controllo `indice<fine`) |
|
| 364 | +3. incremento **negativo** |
|
| 365 | +4. **valore** di indice al termine del ciclo |
|
| 366 | +5. possibilita di salto dall'esterno all'interno |
|
| 367 | + |
|
| 368 | +(il do in fortran permette quasi tutto, con conseguenti problemi di leggibilita') |
|
| 369 | + |
|
| 370 | +Se in un ling c'e' solo il for allora esso non e'turing completo (manca la possibilita' di fare loop infiniti) |
|
| 371 | +Se considerassimo solo le exec finite e' possibile usare solo il for? NO -> funz di hackerman |
linguaggi/s02/assets/imgs/20260303_2026-03-03_14-16-18.png
| ... | ... | Binary files /dev/null and b/linguaggi/s02/assets/imgs/20260303_2026-03-03_14-16-18.png differ |
linguaggi/s02/assets/imgs/20260303_2026-03-03_14-17-40.png
| ... | ... | Binary files /dev/null and b/linguaggi/s02/assets/imgs/20260303_2026-03-03_14-17-40.png differ |