Strutture Dati. Nicola Fanizzi. Linguaggi di Programmazione [010194] 9 mag, Dipartimento di Informatica Università degli Studi di Bari
|
|
- Giacomo Alfonso Baroni
- 5 anni fa
- Visualizzazioni
Transcript
1 Strutture Dati Nicola Fanizzi Dipartimento di Informatica Università degli Studi di Bari Linguaggi di Programmazione [010194] 9 mag, 2016
2 Sommario 1 Tipi e sistemi di tipi Definizioni Sistemi di tipi 2 Tipi scalari Tipi scalari e ordinali Booleani Caratteri Numerici: interi, reali, complessi void Enumerazioni e intervalli 3 Tipi Composti Record Array Insiemi Puntatori 4 Relazioni fra tipi Equivalenza Compatibilità e conversione di tipo Polimorfismo Controllo e Inferenza 5 Strutture dati e gestione della memoria Dangling reference Garbage collection Strutture Dati 9 mag, / 88
3 Agenda 1 Tipi e sistemi di tipi Definizioni Sistemi di tipi 2 Tipi scalari 3 Tipi Composti 4 Relazioni fra tipi 5 Strutture dati e gestione della memoria Strutture Dati 9 mag, / 88
4 Introduzione Scopi dei Tipi di dato: Progetto: supporto all organizzazione concettuale Programma: supporto alla correttezza Traduzione: supporto all implementazione Strutture Dati 9 mag, / 88
5 Tipi Definizione (Tipo) Un tipo di dato è una collezione di valori omogenei, effettivamente presentabili, dotata di un insieme di operazioni che manipolano tali valori Omogeneità I valori condividono alcune proprietà strutturali Presentabilità Devono potere avere una presentazione finita per la loro scrittura es. non esiste un tipo dei numeri reali veri e propri Operazioni La stessa collezione di valori può essere impiegata in tipi diversi a seconda delle operazioni definite es. i tipi interi nei vari linguaggi Strutture Dati 9 mag, / 88
6 Tipi utilità Progetto: Supporto all organizzazione concettuale Dominare la complessità dei problemi Esplicitare i concetti tipici attraverso nuovi tipi Aumento di leggibilità (documentazione) e di sicurezza (controlli automatici) Strutture Dati 9 mag, / 88
7 Tipi utilità [... cont.] Programma: Supporto alla correttezza Vincoli di tipo (problemi di semantica) errori HW es. salto a zona di memoria che non contiene codice errori logici es. somma intero + stringa Controlli semantica statica: Type checker come i commenti ma i controlli sono effettuabili automaticamente non risolvono tutti i problemi logici: es. formule della fisica, prima controlli sulle dim. Polimorfismo es. stessa funzione (es. sort) su strutture di tipi diversi Sicurezza: vincoli soddisfatti ma problemi rilevati in fase d esecuzione? linguaggi sicuri e non es. dangling reference Strutture Dati 9 mag, / 88
8 Tipi utilità [... cont.] Traduzione: Supporto all implementazione Informazioni per la macchina astratta disponibili staticamente Dimensione richiesta per l allocazione sia nel RdA sullo stack sia su heap Ottimizzazioni sulle op. d accesso Calcoli statici Ind. oggetto + offset (no ricerca per nome) Strutture Dati 9 mag, / 88
9 Sistemi di tipi Sistema di tipi: complesso delle informazioni e delle regole che governano i tipi di un linguaggio 1 Insieme dei tipi predefiniti 2 Costrutti per definire nuovi tipi 3 Meccanismi per il controllo dei tipi Regole di equivalenza: due tipi formalmente diversi possono essere equivalenti livello semantico Regole di compatibilità: un valore di un tipo diverso da quello atteso può essere comunque utilizzato Regole di inferenza: attribuzione di un tipo ad un espressione complessa in base alle componenti 4 se/quali vincoli controllare staticamente/dinamicamente Strutture Dati 9 mag, / 88
10 Sistemi di tipi - sicurezza Un sistema di tipi (e, per estensione, un linguaggio) si dice type-safe 1 (sicuro a livello di tipi) quando nessun programma può ignorare le differenze tra tipi definite dal sistema/linguaggio nessun programma può generare errori inattesi derivanti da violazioni di tipo a run-time ad esempio: accesso a memoria non allocata chiamata di un valore che non si riferisce ad una funzione 1 o strongly typed (fortemente tipizzato). Strutture Dati 9 mag, / 88
11 Classificazione dei tipi In base ai valori (... ed alle operazioni): denotabili possono essere associati ad un nome esprimibili possono essere il risultato di una espressione complessa (più di un semplice nome) memorizzabili possono essere memorizzati in una variabile Strutture Dati 9 mag, / 88
12 Classificazione dei tipi [... cont.] Esempi Tipo delle funzioni (int -> int) valore denotabile: possiamo associare un nome ad una funzione 1 int succ (int x) { 2 return x + 1; 3 } valore esprimibile: solo nei ling. funzionali e non negli imperativi Funzioni risultato della valutazione di un espressione valore memorizzabile idem (ML, HASKELL, SCHEME) Strutture Dati 9 mag, / 88
13 Sistemi di tipi controlli Tipizzazione statica: controlli a compile-time (es. JAVA) Controlli anticipati Correttezza garantita per ogni sequenza d esecuzione Controlli a run-time inutili: maggiore efficienza Progettazione più complessa se il linguaggio deve anche essere type-safe Compilazione lenta e complessa ma facilita debugging/testing Tipizzazione dinamica: controlli a run-time (es. LISP) Ogni oggetto ha un descrittore che ne contiene il tipo La macchina astratta controlla la correttezza degli operandi nelle operazioni Il compilatore ha generato codice di controllo opportuno Caratteristiche previene errori di tipo (troppo tardi?) esecuzione meno efficiente Strutture Dati 9 mag, / 88
14 Sistemi di tipi controlli [... cont.] Osservazioni Programmi sicuri che la tipizzazione statica può male interpretare come errati: Controllo statico: più conservatore Esempio dato il frammento: 1 int x; 2 if (1==0) x = "errore"; 3 else x = x + 2; l esecuzione non causa errore ma risulta non corretto al controllo statico Controllo sui tipi in generale: problema indecidibile Per prudenza un controllo statico esclude anche casi non pericolosi, come il precedente In molti linguaggi (es. PASCAL) controllo statico+dinamico es. utilizzo di vettori con controllo degli indici a run-time Strutture Dati 9 mag, / 88
15 Indecidibilità del controllo sui tipi Controllo statico: più conservatore 1 int x; 2 Proc(); 3 x = "errore"; Se si potesse sapere sempre se Proc() termina allora si potrebbe segnalare l errore di tipo E se Proc() non terminasse mai? allora l errore di tipo non si verificherebbe quindi il programma sarebbe corretto Essendo il problema della fermata indecidibile lo sarà anche quello del controllo della correttezza dei tipi Strutture Dati 9 mag, / 88
16 Agenda 1 Tipi e sistemi di tipi 2 Tipi scalari Tipi scalari e ordinali Numerici: interi, reali, complessi void Enumerazioni e intervalli 3 Tipi Composti 4 Relazioni fra tipi 5 Strutture dati e gestione della memoria Strutture Dati 9 mag, / 88
17 Tipi scalari Tipi scalari (o semplici): tipi i cui valori sono atomici, i.e. non sono costituiti da aggregati di altri valori notazione type <nometipo> = <espressione>; Tipi ordinali (o discreti): dotati di una relazione d ordine totale Valori: discreti booleani, caratteri, interi, enumerazioni ed intervalli Operazioni: precedente e successivo Utili per gli indici Strutture Dati 9 mag, / 88
18 Booleani Per valori logici (o di verità) Valori: uno per il vero (es. true) uno per il falso (es. false) Operazioni: congiunzione (and), disgiunzione (or), negazione (not), or esclusivo, uguaglianza Valori denotabili, esprimibili, memorizzabili Memorizzazione nelle minime unità di memoria indirizzabili Strutture Dati 9 mag, / 88
19 Caratteri Valori: un insieme di codici di caratteri fissato durante la progettazione del linguaggio Es: ASCII, UNICODE Operazioni: logiche uguaglianza, confronti, ordinali carattere successivo (succ) o precedente (prec) Valori denotabili, esprimibili, memorizzabili Memorizzazione con 1 (ASCII) o 2 (UNICODE) byte Strutture Dati 9 mag, / 88
20 Interi Valori: sottoinsieme finito dei numeri interi fissato durante la progettazione del linguaggio o della macchina astratta Di solito del tipo [ 2 t, +2 t 1] A volte sono possibili interi di lunghezza illimitata Operazioni aritmetiche e confronti Somma, differenza, prodotto, divisione (intera), resto, potenza Valori denotabili, esprimibili, memorizzabili Memorizzazione con un numero (pari) di byte in complemento a due Strutture Dati 9 mag, / 88
21 Reali numeri reali in virgola fissa Valori: sottoinsieme finito dei numeri razionali fissato durante la progettazione del linguaggio o della macchina astratta Ampiezza e granularità, ecc. dell insieme dipendono dalla rappresentazione scelta Operazioni aritmetiche e confronti Somma, differenza, prodotto, divisione (intera), resto, esponenziale, radice quadrata Valori denotabili, esprimibili, memorizzabili Memorizzazione con un numero di 4 o 8 byte complemento a 2 numero fissato di bit per la parte decimale Strutture Dati 9 mag, / 88
22 Reali [... cont.] virgola mobile Valori: sottoinsieme finito dei numeri razionali fissato durante la progettazione del linguaggio o della macchina astratta Ampiezza e granularità, ecc. dell insieme dipendono dalla rappresentazione scelta Operazioni aritmetiche e confronti Somma, differenza, prodotto, divisione (intera), resto, esponenziale, radice quadrata Valori denotabili, esprimibili, memorizzabili Memorizzazione con un numero di 4,8,10 byte Standard IEEE 754 Strutture Dati 9 mag, / 88
23 Complessi numeri complessi Valori: sottoinsieme finito dei numeri complessi fissato durante la progettazione del linguaggio Ampiezza e granularità, ecc. dell insieme dipendono dalla rappresentazione scelta Operazioni aritmetiche e confronti Somma, differenza, prodotto, divisione (intera), resto, esponenziale, radice quadrata Valori denotabili, esprimibili, memorizzabili Memorizzazione con una coppia di reali in virgola mobile Strutture Dati 9 mag, / 88
24 void Valori: un solo valore void o unit (insieme singoletto) oppure { } una funzione matematica non può avere codominio vuoto sono tali le funzioni che divergono sempre Operazioni: nessuna Utile a denotare operazioni che non restituiscono un valore utile (ma hanno effetti collaterali) es. assegnamento (in molti linguaggi) ossia restituiscono un unico valore implicitamente Strutture Dati 9 mag, / 88
25 Enumerazioni Tipi semplici definiti dall utente Valori: un insieme finiti di costanti caratterizzate da un proprio nome es. type giorni = (lun,mar,mer,gio,ven,sab,dom); Operazioni: confronti, operatori per raggiungere il valore precedente o il successivo Vantaggi Aumenta la leggibilità Ausilio del controllo dei tipi Memorizzazione: mappaggio sugli interi In alcuni linguaggi (C/C++, ADA,...) si possono anche scegliere esplicitamente Strutture Dati 9 mag, / 88
26 Intervalli Tipi semplici definiti dall utente Valori: sottoinsieme contiguo dei valori di un altro tipo scalare (tipo base) 1 type NumeriLotto = 1..90; 2 Giorniferiali = lun..ven; Operazioni: confronti, operatori per raggiungere il valore precedente o il successivo Vantaggi Maggiore la leggibilità Ausilio al controllo dei tipi: dinamico Memorizzazione: mappati sugli interi Come per il tipo base Strutture Dati 9 mag, / 88
27 Agenda 1 Tipi e sistemi di tipi 2 Tipi scalari 3 Tipi Composti Record Array Insiemi Puntatori 4 Relazioni fra tipi 5 Strutture dati e gestione della memoria Strutture Dati 9 mag, / 88
28 Tipi Composti Tipi non scalari, ottenuti per combinazione di tipi più semplici Record (o strutture): collezione di valori eterogenei Array: collezione di valori omogenei Insiemi: sottoinsiemi di un tipo (base, ordinale) Puntatori: l-valori per accedere indirettamente ad altri valori Tipi ricorsivi: definiti per ricorsione Strutture Dati 9 mag, / 88
29 Record (o strutture) Record: Collezione di un numero finito (e spesso ordinato) di elementi detti campi Ogni campo è caratterizzato dal nome dal tipo (anche diverso da quello degli altri campi) si può assimilare quindi ad una variabile Spesso è possibile annidare record all interno di record Strutture Dati 9 mag, / 88
30 Record (o strutture) [... cont.] Esempio 1 type studente = struct { 2 int matricola; 3 float statura; 4 }; Esempio annidamento 1 type Aula = struct { 2 char nome[5]; 3 int capienza; 4 struct { 5 char dipart[10]; 6 int tel; 7 } segreteria; 8 }; Aula a; 11 a.nome = B-1 12 a.segreteria.tel = 1234; Strutture Dati 9 mag, / 88
31 Record (o strutture) [... cont.] Operazioni: selezione, indicata con. alcuni linguaggi ammettono assegnazione e test di uguaglianza tra interi record se non permesse bisogna procedere campo per campo l ordine dei campi può essere significativo Memorizzazione in locazioni contigue nell ordine di definizione Diverse organizzazioni possibili dovute all allineamento Migliora l efficienza nel reperimento Esempio arch. 32bit nome capienza dipartimento telefono Strutture Dati 9 mag, / 88
32 Record varianti e unioni Record varianti: record con campi mutuamente esclusivi Nomi e sintassi diverse per ogni linguaggio es. in PASCAL, record con una parte della struttura variabile: solo una delle varianti ammesse è significativa Esempio 1 type studente = record 2 nome: array [1..6] of char; 3 matricola: integer; 4 case fuoricorso: boolean of 5 true: (ultimoanno: maxint); 6 false:( inpari: boolean; 7 anno: (primo,secondo,terzo) 8 ) 9 end; Strutture Dati 9 mag, / 88
33 Record varianti e unioni [... cont.] unioni strutture con campi mutualmente esclusivi Nomi e sintassi diverse per ogni linguaggio es. in C, struttura con un solo campo alla volta valido union per la parte variante 1 struct studente { 2 char[6] nome; 3 int matricola; 4 int fuoricorso; 5 union { int ultimoanno; 6 struct { int inpari; 7 int anno; 8 } studente_in_corso; 9 } campi_varianti; 10 } Strutture Dati 9 mag, / 88
34 Record varianti e unioni [... cont.] Record varianti vs. Unioni Similarità Differenze Le varianti e le unioni condividono le stesse aree di memoria In C un campo della union è svincolato dal resto più flessibile più oneroso per il programmatore più rischioso Livelli di nomi: In PASCAL, campo come gli altri: s.inpari In C, occorre aggiungere ulteriori livelli di nomi Strutture Dati 9 mag, / 88
35 Record varianti e unioni [... cont.] Problema di sicurezza modifica tag discriminante con assegnamento ordinario (in PASCAL e C) La macchina astratta potrebbe controllare (dinamicamente) il tag per sapere se il record è usato correttamente risolve molti problemi semantici ma non tutti 1 type Tre = 1..3; ma anche 2 var tmp: record 1 tmp.quale:=1; 3 case quale: Tre of 2 tmp.a:=123; 4 1: (a:integer); 3 tmp.quale:=3; 5 2: (b:boolean); 4 write(tmp.c); 6 3: (c:char); 5 ( 7 end * semanticamente errato, 6 ma non rilevato 8... * ) 9 tmp.quale:=1; 10 tmp.a:=123; 11 write(tmp.c); 12 ( * errore a run-time * ) Strutture Dati 9 mag, / 88
36 Array Array: Collezione finita di elementi dello stesso tipo (tipo base) indicizzata su un intervallo di tipo ordinale (tipo indice) Specifica Nome Tipo indice Tipo dei componenti es. in C: int v[10]; Array multidimensionali: usando indici molteplici a volte come array di array op. di slicing ritagliare una fetta, fissando una dim. Strutture Dati 9 mag, / 88
37 Array [... cont.] Operazioni Selezione: si indica (spesso tra [...]) un espressione il cui valore rappresenta l indice dell elemento da selezionare es. array monodimensionale: v[<espr>] es. array multidimensionale: m[<espr_1>][<espr_2>]...[<espr_n>] Assegnamento Test di uguaglianza ed altri test di confronto Op. dell algebra lineare nei ling. che supportano il trattamento delle matrici Slicing slice: sezione di array costituita da elementi contigui in una data dimensione (es. un piano) in alcuni linguaggi si possono estrarre anche selezioni diagonali cornici, ecc. Strutture Dati 9 mag, / 88
38 Array [... cont.] Controlli Selezione entro i limiti del tipo indice A run-time Per un linguaggio safe: il compilatore genera controlli per ogni selezione generazione spesso disattivabile con un opzione del compilatore Safety & security Attacchi buffer overflow Strutture Dati 9 mag, / 88
39 Array [... cont.] Memorizzazione Sezioni contigue di memoria Array monodimensionale Allocazione secondo l ordine degli indici Array multidimensionale Ordine di riga Elementi contigui differiscono di un unita nell indice più a destra nella lista Ordine di colonna Elementi contigui differiscono di un unita nell indice più a sinistra nella lista Dividere nell una o l altra maniera può avere un impatto sull efficienza del caching Strutture Dati 9 mag, / 88
40 Array [... cont.] Calcolo degli indici Dato un array m a n dimensioni di tipo T T m[l 1,U 1 ][L 2,U 2 ]...[L n,u n ] S n : unità di mem. indirizzabili per elem. di T (per riga) S n 1 = (U n L n + 1)S n (slice di ordine superiore)... S 1 = (U 2 L 2 + 1)S 2 Per cercare l indirizzo di m[i 1 ][i 2 ]...[i n ] all indirizzo iniziale, si somma l offset: (i 1 L 1 )S 1 + (i 2 L 2 )S (i n L n )S n Se le dim. sono tutte note, meglio usare: i 1 S i n S n (L 1 S L n S n ) n moltiplicazioni, n addizioni, n sottrazioni (che non servono se gli indici partono da 0, i L is i predeterminato) Strutture Dati 9 mag, / 88
41 Array [... cont.] Forma (shape): numero delle dim. e intervallo per ogni dim. Quando viene fissata? Statica al momento della compilazione (dim. fissate) Array nel RdA (o nella mem. per le var. globali) Accesso tramite la formula precedente Elaborazione della dichiarazione Intervallo indici dipendente da un espressione variabile Calcolo a run-time Array nel RdA: ma offset non noto! Parte fissa (offset) e parte variabile (ind. indiretto) Dinamica Limiti modificabili Allocazione sull heap: (sulla pila non è possibile) Nel RdA: puntatore all array Strutture Dati 9 mag, / 88
42 Array [... cont.] Dope vector: descrittore di array di forma non nota staticamente Allocato nella parte a lunghezza fissa del RdA riservata all array Contiene: puntatore alla prima cella dell area di mem. riservata all array informazioni dinamiche utili (non memorizzate se determinabili staticamente) numero dimensioni limiti per ogni dim. (L i, U i ) occupazione per ogni dim. (S i ) Accesso ad un elemento: accesso per offset tramite frame pointer al dope vector calcolo della formula precedente si somma all indirizzo dell inizio dell array Strutture Dati 9 mag, / 88
43 Array [... cont.]... lunghezza variabile m... var locali lunghezza fissa frame pointer L 3 S 3 L 2 S 2 L 1 S 1 puntatore ad m... ind.ritorno parametri dope vector di m Strutture Dati 9 mag, / 88
44 Insiemi Insieme: collezione di valori che costituiscono un sottoinsieme di un tipo base (universo) Solitamente il tipo base è ordinale (PASCAL) Esempi set of char S; set of Giorni IG; WE = (Sab, Dom); Operazioni Appartenenza (, in) Unione (+), intersezione ( * ), differenza (-) (a volte anche complemento) Rappresentazione vettori di bit (vettore caratteristico) V j = 1 sse il j-esimo elemento dell universo appartiene all insieme Tabelle hash... Strutture Dati 9 mag, / 88
45 Puntatori Puntatore: tipo di variabili atte a contenere l-valori, direttamente manipolabili, utili a riferirsi indirettamente ad altre var. In genere è possibile indicare anche il tipo delle variabili puntate TipoBase * P; In PASCAL o ADA: possono solo puntare a variabili del tipo dato In C/C++: non c è un vincolo stretto Ove presenti, consentono la definizione di tipi ricorsivi senza primitive apposite Nei linguaggi con variabili-riferimento, gli l-valori non possono essere manipolati direttamente valore nullo: il puntatore non punta ad alcuna variabile es. null (o nil, in PASCAL) Strutture Dati 9 mag, / 88
46 Puntatori [... cont.] Operatori Assegnamento di un valore ad un puntatore mediante Allocazione esplicita int * p; p = (int * ) malloc(sizeof (int)); Costruttori (di oggetti) Operatore & float pigreco = , * pp; pp = &pigreco; Dereferenziazione ^ (PASCAL) oppure * (in C/C++) es. precedente: float circ = 2 * r * ( * pp ); Vale sia per l l-valore sia per l r-valore Strutture Dati 9 mag, / 88
47 Puntatori [... cont.] test di uguaglianza Creazione di strutture ricorsive Quando non previste dal linguaggio es. lista di interi (successione ordinata di dim. variabile) 1 typedef nodo * lista_int; 2 typedef struct { int val; 3 lista_int succ} nodo; Strutture Dati 9 mag, / 88
48 Puntatori [... cont.] Aritmetica In C ed alcuni derivati: operazioni aritmetiche su puntatori Incremento/decremento di un puntatore: p++ / p-- indirizzo incrementato di sizeof(tipobase) Sottrazione di puntatori: p1 - p2 Offset tra p1 e p2 Somma di un quantità ad un puntatore: p + n punta alla variabile con offset pari a n * sizeof(tipobase) Nociva per la type-safety del linguaggio Non c è garanzia che in tutti i momenti un puntatore punti effettivamente ad una variabile del tipo atteso 1 int * p; 2 int * c; 3 p = (int * ) malloc(sizeof(int)); 4 c = (char * ) malloc(sizeof(char)); 5 p = p+1 6 c++; Strutture Dati 9 mag, / 88
49 Puntatori [... cont.] Deallocazione implicita nessuno strumento per deallocare la memoria avviene quando non c è più spazio sullo heap possibile recuperare memoria inutilizzata tecniche di garbage collection esplicita costrutto previsto dal linguaggio In C: funzione free() free(p) libera la memoria della variabile puntata da p e conviene anche assegnare: p=null; se p vale già null allora si ha un errore semantico Dangling reference: puntatori con valore diverso da null che puntano a zone non più significative memoria deallocata o ri-allocata riferimenti non validi alla pila d esecuzione (anche con deallocazione implicita) Strutture Dati 9 mag, / 88
50 Tipi ricorsivi Tipi composti in cui un valore può contenere (un riferimento ad) un valore dello stesso tipo Esempi (pseudocodice): 1 type ListaInt = { int val; 2 ListaInt next; } 1 type AlberoChar = { char val; 2 AlberoChar sinistro; 3 AlberoChar destro; } Operazioni Selezione Test di uguaglianza Strutture Dati 9 mag, / 88
51 Tipi ricorsivi [... cont.] Rappresentati con strutture dati su heap Ling. Imperativi: Strutture concatenate (ottenute con riferimenti/puntatori) Allocazione esplicita Ling. Funzionali: espressione diretta di val. di tipi ricorsivi No deallocazione 1 ListaInt: (2,(33,(1,(4,(3,(1,21,null))))))) 2 3 CharAlbero: 4 (A, 5 (B, 6 (C,null,null), 7 (D, 8 (E,null,null), 9 null 10 ), 11 (F,null,null) 12 ) B A C / / D / E / / F / / Strutture Dati 9 mag, / 88
52 Tipi di funzioni Alcuni linguaggi permettono di definire tipi di funzioni i valori di questi tipi sono funzioni tipo di funzione denotato con T f(s1 s1, S2 s2,..., Sn sn) {...} oppure anche con S1 x S2 x... x Sn -> T Operazioni Definizione (soprattutto funzionali) Applicazione (chiamata su parametri effettivi) Valori implementati come puntatori PASCAL, C, C++ Strutture Dati 9 mag, / 88
53 Agenda 1 Tipi e sistemi di tipi 2 Tipi scalari 3 Tipi Composti 4 Relazioni fra tipi Equivalenza Compatibilità e conversione di tipo Polimorfismo Controllo e Inferenza 5 Strutture dati e gestione della memoria Strutture Dati 9 mag, / 88
54 Equivalenza Regole utili a stabilire quando due tipi, formalmente diversi, sono intercambiabili, ossia non distinguibili nel loro uso per due tipi equivalenti, ogni espressione/valore del primo tipo è anche espressione/valore del secondo e viceversa Definizione di un nuovo tipo type nuovotipo = espressionetipo Regole per la sua interpretazione: Definizione opaca: equivalenza per nome Definizione trasparente: equivalenza strutturale Strutture Dati 9 mag, / 88
55 Equivalenza per nome Ogni nuova definizione introduce un nuovo tipo Definizione (equivalenza per nome) Due tipi si dicono equivalenti per nome sse hanno lo stesso nome un tipo è equivalente solo a se stesso Esempio T1 = 1..10; T2 = 1..10; T3 = int; T4 = int; sono tutti diversi e non equivalenti Strutture Dati 9 mag, / 88
56 Equivalenza per nome [... cont.] Osservazioni vincolo indebolito in alcuni linguaggi (PASCAL) nell es. la ridenominazione genera alias e non nuovi tipi (caso di T3 e T4) Ogni def. di tipo in un solo punto: OK dal punto di vista ingegneristico Equivalenza relativa ad un programma, non in generale Strutture Dati 9 mag, / 88
57 Equivalenza strutturale Definizioni trasparenti: nome come abbreviazione del nuovo tipo definito conta la sostituzione dei nomi con le definizioni dei tipi Definizione (Equivalenza strutturale) Due tipi T1 e T2 sono strutturalmente equivalenti sse hanno lo stesso nome, oppure T1 è definito con type T1 = espressione; ed espressione rappresenta un tipo equivalente a T2, oppure T1 e T2 definiti applicando lo stesso costruttore di tipo a due tipi tra loro equivalenti Strutture Dati 9 mag, / 88
58 Equivalenza strutturale [... cont.] Esempi (pseudo-codice) equivalenza di T3 e T4 1 type T1 = int; 2 type T2 = char; 3 type T3 = struct { T1 a; T2 b; } 4 type T4 = struct { int a; char b; } equivalenti? 1 type S = struct { int a; int b; } 2 type T = struct { int n; int m; } 3 type U = struct { int m; int n; } equivalenti? (ricorsione) 1 type R1 = struct { int a; R2 p; } 2 type R2 = struct { int a; R1 p; } Osservazioni Strutture Dati 9 mag, / 88
59 Equivalenza strutturale [... cont.] Equivalenza strutturale non legata al singolo programma Sostituzione sempre possibile: si parla di trasparenza referenziale I linguaggi spesso adottano regole di equivalenza miste Strutture Dati 9 mag, / 88
60 Compatibilità Il tipo T è compatibile con il tipo S sse un valore del tipo T è ammesso in qualsiasi contesto in cui sarebbe richiesto un valore di tipo S Compatibilità più debole dell equivalenza Due tipi equivalenti sono sempre compatibili (ma non viceversa) Relazione riflessiva, transitiva ma non simmetrica es. char e int Relazione adottata da molti linguaggi nella disciplina dell assegnamento: tra il tipo dell espressione (RHS) e quello della variabile (LHS) nella disciplina del passaggio parametri Strutture Dati 9 mag, / 88
61 Compatibilità [... cont.] Gradi di compatibilità: T compatibile con S 1 T e S equivalenti 2 I valori di T costituiscono un sottoinsieme dei valori di S es. tipi intervallo 3 Tutte le operazioni per S sono ammissibili sui valori di T es. record e op. di selezione. type S = struct {int a;} type T = struct {int a; char b;} rel. di sottotipo (nei linguaggi ad oggetti) 4 I valori di T corrispondono canonicamente a certi valori di S int e float 5 I valori di T corrispondono ad alcuni valori di S, tramite una convenzione per la trasformazione da T a S float e int, tramite arrotondamento, troncamento,... Strutture Dati 9 mag, / 88
62 Conversione di tipo Conversione implicita: operata tacitamente dalla macchina astratta si chiama anche coercizione, o conversione forzata Conversione esplicita: indicata mediante costrutti linguistici nel sorgente del programma si chiama anche cast Strutture Dati 9 mag, / 88
63 Coercizioni Se T compatibile con S: valori di tipo T sono ammessi dov è atteso un valore di tipo S Conversione operata dalla m. astratta (o dal compilatore) Implementazioni Stessa rappresentazione livello sintattico, nulla da aggiungere Compatibilità canonica codice di conversione (a run-time) aggiunto dalla m. astratta es. da int a float Corrispondenza arbitraria es. dominio di T sovrainsieme di quello di S la macchina astratta inserisce codice per la conversione (e controllo dinamico per la type safety) es.: T è int e S è un intervallo di interi Strutture Dati 9 mag, / 88
64 Conversioni esplicite Annotazioni nel linguaggio che specificano il tipo in cui trasformare un valore di un altro tipo Possibilità Indicazione sintattica S s = (S)t; Indicazione per la macchina astratta (come prima) Vantaggi In genere, possibile anche quando basterebbe la compatibilità Maggiore leggibilità Indipendenza dal contesto sintattico Utili ad overloading e polimorfismo Strutture Dati 9 mag, / 88
65 Polimorfismo Sistema di tipi monomorfo: ogni oggetto ha un solo tipo Sistema di tipi polimorfo: ogni oggetto può avere più tipi Casi di polimorfismo in molti linguaggi (anche datati) operatore + int x int -> int oppure float x float -> float funzione length: non dipende dal tipo di vettore Funzioni polimorfiche indipendenti da tipi specifici Es. ordinamento di vettori (di interi, caratteri, ecc.) con uso di tipi generici: void sort(<t>[] v) Tipologie: Polimorfismo ad hoc (overloading) Polimorfismo universale p. parametrico p. di sottotipo o inclusione Strutture Dati 9 mag, / 88
66 Polimorfismo [... cont.] Polimorfismo ad hoc: overloading Nome sovraccaricato quando vi corrispondono più oggetti L informazione del contesto aiuta a decidere staticamente es. operatore + es. funzioni con ugual nome ma tipo e numero di parametri differente Polimorfismo apparente Legato ai nomi più che agli oggetti del linguaggio es. funzioni distinte / codice distinto Può essere gestito con una fase di pre-processing assegna un nome interno diverso ai nomi sovraccarichi Overloading Coercizione es. + polimorfico 1 + 2, , , Strutture Dati 9 mag, / 88
67 Polimorfismo [... cont.] Polimorfismo parametrico universale: un valore può assumere tanti tipi diversi, ottenuti per istanziazione di un unico schema universale Codice di gestione unico che lavora uniformemente le differenze non contano Istanziazione automatica: compilatore o macchina astratta in base al contesto Strutture Dati 9 mag, / 88
68 Polimorfismo [... cont.] Esempi p. universale Valore null vale per tutti i tipi puntatore (T * ) Tipo indicabile con <T> * void sort(<t>[] v) funzione di tipo <T>[]->void Funzione di swap() chiamata da sort() void swap(reference <T>, reference <T>) e istanziazione 1 int * k = null; 2 char v,w; 3 int i,j; swap(v,w); 6 swap(i,j); Strutture Dati 9 mag, / 88
69 Polimorfismo [... cont.] Polimorfismo parametrico universale p. esplicito annotazioni esplicite: <T> Template C++, Generics JAVA 5.0+ p. implicito operato dal modulo di inferenza dei tipi Ling. di scripting Ling. funzionali: l applicazione comporta istanziazione giusta es. fun Ide(x){return x;} è di tipo <T> -> <T> Funzioni di ordine superiore es. fun Comp(f,g,x){return f(g(x));} di tipo ((<S> -> <T>) (<R> -> <S>) <R>) -> <T> Strutture Dati 9 mag, / 88
70 Polimorfismo [... cont.] Non tutte le istanziazioni dello schema universale sono ammissibili, quindi: forma limitata tipica degli OOL una forma di compatibilità strutturale Nel p. universale di sottotipo: un valore può assumere una molteplicità di tipi diversi, ottenuti istanziando, in uno schema generale, un parametro con sottotipi di un tipo assegnato esprimibile tramite la notazione: S :< T.S -> void dove :< indica la rel. di sottotipo istanziabile con qualunque sottotipo S di T Strutture Dati 9 mag, / 88
71 Polimorfismo [... cont.] Implementazione gestione statica: a linking-time istanziazione funzioni polimorfe (in base ai tipi) produzione codice opportuno (più copie del template) e collegamento efficiente come per le funzioni non polimorfiche es. template C++ gestione dinamica: unica versione del codice generata rappresentazione più complessa: invece di allocare i dati sul RdA vengono allocati loro descrittori (dim., struttura, ind.) più flessibile ma meno efficiente a run-time es. in ML Strutture Dati 9 mag, / 88
72 Controllo di tipo Il controllo di tipo determina e controlla la compatibilità dei tipi degli oggetti: assegnazioni, dichiarazioni, uso parametri, conversioni,... statico: modulo del compilatore (semantica statica) segue l albero sintattico (bottom-up) determina e trasmette le informazioni sui tipi degli oggetti coinvolti dinamico: modulo di supporto al run-time Strutture Dati 9 mag, / 88
73 Inferenza di tipo Inferenza: deduzione dei tipi coinvolti in assenza di informazione esplicita spesso sostituisce il controllo di tipo es. in JAVASCRIPT, ML,... quando non si può determinare subito il tipo si utilizzano variabili di tipo: a es. fun f(n) { return n+1; } si può dedurre che f è di tipo int-> int caso difficile: fun g(v) { return v; } polimorfa Strutture Dati 9 mag, / 88
74 Inferenza di tipo [... cont.] Algoritmo: dato l albero di derivazione assegnare un tipo/var. di tipo ad ogni nodo (anche variabile) risalire l albero imponendo vincoli (uguaglianze di tipo) usare l algoritmo di unificazione per risolvere i vincoli Esempio fun f(n) { return n+1; } <funzione> a = int->int fun f ( <par> ) <blocco> z=int n { <istruzione> } return <espr> ; x = y = int x n + 1 y Strutture Dati 9 mag, / 88
75 Agenda 1 Tipi e sistemi di tipi 2 Tipi scalari 3 Tipi Composti 4 Relazioni fra tipi 5 Strutture dati e gestione della memoria Dangling reference Garbage collection Strutture Dati 9 mag, / 88
76 Dangling reference Esempio 1 int * p = malloc(); 2 int * q = malloc(); 3 4 * p = 123; 5 * q = 321; 6 7 q=p; 8 9 free(p); // q dangling reference! Strutture Dati 9 mag, / 88
77 Dangling reference - tombstone Si aggiunge un livello di indirizzamento indiretto, quello della tombstone allocazione di nuovo oggetto su heap/pila: crea tombstone copia tra puntatori: copia indirizzi di tombstone deallocazione (da heap/pila): inserimento valore nullo speciale Strutture Dati 9 mag, / 88
78 Dangling reference - tombstone [... cont.] p = malloc(); q = malloc(); * p = 123; * q = 321; q = p; free(p); p RIP q Osservazioni spazio: memoria aggiuntiva cimitero: zona di memoria speciale per le tombstone riuso delle tombstone (garbage collection) tempo: doppia dereferenziazione eventualmente + garbage collection Strutture Dati 9 mag, / 88
79 Dangling reference locks & keys lucchetto parola in memoria inizializzata con valore casuale associata all oggetto allocato chiave parola in memoria corrispondente ad un lucchetto puntatore = indirizzo + chiave allocazione di nuovo oggetto su heap: crea lucchetto copia tra puntatori: copia di indirizzo e chiave dereferenziazione: controllo che la chiave del puntatore apra il lucchetto (abbia lo stesso valore) deallocazione: inserimento valore nullo speciale nel lucchetto Strutture Dati 9 mag, / 88
80 Dangling reference locks & keys [... cont.] p = malloc(); q = malloc(); * p = 123; * q = 321; q = p; free(p); p q Osservazioni spazio: memoria aggiuntiva tempo : op. più efficienti che con il tombstone deallocazione automatica della mem. aggiuntiva Strutture Dati 9 mag, / 88
81 Garbage collection Deallocazione implicita GC: Storia dei LdP LISP 60 JAVA 90 Fasi (non necessariamente separate) distinguere gli oggetti utilizzati dagli altri per sicurezza politica conservativa recuperare la memoria degli oggetti non utilizzati Classificazione dei GC contatori di riferimenti marcatura mark & sweep mark & compact copia Strutture Dati 9 mag, / 88
82 Garbage collection contatori Un contatore (reference count) per ogni oggetto; solo per la m. astratta: inaccessibile al programmatore allocazione: inizializza il contatore a 1 assegnazione q = p; (o anche quando si esce da un ambiente locale con puntatori) incremento del contatore della var. puntata da p decremento del contatore della var. puntata da q deallocazione: quando un contatore raggiunge il valore 0 si può deallocare la memoria e restituirla alla lista libera Osservazioni se l oggetto da deallocare contiene puntatori applica la procedura ricorsivamente vantaggi: semplicità e incrementalità svantaggi: inefficienza; GC non funziona con str. circolari Strutture Dati 9 mag, / 88
83 Garbage collection mark & sweep mark sweep marcatura oggetti non in uso attraversando l heap a partire dai puntatori sulla pila (root set), visita in ampiezza/profondità degli oggetti referenziati, lungo gli archi rappresentati dai puntatori, etichettando gli oggetti attraversati come in uso deallocazione degli oggetti marcati come non in uso Osservazioni (svantaggi) non incrementale: parte quando la memoria si sta esaurendo frammentazione esterna inefficiente: tempo proporzionale alla dim. dell heap sfavorisce la località dei riferimenti in memoria Strutture Dati 9 mag, / 88
84 Garbage collection pointer reversal Per visitare agevolmente strutture concatenate (es. alberi) in fase di deallocazione occorre uno stack (ricorsione) Con il rovesciamento dei puntatori basta ricordare il nodo corrente e quello precedente A A B F / / B F / / C / D / / p.prec C / D / corrente E / / stack: A B C p.corr E / / Strutture Dati 9 mag, / 88
85 Garbage collection mark & compact Problema della frammentazione causato dal mark & sweep Fase di sweep = fase di compattamento oggetti spostati in zone di mem. contigue più passaggi necessari Osservazioni svantaggi più passaggi necessari: marcatura calcolo nuovi puntatori, spostamento,... vantaggi no frammentazione località dei riferimenti lista libera monoblocco Strutture Dati 9 mag, / 88
86 Garbage collection copia No fase marcatura: copia (e compattazione) dei blocchi vivi GC stop & copy: heap diviso in 2 semispazi (FromSpace,ToSpace) normalmente solo 1 in uso (FromSpace); memoria libera = unico blocco memoria esaurita: chiamata al GC a partire dal root set si copia (alg. di Cheney) nell altro semispazio (tospace), compattando quindi ToSpace e FromSpace si scambiano i ruoli Osservazioni vantaggi allocazione efficiente: soprattutto se è noto il fabbisogno degli oggetti vivi contemporaneamente no frammentazione Strutture Dati 9 mag, / 88
87 Garbage collection copia [... cont.] FromSpace ToSpace root set root set ToSpace FromSpace libera Strutture Dati 9 mag, / 88
88 Riferimenti Gabbrielli & Martini: Linguaggi di Programmazione, McGraw-Hill. 2a edizione. Cap. 10 Strutture Dati 9 mag, / 88
Programmazione II. Lezione 16. Daniele Sgandurra 14/12/2010.
Programmazione II Lezione 16 Daniele Sgandurra daniele.sgandurra@iit.cnr.it 14/12/2010 1/29 Programmazione II Lezione 16 14/12/2010 Sommario 1 2/29 Programmazione II Lezione 16 14/12/2010 Parte I 3/29
Corso di Linguaggi di Programmazione
Corso di Linguaggi di Programmazione Lezione 7 Chiara Braghin braghin@dti.unimi.it Dipartimento di Tecnologie dell Informazione Università degli Studi di Milano 19 Marzo 2007 Tipo di dato Definition In
Linguaggi di Programmazione
Linguaggi di Programmazione Corso di Laurea in Informatica Strutturare i dati Valeria Carofiglio (Questo materiale è una rivisitazione del materiale prodotto da Nicola Fanizzi) obiettivi Tipi e Sistemi
Corso di Linguaggi di Programmazione
Corso di Linguaggi di Programmazione Lezione 14 Alberto Ceselli alberto.ceselli@unimi.it Dipartimento di Informatica Università degli Studi di Milano 23 Aprile 2013 Cosa servono i tipi durante l analisi
Il linguaggio C. Puntatori e dintorni
Il linguaggio C Puntatori e dintorni 1 Puntatori : idea di base In C è possibile conoscere e denotare l indirizzo della cella di memoria in cui è memorizzata una variabile (il puntatore) es : int a = 50;
Costanti e Variabili
Parte 3 Costanti e Variabili Identificatori Un identificatore è un nome che viene associato a diverse entità (costanti, tipi, variabili, funzioni, ecc.) e serve ad identificare la particolare entità Gli
Variabili dinamiche. Obiettivi: Presentare le variabili dinamiche, allocate e deallocate nell area HEAP, e le funzioni malloc e free
Variabili dinamiche Obiettivi: Presentare le variabili dinamiche, allocate e deallocate nell area HEAP, e le funzioni malloc e free 1 Tipi di variabili in C In C è possibile classificare le variabili in
Tipi di dato. Il concetto di tipo di dato viene introdotto per raggiungere due obiettivi:
Tipi di dato Il concetto di tipo di dato viene introdotto per raggiungere due obiettivi: esprimere in modo sintetico la loro rappresentazione in memoria, e un insieme di operazioni ammissibili permettere
Programmazione II. Lezione 7. Daniele Sgandurra 9/11/2010.
Programmazione II Lezione 7 Daniele Sgandurra daniele.sgandurra@iit.cnr.it 9/11/2010 1/24 Programmazione II Lezione 7 9/11/2010 Sommario 1 Gestione della Memoria 2/24 Programmazione II Lezione 7 9/11/2010
Astrazione Dati. Nicola Fanizzi. Linguaggi di Programmazione [010194] 10 mag, Dipartimento di Informatica Università degli Studi di Bari
Astrazione Dati Nicola Fanizzi Dipartimento di Informatica Università degli Studi di Bari Linguaggi di Programmazione [010194] 10 mag, 2016 Sommario 1 Astrazione dati Incapsulamento Esempio / ADT pila
Corso di Linguaggi di Programmazione
Corso di Linguaggi di Programmazione Lezione 13 Alberto Ceselli (thanks C. Braghin) alberto.ceselli@unimi.it Dipartimento di Tecnologie dell Informazione Università degli Studi di Milano 21 Aprile 2009
Linguaggi di Programmazione Corso C. Parte n.10 Gestione della Memoria. Nicola Fanizzi
Linguaggi di Programmazione Corso C Parte n.10 Gestione della Memoria Nicola Fanizzi (fanizzi@di.uniba.it) Dipartimento di Informatica Università degli Studi di Bari Gestione della Memoria I moderni linguaggi
Ogni variabile in C è una astrazione di una cella di memoria a cui corrisponde un nome, un contenuto e un indirizzo.
Ogni variabile in C è una astrazione di una cella di memoria a cui corrisponde un nome, un contenuto e un indirizzo. int a = 5; a 5 α=&a Esistono in C particolari variabili dette puntatori che possono
DISPENSE DI PROGRAMMAZIONE LINGUAGGI A TIPIZZAZIONE FORTE: IL COSTRUTTO DI TIPO. TIPI SEMPLICI: TIPI PRE-DEFINITI E TIPI DEFINITI DAL PROGRAMMATORE.
DISPENSE DI PROGRAMMAZIONE Modulo 3 Linguaggi di programmazione: dati e controllo (Parte I) LINGUAGGI A TIPIZZAZIONE FORTE: IL COSTRUTTO DI TIPO. TIPI SEMPLICI: TIPI PRE-DEFINITI E TIPI DEFINITI DAL PROGRAMMATORE.
Informatica 3. LEZIONE 5: Tipi di dati
Informatica 3 LEZIONE 5: Tipi di dati Modulo 1: Tipi e costruttori di tipo Modulo 2: Tipi definiti dall utente e tipi di dati astratti Modulo 3: Sistemi di tipi Informatica 3 Lezione 5 - Modulo 1 Tipi
Strutture dati e loro organizzazione. Gabriella Trucco
Strutture dati e loro organizzazione Gabriella Trucco Introduzione I linguaggi di programmazione di alto livello consentono di far riferimento a posizioni nella memoria principale tramite nomi descrittivi
Informatica 3. Informatica 3. LEZIONE 5: Tipi di dati. Lezione 5 - Modulo 1. Tipi predefiniti. Introduzione
Informatica 3 Informatica 3 LEZIONE 5: Tipi di dati Lezione 5 - Modulo 1 Modulo 1: Tipi e costruttori di tipo Modulo 2: Tipi definiti dall utente e tipi di dati astratti Modulo 3: Sistemi di tipi Tipi
Gestione della Memoria
Gestione della Memoria Nicola Fanizzi Dipartimento di Informatica Università degli Studi di Bari Linguaggi di Programmazione [010194] 27 apr, 2016 Sommario 1 Tecniche di gestione Progetto della gestione
Per quanto sappiamo finora, in C le variabili sono sempre definite staticamente. per variabili di tipo array, in cui dover
ALLOCAZIONE STATICA: LIMITI Per quanto sappiamo finora, in C le variabili sono sempre definite staticamente la loro esistenza deve essere prevista e dichiarata a priori Questo può rappresentare un problema
Allocazione dinamica della memoria
Allocazione dinamica della memoria Allocazione statica: limiti Per quanto sappiamo finora, in C le variabili sono sempre dichiarate staticamente la loro esistenza deve essere prevista e dichiarata a priori
Macchine astratte, linguaggi, interpretazione, compilazione
Macchine astratte, linguaggi, interpretazione, compilazione 1 Macchine astratte una collezione di strutture dati ed algoritmi in grado di memorizzare ed eseguire programmi componenti della macchina astratta
Programmazione II. Lezione 9. Daniele Sgandurra 16/11/2010.
Programmazione II Lezione 9 Daniele Sgandurra daniele.sgandurra@iit.cnr.it 16/11/2010 1/31 Programmazione II Lezione 9 16/11/2010 Sommario 1 Gestione della Memoria 2/31 Programmazione II Lezione 9 16/11/2010
Lezione 6 Introduzione al C++ Mauro Piccolo
Lezione 6 Introduzione al C++ Mauro Piccolo piccolo@di.unito.it Linguaggi di programmazione Un linguaggio formale disegnato per descrivere la computazione Linguaggi ad alto livello C, C++, Pascal, Java,
LINGUAGGI DI PROGRAMMAZIONE
LINGUAGGI DI PROGRAMMAZIONE Il potere espressivo di un linguaggio è caratterizzato da: quali tipi di dati consente di rappresentare (direttamente o tramite definizione dell utente) quali istruzioni di
Sommario Obiettivo della programmazione e ciclo di sviluppo di programmi. Programmi. Ciclo di sviluppo di programmi. Obiettivo
Sommario Obiettivo della programmazione e ciclo di sviluppo di programmi Istruzioni variabili e tipi Sottoprogrammi Strutture di controllo Ricorsione 1 2 Obiettivo Ciclo di sviluppo di programmi Risoluzione
Il linguaggio C. Puntatori e dintorni
Il linguaggio C Puntatori e dintorni 1 Puntatori : idea di base In C è possibile conoscere e denotare l indirizzo della cella di memoria in cui è memorizzata una variabile (il puntatore) es : int a = 50;
Cast implicito. Il cast è fatto automaticamente quando un tipo più basso viene assegnato ad un tipo più alto. byte short int long float double
Il cast Cast implicito Il cast è fatto automaticamente quando un tipo più basso viene assegnato ad un tipo più alto Per esempio: byte short int long float double int x = 10; float f; f = x; Il valore di
Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I
Lezione 4 Elementi lessicali e espressioni logiche Matricole 2-3 Elementi lessicali il linguaggio C ha un suo vocabolario di base i cui elementi sono detti token esistono 6 tipi di token: parole chiave
Allocazione dinamica della memoria
Allocazione dinamica della memoria Violetta Lonati Università degli studi di Milano Dipartimento di Informatica Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica Violetta Lonati
Informatica 3. LEZIONE 2: Sintassi e semantica
Informatica 3 LEZIONE 2: Sintassi e semantica Modulo 1: Introduzione ai concetti di sintassi e semantica Modulo 2: Il concetto di binding Modulo 3: Variabili Modulo 4: Routine Convenzioni dei nomi Informatica
Gestione dinamica della memoria
Programmazione M-Z Ingegneria e Scienze Informatiche - Cesena A.A. 2016-2017 Gestione dinamica della memoria Pietro Di Lena - pietro.dilena@unibo.it A pessimistic programmer sees the array as half empty.
PROGRAMMAZIONE Gestione della Memoria e Garbage Collection
PROGRAMMAZIONE 2 23. Gestione della Memoria e Garbage Collection 1 Gestione della memoria Static area dimensione fissa, contenuti determinati e allocati a tempo di compilazione Runtime stack dimensione
Informatica e Tecnologie per la Produzione del Software Crediti formativi 7+2
Principali informazioni sull insegnamento Titolo insegnamento Linguaggi di programmazione Corso di studio Informatica e Tecnologie per la Produzione del Software Crediti formativi 7+2 Denominazione inglese
La sezione di dichiarazione delle costanti 1.2 I tipi elementari Classificazione dei tipi Il tipo integer Il tipo boolean
Laboratorio di Programmazione A.A. 2000\2001 La sezione di dichiarazione delle costanti 1.2 I tipi elementari Classificazione dei tipi Il tipo integer Il tipo boolean Editazione a cura di: de Pinto E.
Indice. Prefazione. 3 Oggetti e Java 53
Prefazione xv 1 Architettura dei calcolatori 1 1.1 Calcolatori e applicazioni 1 1.1.1 Alcuni esempi di applicazioni 3 1.1.2 Applicazioni e interfacce 4 1.2 Architettura dei calcolatori 7 1.2.1 Hardware
Dichiarazioni e tipi predefiniti nel linguaggio C
Politecnico di Milano Dichiarazioni e tipi predefiniti nel linguaggio C Variabili, costanti, tipi semplici, conversioni di tipo. Premessa Programmi provati sul compilatore Borland C++ 1.0 Altri compilatori:
Strutture Dati Dinamiche
Strutture Dati Dinamiche Motivazioni Le variabili considerate fino a questo punto devono essere dichiarate staticamente, ossia la loro esistenza, il loro nome e la loro dimensione devono essere previsti
ALGORITMI E STRUTTURE DATI
Esercitazioni del corso di: ALGORITMI E STRUTTURE DATI Tutor: Francesca Piersigilli email: francesca.piersigilli@unicam.it Strutture dati elementari Tecniche di organizzazione dei dati: scelta della struttura
Informatica 3. Informatica 3. LEZIONE 2: Sintassi e semantica. Lezione 2- Modulo 1. Le componenti di un linguaggio di programmazione
Informatica 3 Informatica 3 LEZIONE 2: Sintassi e semantica Lezione 2- Modulo 1 Modulo 1: Introduzione ai concetti di sintassi e semantica Modulo 2: Il concetto di binding Modulo 3: Variabili Modulo 4:
Il linguaggio C. Notate che...
Il linguaggio C Notate che... 1 Il C è un linguaggio a blocchi int main (void) { blocco } 2 Il C è un linguaggio a blocchi (2) Non è possibile mischiare dichiarazioni e comandi! int main (void) { } Dichiarazione
Linguaggi di Programmazione
Linguaggi di Programmazione Corso di Laurea in Informatica Astrarre sui dati Valeria Carofiglio (Questo materiale è una rivisitazione del materiale prodotto da Nicola Fanizzi) Obiettivi tipi di dato astratti
Lezione March 26-28, Lezione 18-19
March 26-28, 2012 Tipi di Dati e Tipi del Linguaggio Terminologia: Tipi (o classi) di dato e Tipi del linguaggio Tipi di Dato: Proprietà Generali Scalari Strutturati Sistemi di deallocazione di memoria
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati Università di Camerino Corso di Laurea in Informatica (12 CFU) I periodo didattico Emanuela Merelli email:emanuela.merelli@unicam.it Argomenti della lezione Elementi di un linguaggio
Il puntatore. Il puntatore
Il puntatore È un tipo scalare, che consente di rappresentare gli indirizzi delle variabili allocate in memoria. Il dominio di una variabile di tipo puntatore è un insieme di indirizzi: Il valore di una
Liste concatenate e allocazione dinamica
Liste concatenate e allocazione dinamica Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2017/2018 Calendario delle lezioni Ogni lezione consta di una spiegazione assistita da slide,
! Per quanto sappiamo finora, in C le variabili sono sempre definite staticamente
! Per quanto sappiamo finora, in C le variabili sono sempre definite staticamente!!la loro esistenza deve essere prevista e dichiarata a priori! Questo può rappresentare un problema soprattutto per variabili
Programmazione I - corso B a.a prof. Viviana Bono
Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica Programmazione I - corso B a.a. 2009-10 prof. Viviana Bono Blocco 12 Riepilogo e complementi sui tipi Ripasso del sistema di tipi
Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di
ARRAY DI PUNTATORI Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di puntatori Ad esempio: char * stringhe[4]; definisce un vettore di 4 puntatori a carattere
Il linguaggio C Variabili e tipi di dato primitivi
Il linguaggio C Variabili e tipi di dato primitivi main() { /*definizioni variabili: */ char y= a ; /*codice(a)=97*/ int x,x,y; unsigned int Z; float SUM; double r; /* parte istruzioni: */ X=27; Y=4; Z
Nomi. Nomi e ambiente. Nomi e oggetti denotabili. Sintassi
Nomi Nomi e ambiente Blocchi e regole di scoping Meccanismi di astrazione fondamentale per gestire la complessità del software. Uso dei nomi: un meccanismo di astrazione. Nome: sequenza di caratteri usata
Macchine Astratte. Nicola Fanizzi Dipartimento di Informatica Università degli Studi di Bari. Linguaggi di Programmazione feb, 2016
Macchine Astratte Nicola Fanizzi Dipartimento di Informatica Università degli Studi di Bari Linguaggi di Programmazione 010194 29 feb, 2016 Sommario 1 Introduzione Macchina astratta Interprete Implementazione
Linguaggio C - sezione dichiarativa: costanti e variabili
Dipartimento di Elettronica ed Informazione Politecnico di Milano Informatica e CAD (c.i.) - ICA Prof. Pierluigi Plebani A.A. 2008/2009 Linguaggio C - sezione dichiarativa: costanti e variabili La presente
cap.6 del testo a cosa servono i tipi nei linguaggi di programmazione cos è un linguaggio type safe
cap.6 del testo a cosa servono i tipi nei linguaggi di programmazione cos è un linguaggio type safe 1 tipi statici e tipi dinamici in generale i LP hanno tipi statici, cioè ogni variabile ha un tipo dichiarato
Corso di Fondamenti di Informatica Università degli Studi di Cassino
Un linguaggio ad alto livello deve offrire degli strumenti per: rappresentare le informazioni di interesse dell algoritmo definire le istruzioni che costituiscono l algoritmo Cominciamo ad analizzare la
Corso di Informatica
Corso di Informatica Modulo T2 2 I tipi di dato Prerequisiti Concetto di relazione e funzione Concetto di insieme numerico Operatori aritmetici Operatori relazionali 2 Introduzione Abbiamo visto che un
Tipi di dato personalizzati Array di struct. Tipi di dato utente. Laboratorio di Programmazione I. Corso di Laurea in Informatica A.A.
Array di Tipi di dato utente Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2016/2017 Array di Calendario delle lezioni Lez. 1 Lez. 2 Lez. 3 Lez. 4 Lez. 5 Lez. 6 Lez. 7 Lez. 8 - Introduzione
Strutture Dati. Nicu Sebe. Informatica Nicu Sebe 1 / 27
Strutture Dati Nicu Sebe Informatica Nicu Sebe 1 / 27 Dati e Tipi di Dati e Spazi Una variabile è caratterizzata dal suo Tipo Specifica i valori che può assumere (Insieme di Definizione) Specifica a quanti
Il potere espressivo di un linguaggio è caratterizzato da: PROGRAMMA = DATI + CONTROLLO
LINGUAGGI DI PROGRAMMAZIONE Il potere espressivo di un linguaggio è caratterizzato da: quali tipi di dati consente di rappresentare (direttamente o tramite definizione dell utente) quali istruzioni di
Corso di Informatica
Corso di Informatica Modulo T4 A1 Allocazione dinamica 1 Prerequisiti Programmazione elementare Programmazione ad oggetti Dati semplici e strutturati 2 1 Introduzione In molti problemi capita di non conoscere
Unità Didattica 4 Linguaggio C. Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo.
Unità Didattica 4 Linguaggio C Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo. 1 Vettori Struttura astratta: Insieme di elementi dello stesso tipo, ciascuno individuato da un indice;
Programmazione con Java
Programmazione con Java Classi e istanze in Java Definizione di classe in Java A meno che non si usino classi già scritte da altri, prima di poter creare un qualsiasi oggetto devo creare la sua rappresentazione:
Allocazione Dinamica. Allocazione Statica. malloc() La funzione malloc()
Allocazione Statica Finora abbiamo visto che le variabili sono sempre definite staticamente. Questo è un limite perché la loro esistenza deve essere prevista e dichiarata a priori. In particolare per variabili
IL LINGUAGGIO JAVA. Input, Tipi Elementari e Istruzione Condizionale. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica
Fondamenti di Informatica IL LINGUAGGIO JAVA Input, Tipi Elementari e Istruzione Condizionale Fondamenti di Informatica - D. Talia - UNICAL 1 Primo esempio di un programma Java Semplicissimo programma
Caratteristiche di un linguaggio ad alto livello
Caratteristiche di un linguaggio ad alto livello Un linguaggio ad alto livello deve offrire degli strumenti per: rappresentare le informazioni di interesse dell algoritmo definire le istruzioni che costituiscono
Esercizi. Grammatiche, scoping. Univ. di Udine. Grammatiche, scoping (Univ. di Udine) Esercizi 1 / 29
Esercizi Grammatiche, scoping Univ. di Udine Grammatiche, scoping (Univ. di Udine) Esercizi 1 / 29 Linguaggi e grammatiche Definire i numeri divisibili per 2 in base 3, come grammatica libera da contesto
Corso di Fondamenti di Informatica e Laboratorio
Corso di Fondamenti di Informatica e Laboratorio Corsi di Laurea Ingegneria Informatica (O-Z) Corsi di Laurea Ingegneria delle Telecomunicazioni - (A-Z) (ordinamento 03) A.A. 2009-2010 Prof. Giuseppe Mangioni
Tipi user-defined. parte dichiarativa globale:
Il C mette a disposizione un insieme di tipi di dato predefiniti (tipi built-in) e dei meccanismi per definire nuovi tipi (tipi user-defined) Vediamo le regole generali che governano la definizione di
LINGUAGGI DI PROGRAMMAZIONE!
LINGUAGGI DI PROGRAMMAZIONE! Il potere espressivo di un linguaggio è! caratterizzato da:! quali tipi di dati consente di rappresentare (direttamente o tramite definizione dell utente)! quali istruzioni
Gestione della memoria
Gestione della memoria Stefano Ferrari Università degli Studi di Milano stefano.ferrari@unimi.it Programmazione anno accademico 2017 2018 Allocazione di memoria A una variabile puntatore si può assegnare
Puntatori. Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori
Puntatori Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori 1 Il puntatore Un tipo puntatore è un tipo scalare per
Puntatori. Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori
Puntatori Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori 1 Il puntatore Un tipo puntatore è un tipo scalare per
IL LINGUAGGIO JAVA Input, Tipi Elementari e Istruzione Condizionale
Fondamenti di Informatica IL LINGUAGGIO JAVA Input, Tipi Elementari e Istruzione Condizionale Fondamenti di Informatica - D. Talia - UNICAL 1 Lettura di dati da input In Java la lettura di dati da input
La programmazione nel linguaggio C. Liste
Liste È molto comune dover rappresentare sequenze di elementi tutti dello stesso tipo e fare operazioni su di esse. Esempi: sequenza di interi (23 46 5 28 3) sequenza di caratteri ( x r f ) sequenza di
Linguaggi e grammatiche. Esercizi. Linguaggi e grammatiche. Linguaggi e grammatiche
Esercizi Grammatiche, scoping Univ. di Udine Grammatiche, scoping (Univ. di Udine) Esercizi 1 / 29 Linguaggi e grammatiche Definire i numeri divisibili per 2 in base 3, come grammatica libera da contesto
IL LINGUAGGIO JAVA. Input, Tipi Elementari e Istruzione Condizionale. Primo esempio di un programma Java
Fondamenti di Informatica IL LINGUAGGIO JAVA Input, Tipi Elementari e Istruzione Condizionale Fondamenti di Informatica - D. Talia - UNICAL 1 Primo esempio di un programma Java Semplicissimo programma
Strutture Dati. Luca Abeni
Strutture Dati Luca Abeni Dati e Tipi di Dati Una variabile è caratterizzata dal suo Tipo Specifica i valori che può assumere (Insieme di Definizione) Specifica a quanti byte di memoria la variabile è
Liste concatenate e allocazione dinamica
Liste concatenate e allocazione dinamica Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2018/2019 Argomenti del Corso Ogni lezione consta di una spiegazione assistita da slide, e seguita
Fondamenti di Informatica e Laboratorio T-AB T-15 Strutture dati
Fondamenti di Informatica e Laboratorio T-AB T-15 Strutture dati Paolo Torroni Dipartimento di Elettronica, Informatica e Sistemistica Università degli Studi di Bologna Anno Accademico 2008/2009 Sommario
Indice PARTE A. Prefazione Gli Autori Ringraziamenti dell Editore La storia del C. Capitolo 1 Computer 1. Capitolo 2 Sistemi operativi 21 XVII XXIX
Indice Prefazione Gli Autori Ringraziamenti dell Editore La storia del C XVII XXIX XXXI XXXIII PARTE A Capitolo 1 Computer 1 1.1 Hardware e software 2 1.2 Processore 3 1.3 Memorie 5 1.4 Periferiche di
ARRAY DI PUNTATORI. ARRAY DI PUNTATORI Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di puntatori
ARRAY DI PUNTATORI Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di puntatori Ad esempio: char * stringhe[4]; definisce un vettore di 4 puntatori a carattere
La gestione della memoria. Gestione della memoria. Uso della Memoria RAM
La gestione della memoria Gestione della memoria Stack di attivazione, Heap Come il compilatore-interprete, organizza i dati necessari all esecuzione del programma. Alcuni aspetti organizzativi già visti
Tipi di dato primitivi
Tipi di dato primitivi (oltre int) Tipi di dato primitivi int (già trattati) Valori logici (ricordati) Valori reali Valori carattere Informatica - A.A. 2009/2010 - Tipi di dato 2 1 Valori logici (il caso
Gli oggetti. Ogni oggetto ha un interfaccia e ogni oggetto ha un tipo. Incapsulamento. Oggetti. Contatore. Invio di Messaggi
Gli oggetti Linguaggi di Programmazione: Paradigmi di Programmazione (Sperimentazioni) Matteo Baldoni Dipartimento di Informatica Universita` degli Studi di Torino C.so Svizzera, 185 I-149 Torino Ogni
Parte 3. Puntatori. [S. Dalí The temptation of St. Anthony, 1946] - AA. 2015/16 3.1
Parte 3 Puntatori [S. Dalí The temptation of St. Anthony, 1946] 3.1 3.2 Puntatori Approfondimento rispetto alla trattazione vista nel corso precedente Finora come avete utilizzato i puntatori? Principalmente
Gestione della memoria
Garbage collection Gestione della memoria Static area dimensione fissa, contenuti determinati e allocati a compilazione Run-time stack dimensione variabile (record attivazione) gestione sottoprogrammi
Introduzione al linguaggio C Puntatori
Introduzione al linguaggio C Puntatori Violetta Lonati Università degli studi di Milano Dipartimento di Informatica Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica 19 ottobre 2017
Linguaggio C: puntatori
Dipartimento di Elettronica ed Informazione Politecnico di Milano Informatica A - GES Prof. Plebani A.A. 2006/2007 Linguaggio C: puntatori La presente dispensa e da utilizzarsi ai soli fini didattici previa
VARIABILE STRUTTURATA
DISPENSE DI PROGRAMMAZIONE Modulo 3 Parte 2 Ha collaborato alla editazione Giuseppe Porcelli VARIABILE STRUTTURATA Una variabile di tipo strutturato possiede più di una singola COMPONENTE. Per definire
Espressioni ed operatori in C
Espressioni ed operatori in C Espressioni Il C è un linguaggio basato su espressioni Una espressione è una notazione che denota un valore mediante un processo di valutazione Una espressione può essere
Programmazione Procedurale in Linguaggio C++
Programmazione Procedurale in Linguaggio C++ Elementi di Base Parte 3 Istruzioni di Assegnazione G. Mecca M. Samela Università della Basilicata Elementi di Base >> Sommario Sommario Introduzione Istruzioni
Il linguaggio C. Puntatori e Array
Il linguaggio C Puntatori e Array Puntatori I puntatori sono variabili i cui valori sono indirizzi di locazioni in cui sono memorizzate altre variabili architettura a 32 bit: 232-1 indirizzi, ma non si
Programmazione (imperativa)
Programmazione (imperativa) Corso di Laurea in Informatica Roberto Cordone DI - Università degli Studi di Milano Lezioni: Lunedì 12.00-13.00 e 14.00-16.00 Mercoledì 14.00-17.00 Laboratorio: Giovedì 12.00-13.00
Puntatori. Stefano Ferrari. Università degli Studi di Milano Programmazione. anno accademico
Puntatori Stefano Ferrari Università degli Studi di Milano stefanoferrari@unimiit Programmazione anno accademico 2016 2017 Puntatori I processori organizzano la memoria in N celle di dimensione fissata
Fondamenti di programmazione parte 2. Elementi di informatica IGLP
Fondamenti di programmazione parte 2 Elementi di informatica IGLP Questo insieme di trasparenze è stato ideato e realizzato dai ricercatori e professori del Dipartimento di Informatica e Sistemistica dell