c94028ee62a8526258bbab55f175d48e68dbbf07
linguaggi/s02/20260219.md
| ... | ... | @@ -1,12 +1,187 @@ |
| 1 | 1 | --- |
| 2 | 2 | title: Linguaggi |
| 3 | -description: |
|
| 3 | +description: Lezione 19 febbraio 2026 |
|
| 4 | 4 | published: true |
| 5 | 5 | date: 2026-02-19T06:38:48.738Z |
| 6 | -tags: |
|
| 6 | +tags: |
|
| 7 | 7 | editor: markdown |
| 8 | 8 | dateCreated: 2026-02-19T06:38:48.738Z |
| 9 | 9 | --- |
| 10 | 10 | |
| 11 | -# Header |
|
| 12 | -Your content here |
|
| ... | ... | \ No newline at end of file |
| 0 | +# Variabili |
|
| 1 | + |
|
| 2 | +L’ambiente (in uno specifico blocco) può essere |
|
| 3 | +suddiviso in: |
|
| 4 | +– ambiente locale: associazioni create all’ingresso nel blocco - variabili locali - parametri formali |
|
| 5 | +– ambiente non locale : associazioni ereditate da altri blocchi |
|
| 6 | +– ambiente globale: quella parte di ambiente non locale relativo alle associazioni comuni a tutti i blocchi - dichiarazioni esplicite di variabili globali - dichiarazioni del blocco più esterno - associazioni esportate da moduli ecc. |
|
| 7 | + |
|
| 8 | +## Operazioni sugli oggetti denotabili |
|
| 9 | + |
|
| 10 | +• Creazione |
|
| 11 | +• Accesso |
|
| 12 | +• Modifica (se l’oggetto è modificabile) |
|
| 13 | +• Distruzione |
|
| 14 | + |
|
| 15 | +Creazione e distruzione di un oggetto non coincidono con creazione e distruzione dei legami per esso |
|
| 16 | +Alcuni eventi fondamentali |
|
| 17 | + |
|
| 18 | +1. Creazione di un oggetto |
|
| 19 | +2. Creazione di un legame per l’oggetto |
|
| 20 | +3. Riferimento all’oggetto, tramite il legame |
|
| 21 | +4. Disattivazione di un legame |
|
| 22 | +5. Riattivazione di un legame |
|
| 23 | +6. Distruzione di un legame |
|
| 24 | +7. Distruzione di un oggetto |
|
| 25 | + Il tempo tra 1 e 7 è la vita (o il tempo di vita: lifetime) |
|
| 26 | + dell’oggetto |
|
| 27 | + Il tempo tra 2 e 6 è la vita dell’associazione |
|
| 28 | + |
|
| 29 | +Nota: La vita di un oggetto non coincide con la vita dei legami per quell’oggetto |
|
| 30 | +• Vita dell’oggetto più lunga di quella del legame:(variabile passata ad una proc per riferimento) |
|
| 31 | + |
|
| 32 | +``` |
|
| 33 | +procedure P (var X:integer); begin… end; |
|
| 34 | +… |
|
| 35 | +var A:integer; |
|
| 36 | +… |
|
| 37 | +P(A); |
|
| 38 | +``` |
|
| 39 | + |
|
| 40 | +- area di mem allocata dinamicamente |
|
| 41 | + |
|
| 42 | +``` |
|
| 43 | +int *X, *Y; |
|
| 44 | +… |
|
| 45 | +X = (int *) malloc (sizeof (int)); |
|
| 46 | +Y=X; |
|
| 47 | +… |
|
| 48 | +free (X); |
|
| 49 | +X=null; |
|
| 50 | +``` |
|
| 51 | + |
|
| 52 | +## Scope |
|
| 53 | + |
|
| 54 | +Una dichiarazione locale ad un blocco è visibile in quel blocco e in tutti i blocchi in esso annidati, a meno che non intervenga in tali blocchi una nuova dichiarazione dello stesso nome (che nasconde, o maschera, la precedente) |
|
| 55 | + |
|
| 56 | +- in presenza di procedure (cioè di blocchi che sono eseguiti in posizioni diverse dalla loro definizione) |
|
| 57 | + – in presenza ambiente non locale (e non globale) |
|
| 58 | + |
|
| 59 | +``` |
|
| 60 | +{int x=10; |
|
| 61 | +void foo () { |
|
| 62 | + x++; |
|
| 63 | + } |
|
| 64 | +void fie (){ |
|
| 65 | + int x = 0; |
|
| 66 | + foo(); |
|
| 67 | + } |
|
| 68 | +fie(); |
|
| 69 | +} |
|
| 70 | +``` |
|
| 71 | + |
|
| 72 | +quale x incrementa foo? |
|
| 73 | + |
|
| 74 | +un riferimento non-locale in un blocco B puo essere risolto: |
|
| 75 | + |
|
| 76 | +- nel blocco che include sintatticamente B (**scope statico**) |
|
| 77 | +- nel blocco che e eseguito immediatamente prima di B (**scope dinamico**) |
|
| 78 | + |
|
| 79 | + |
|
| 80 | + |
|
| 81 | +### Scope dinamico |
|
| 82 | + |
|
| 83 | +Un nome non locale e' risolto nel blocco attivato piu' di recente e non ancora disattivato. |
|
| 84 | + |
|
| 85 | + |
|
| 86 | +Scope statico: indipendenza dalla posizione |
|
| 87 | + |
|
| 88 | +Il corpo di foo e' parte dello scope della x piu esterna |
|
| 89 | +la chiamata di foo e' compresa nello scope della x piu interna |
|
| 90 | +foo puo essere chiamata in molti contesti diversi |
|
| 91 | +l'unico modo in cui foo puo essere compilata in modo univoco e' che il riferimento a x sia sempre quello piu esterno. |
|
| 92 | + |
|
| 93 | +La chiamata di foo interna a file e quella nel main accedono alla stessa variabile: la x esterna. |
|
| 94 | + |
|
| 95 | +Scope statico: indipendenza dai nomi locali |
|
| 96 | + |
|
| 97 | + |
|
| 98 | + |
|
| 99 | +la modifica del locale x in y dentro fie: |
|
| 100 | + |
|
| 101 | +- modifica la semantica del programma in scope dinamico |
|
| 102 | +- non ha alcun effetto in scope statico |
|
| 103 | + |
|
| 104 | +Scope dinamico: specializzare una funzione |
|
| 105 | + |
|
| 106 | +visualizza e' una procedura che rende a colore sol video una certa forma |
|
| 107 | + |
|
| 108 | + |
|
| 109 | +Scope statico vs dinamico |
|
| 110 | + |
|
| 111 | +Scope statico: |
|
| 112 | + |
|
| 113 | +- informazione completa dal testo del programma |
|
| 114 | +- le associazioni sono note a tempo di compilazione |
|
| 115 | +- dunque: principi di indipendenza |
|
| 116 | +- concettualmente piu complesso da implementare ma piu efficiente (algol, pascal, C, java) |
|
| 117 | + |
|
| 118 | +Scope dinamico: |
|
| 119 | + |
|
| 120 | +- informazione derivata dall'esecuzione |
|
| 121 | + – spesso causa di programmi meno ``leggibili’’ |
|
| 122 | + – concettualmente più semplice da implementare, ma meno efficiente |
|
| 123 | + – Lisp (alcune versioni), Perl |
|
| 124 | + |
|
| 125 | +Differiscono solo in presenza congiunta di |
|
| 126 | +– ambiente non locale e non globale |
|
| 127 | +– procedure |
|
| 128 | + |
|
| 129 | +Algol, Pascal, Ada, Java permettono di annidare blocchi di |
|
| 130 | +sottoprogrammi |
|
| 131 | +non possibile in C |
|
| 132 | + |
|
| 133 | +Questo non vuol dire che la regola di scoping (statico o |
|
| 134 | +dinamico) sia indifferente in C ! |
|
| 135 | + |
|
| 136 | +Determinare l'ambiente |
|
| 137 | + |
|
| 138 | +L'ambiente e' dunque determinato da: |
|
| 139 | + |
|
| 140 | +- regola di scope (dinamico o statico) |
|
| 141 | +- regole specifiche (es. dichiarare la variabile prima di assegnarla) |
|
| 142 | + |
|
| 143 | +# Gestione della memoria |
|
| 144 | + |
|
| 145 | +Statica a pila, con heap. Implementazione delle regole di scope. |
|
| 146 | + |
|
| 147 | +Tipi di allocazione della memoria |
|
| 148 | +vita di un oggetto corrisponde (in genere) con tre meccanismi di allocazione di memoria: |
|
| 149 | + |
|
| 150 | +- statica: memoria allocata a tempo di compilazione (es. variabili globali) |
|
| 151 | +- dinamica: memoria allocata a tempo di esecuzione (pila, heap) |
|
| 152 | + |
|
| 153 | +## Allocazione statica |
|
| 154 | + |
|
| 155 | +Un oggetto ha un indirizzo assoluto che è mantenuto per tutta l’esecuzione del programma |
|
| 156 | +Solitamente sono allocati staticamente: |
|
| 157 | +– variabili globali |
|
| 158 | +– variabili locali sottoprogrammi (senza ricorsione) |
|
| 159 | +– costanti determinabili a tempo di compilazione |
|
| 160 | +– tabelle usate dal supporto a run-time |
|
| 161 | + |
|
| 162 | +Spesso usate zone protette di memoria |
|
| 163 | + |
|
| 164 | +Nota:E invece se devo assegnare staticamente mem a una funz quanta mem assegno? |
|
| 165 | + |
|
| 166 | +un programma con 3 funz da 1k di mem |
|
| 167 | + |
|
| 168 | +quanta mem alloco? 3k? 1k? |
|
| 169 | +Devo vedere quante chiamate alle funz ho (1 chiamata = 1k mem occupata) |
|
| 170 | +Se c'e ricorsione e' un casino -> non posso determinare prima quanta mem allocare |
|
| 171 | +quindi per permettere la ricorsione **devo** usare allocazione dinamica della mem. |
|
| 172 | +Es. |
|
| 173 | +FORTRAN: non ammette la ricorsione |
|
| 174 | + |
|
| 175 | + |
|
| 176 | + |
linguaggi/s02/assets/imgs/20260219_2026-02-19_14-06-31.png
| ... | ... | Binary files /dev/null and b/linguaggi/s02/assets/imgs/20260219_2026-02-19_14-06-31.png differ |
linguaggi/s02/assets/imgs/20260219_2026-02-19_14-07-26.png
| ... | ... | Binary files /dev/null and b/linguaggi/s02/assets/imgs/20260219_2026-02-19_14-07-26.png differ |
linguaggi/s02/assets/imgs/20260219_2026-02-19_14-11-29.png
| ... | ... | Binary files /dev/null and b/linguaggi/s02/assets/imgs/20260219_2026-02-19_14-11-29.png differ |
linguaggi/s02/assets/imgs/20260219_2026-02-19_14-13-32.png
| ... | ... | Binary files /dev/null and b/linguaggi/s02/assets/imgs/20260219_2026-02-19_14-13-32.png differ |
linguaggi/s02/assets/imgs/20260219_2026-02-19_14-40-34.png
| ... | ... | Binary files /dev/null and b/linguaggi/s02/assets/imgs/20260219_2026-02-19_14-40-34.png differ |
linguaggi/s02/assets/imgs/20260219_2026-02-19_14-43-50.png
| ... | ... | Binary files /dev/null and b/linguaggi/s02/assets/imgs/20260219_2026-02-19_14-43-50.png differ |
linguaggi/s02/assets/imgs/scopeStatico.png
| ... | ... | Binary files /dev/null and b/linguaggi/s02/assets/imgs/scopeStatico.png differ |
linguaggi/s02/assets/imgs/vv.png
| ... | ... | Binary files /dev/null and b/linguaggi/s02/assets/imgs/vv.png differ |