355991fd79400f00ae1d6b6152add63dd32239ca
linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-20-03.png
| ... | ... | Binary files /dev/null and b/linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-20-03.png differ |
linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-29-10.png
| ... | ... | Binary files /dev/null and b/linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-29-10.png differ |
linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-35-52.png
| ... | ... | Binary files /dev/null and b/linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-35-52.png differ |
linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-37-08.png
| ... | ... | Binary files /dev/null and b/linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-37-08.png differ |
linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-50-43.png
| ... | ... | Binary files /dev/null and b/linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-50-43.png differ |
linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-51-17.png
| ... | ... | Binary files /dev/null and b/linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-51-17.png differ |
linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_14-16-59.png
| ... | ... | Binary files /dev/null and b/linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_14-16-59.png differ |
linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_14-18-42.png
| ... | ... | Binary files /dev/null and b/linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_14-18-42.png differ |
linguaggi/s02/sottoprogrammi_ed_eccezioni.md
| ... | ... | @@ -287,3 +287,128 @@ restituita: disciplina a pila non funziona!! |
| 287 | 287 | |
| 288 | 288 | in scope dinamico la x dentro la f puo velere 7 (se pero si valuta lo scope di f quando viene chiamata e non quando viene passata) quindi guardo il suo ambiente quando viene chiamata non passata. Questa regola si chiama regola di shallow binding |
| 289 | 289 | Altrimenti (nel caso in cui io valuti l'ambiente della funz quando essa viene passata e non quand o viene chiamata), ovvero alla riga `g(f)` quindi la x vale 5. Questa regola si chiama deep binding |
| 290 | + |
|
| 291 | +#### i funarg problems: downward |
|
| 292 | + |
|
| 293 | +Quando una procedura viene passata come parametro si crea un riferimento tra un nome (h) e una procedura (f) |
|
| 294 | + |
|
| 295 | + |
|
| 296 | + |
|
| 297 | +``` |
|
| 298 | +nt x=4; int z=0; |
|
| 299 | +int f (int y){ |
|
| 300 | +return x*y;} |
|
| 301 | +void g ( int h(int n) ) { |
|
| 302 | +int x; |
|
| 303 | +x = 7; |
|
| 304 | +z = h(3) + x ; |
|
| 305 | +end; |
|
| 306 | +… |
|
| 307 | +{int x = 5; |
|
| 308 | +g(f); |
|
| 309 | +} |
|
| 310 | +``` |
|
| 311 | + |
|
| 312 | +deep binding: quando nel corpo di g vado ad usare f (quando andro a chiamare f da dentro g) essa avra' delle var non locali (x) che valuto nell'ambiente che c'e al momento della chiamata della funz alla quale f e' stata passata |
|
| 313 | +Ricapitolando: il bind viene fatto quando g chiama f |
|
| 314 | +shallow binding: il bind viene valutato dentro g quando f viene eseguito |
|
| 315 | + |
|
| 316 | + |
|
| 317 | + |
|
| 318 | + |
|
| 319 | + |
|
| 320 | +#### Chiusure |
|
| 321 | + |
|
| 322 | +Passare dinamicamente sia il legame col codice della funzione, che il suo ambiente non locale,cioè una chiusura `<code, env>` |
|
| 323 | +Alla chiamata di una procedura passata per parametro |
|
| 324 | +– alloca (come sempre) il record di attivazione |
|
| 325 | +– prendi il puntatore di catena statica dalla chiusura |
|
| 326 | + |
|
| 327 | + |
|
| 328 | + |
|
| 329 | +#### Riassumendo: parametri funzioni (e per nome) |
|
| 330 | + |
|
| 331 | +Chiusure per mantenere puntatore all’ambiente statico del corpo di una funzione |
|
| 332 | + |
|
| 333 | +Alla chiamata, il puntatore di catena statica determinato mediante la chiusura |
|
| 334 | + |
|
| 335 | +Tutti i puntatori di catena statica puntano sempre indietro nella pila |
|
| 336 | +– record di attivazione possono essere “saltati” per accedere a var non locali |
|
| 337 | +– de-allocazione dei record di attivazione secondo stretta politica a pila (lifo: last-in-first-out) |
|
| 338 | + |
|
| 339 | +### Scope dinamico: implementazione |
|
| 340 | + |
|
| 341 | +Shallow binding: |
|
| 342 | +– non necessita di alcuna attenzione |
|
| 343 | +• per accedere a x, risali la pila |
|
| 344 | +• uso delle strutture dati solite (A-list, CRT) |
|
| 345 | + |
|
| 346 | +Deep binding |
|
| 347 | +– usa necessariamente qualche forma di chiusura per “congelare” uno scope da riattivare più tardi |
|
| 348 | + |
|
| 349 | +### Deep e shallow binding con scope statico |
|
| 350 | + |
|
| 351 | + |
|
| 352 | + |
|
| 353 | +#### Esercizio: |
|
| 354 | + |
|
| 355 | + |
|
| 356 | + |
|
| 357 | +#### Esercizio in classe |
|
| 358 | + |
|
| 359 | +``` |
|
| 360 | +{void foo (int f(), int n){ |
|
| 361 | + int m = 10; |
|
| 362 | + int fie(){ write (n,m)} |
|
| 363 | + if (n==0) f(); |
|
| 364 | + else {m=30; |
|
| 365 | + foo(fie,0); |
|
| 366 | + } |
|
| 367 | + } |
|
| 368 | + int g(){ |
|
| 369 | + write(10); |
|
| 370 | + } |
|
| 371 | + foo(g,1); |
|
| 372 | +} |
|
| 373 | +``` |
|
| 374 | + |
|
| 375 | +si dica cosa stampa in frammento con shallow e deep bindig |
|
| 376 | +deep binding: |
|
| 377 | + |
|
| 378 | +- n=1 e m=30 |
|
| 379 | + |
|
| 380 | +shallow binding: |
|
| 381 | + |
|
| 382 | +- Es: spiegare vantaggi e svantaggi scope statico e scope dinamico |
|
| 383 | + scope statico: vantaggio: maggiore chiarezza del codice (trasparenza referenziale) e la stessa funz chiamata in tempi diversi con stessi param non cambiano il risultato |
|
| 384 | + svantaggi: difficile da implementare (catena) |
|
| 385 | + scope dinamico: impl facile, svantaggio: progr molto meno comprensibili |
|
| 386 | + |
|
| 387 | +#### upward funarg problema |
|
| 388 | + |
|
| 389 | +Alcuni linguaggi (eg funzionali) permettono di restituire una funzione |
|
| 390 | +Se la funzione ha variabili locali queste devono sopravvivere indipendentemente dalla struttura a pila: hanno vita indefinitamente lunga |
|
| 391 | + |
|
| 392 | + |
|
| 393 | + |
|
| 394 | + |
|
| 395 | + |
|
| 396 | +(la pila va dall'alto verso il basso) |
|
| 397 | + |
|
| 398 | +**Morale: funzioni come risultato** |
|
| 399 | +• Uso delle chiusure, ma… |
|
| 400 | +• I record di attivazione persistono indefinitamente |
|
| 401 | +– perdita proprietà della pila (lifo) |
|
| 402 | +• Come implementare la “pila” in questo caso: |
|
| 403 | +– non deallocare esplicitamente |
|
| 404 | +– record di attivazione sullo heap |
|
| 405 | +– le catene statica e dinamica collegano i record |
|
| 406 | +– invoca il garbage collector quando necessario |
|
| 407 | + |
|
| 408 | +domande orale: |
|
| 409 | +quasi mai esercizi |
|
| 410 | +domande sui concetti del corso es per verdere se siamo in geado di esporre gli arg tecnici es |
|
| 411 | +cos'e un tipo di dato, cos'e una variabile, siegami in dettaglio come funz l'impl del meccanismo di deep binding con le chiusure |
|
| 412 | + |
|
| 413 | +differenza tra meccanismo di invocazione di un mentodo e chiamata di funz in un ling imperativo. |
|
| 414 | +i ling oop in cosa sono meglio dei ling normali (procedurali?) |