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
+![20260303_2026-03-03_14-16-18](assets/imgs/20260303_2026-03-03_14-16-18.png)
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
+ ![20260303_2026-03-03_14-17-40](assets/imgs/20260303_2026-03-03_14-17-40.png)
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