Lezione March 26-28, Lezione 18-19

Documenti analoghi
Variabili dinamiche. Obiettivi: Presentare le variabili dinamiche, allocate e deallocate nell area HEAP, e le funzioni malloc e free

Il linguaggio C. Puntatori e dintorni

Corso di Linguaggi di Programmazione

Gestione dinamica della memoria

Ogni variabile in C è una astrazione di una cella di memoria a cui corrisponde un nome, un contenuto e un indirizzo.

! Per quanto sappiamo finora, in C le variabili sono sempre definite staticamente

Corso di Linguaggi di Programmazione

Programmazione con Java

Nomi e ambiente. Blocchi e regole di scoping. Blocchi e regole di scoping Nomi e ambiente 1 / 39

Allocazione dinamica della memoria

Linguaggi di Programmazione Corso C. Parte n.10 Gestione della Memoria. Nicola Fanizzi

Nomi. Nomi e ambiente. Nomi e oggetti denotabili. Sintassi

Il linguaggio C. Notate che...

Strutture Dati Dinamiche

Per quanto sappiamo finora, in C le variabili sono sempre definite staticamente. per variabili di tipo array, in cui dover

cap.6 del testo a cosa servono i tipi nei linguaggi di programmazione cos è un linguaggio type safe

Nomi. Nomi e ambiente. Nomi e oggetti denotabili. Esempio

10/10/2016. Caratteristiche degli array. Il tipo RECORD. Il record. LABORATORIO DI PROGRAMMAZIONE 2 Corso di laurea in matematica

Università degli Studi di Cassino e del Lazio Meridionale Corso di Fondamenti di Informatica Allocazione dinamica di memoria

PROGRAMMAZIONE Nomi, binding, regole di visibilità (scope)

Strutture dati e loro organizzazione. Gabriella Trucco

Programmazione II. Lezione 7. Daniele Sgandurra 9/11/2010.

Informatica 3. LEZIONE 5: Tipi di dati

Funzioni, Stack e Visibilità delle Variabili in C

Dati, Tipi di Dato e Tipi di un Linguaggio

Informatica 3. Informatica 3. LEZIONE 5: Tipi di dati. Lezione 5 - Modulo 1. Tipi predefiniti. Introduzione

Tipi di dato. Il concetto di tipo di dato viene introdotto per raggiungere due obiettivi:

Sommario. I Uso degli oggetti 39

Programmazione a Oggetti Lezione 7. Il linguaggio Java: aspetti generali

Programmazione II. Lezione 16. Daniele Sgandurra 14/12/2010.

Lezione Concetti e Strutture di Livello Avanzato

Informatica e Tecnologie per la Produzione del Software Crediti formativi 7+2

TIPI DI DATO. e quasi sempre anche collezioni di oggetti, mediante la definizione di tipi strutturati

Il linguaggio C Variabili e tipi di dato primitivi

Strutture Dati. Luca Abeni

Strutture Dati. Nicu Sebe. Informatica Nicu Sebe 1 / 27

Il linguaggio C. Notate che...

Silvia Crafa

Informatica 3. LEZIONE 4: Semantica operazionale. Modulo 1: Strutture a blocchi Modulo 2: Comportamenti dinamici

Corso di Linguaggi di Programmazione

Fondamenti di Informatica e Laboratorio T-AB T-15 Strutture dati

Ingegneria Elettronica Ingegneria delle Telecomunicazioni (J-Z) Ing. Antonio Monteleone A.A. 2001/02 3 ciclo

Programmazione II. Lezione 9. Daniele Sgandurra 16/11/2010.

POLITECNICO DI TORINO. Laboratorio di Compilatori Corso di Linguaggi e Traduttori. Esercitazione 5. a.a 2010 / Controllo dei tipi

Allocazione Dinamica della Memoria

Corso di Linguaggi di Programmazione

Algoritmi e Strutture Dati

Gli oggetti. Ogni oggetto ha un interfaccia e ogni oggetto ha un tipo. Incapsulamento. Oggetti. Contatore. Invio di Messaggi

Corso di Linguaggi di Programmazione. Organizzazione di un processo in memoria (1)

Programmare. Compilatori e interpreti. Editor :: vi. Hello1.c. #include <stdio.h> >> cc Hello1.c. main() { printf( \n Hello World!

Strutture dati nel supporto a run time

Politecnico di Milano. Strutture dati dinamiche

Indice. Prefazione. 3 Oggetti e Java 53

Fondamenti di Informatica T. Linguaggio C: i puntatori

Object-Oriented Technology. Giuliano Armano 1

Linguaggi e grammatiche. Esercizi. Linguaggi e grammatiche. Linguaggi e grammatiche

ALGORITMI E STRUTTURE DATI

Esercizi. Grammatiche, scoping. Univ. di Udine. Grammatiche, scoping (Univ. di Udine) Esercizi 1 / 29

DISPENSE DI PROGRAMMAZIONE LINGUAGGI A TIPIZZAZIONE FORTE: IL COSTRUTTO DI TIPO. TIPI SEMPLICI: TIPI PRE-DEFINITI E TIPI DEFINITI DAL PROGRAMMATORE.

Nomi, binding e regole di scope

ALGORITMI E STRUTTURE DATI

Esercizio 1.A Rispondere, in maniera concisa, alle seguenti domande (12 punti)

Contenuti. Elementi di semantica denotazionale ed operazionale. Sintassi astratta. Sintassi e semantica. ! sintassi astratta e domini sintattici

Allocazione statica della memoria

Esonero di Informatica I. Ingegneria Medica

Allocazione Dinamica. Allocazione Statica. malloc() La funzione malloc()

Il linguaggio C. Puntatori e dintorni

Gestione della memoria

Allocazione dinamica della memoria

Funzioni, Stack e Visibilità delle Variabili in C

Dichiarazioni e tipi predefiniti nel linguaggio C

Strutture. Array dei nomi degli esami (MAX ESAMI è il massimo numero degli esami). Array con i crediti degli esami.

Informatica 1 Tipi e dichiarazioni in C++ C++ - Tipi e dichiarazioni 1

Utilizza i tipi di dati comuni a tutto il framework.net Accesso nativo ai tipi.net (C# è nato con.net) Concetti fondamentali:

PROGRAMMAZIONE Tipi di dato, implementazione

Allocazione dinamica

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - Programma

Strutture Dati. Nicola Fanizzi. Linguaggi di Programmazione [010194] 9 mag, Dipartimento di Informatica Università degli Studi di Bari

Introduzione alla Programmazione Funzionale

FUNZIONI. attribuire un nome ad un insieme di istruzioni parametrizzare l esecuzione del codice

L'Allocazione Dinamica della Memoria nel linguaggio C

Laboratorio 3 (SmallC: Alberi Astratti con Tipi Algebrici in OCaml)

I numeri razionali. Specifica: la sintassi. Specifica: la semantica

Lezione 11: Liste a Puntatori e Input/Output

VARIABILI AUTOMATICHE E DINAMICHE. Manuale linguaggio C

Le Funzioni in C. Fondamenti di Informatica Anno Accademico 2010/2011. Corso di Laurea in Ingegneria Civile Politecnico di Bari Sede di Foggia

Corso di Linguaggi di Programmazione

parte dichiarativa globale: dichiarazioni di costanti dichiarazioni di tipi dichiarazioni di variabili prototipi di funzioni/procedure

Macchine astratte, linguaggi, interpretazione, compilazione

Corso: Fondamenti di Linguaggi di Programmazione

7 Procedure. Estensioni sintattiche Dec ::= void Ide (Ptype Ide) Block Com ::= Ide(Exp);

Programmazione I - corso B a.a prof. Viviana Bono

Il creator di un oggetto è l entità (oggetto o funzione) che crea un oggetto. L owner di un oggetto è l entità responsabile della sua distruzione

TIPI DI DATO. Ogni elaboratore è intrinsecamente capace di trattare domini di dati di tipi primitivi

Transcript:

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 dinamica Tipi del linguaggio Sistemi di Tipi e Type Safety Coercion e Cast Polimorfismo: ad Hoc, Generico e di Sottotipo

Terminologia: Tipi (o classi) di dato e Tipi del linguaggio Example Dati: Le strutture più semplici con cui esprimere valori Tipi di Dato: Collezioni di valori omogenei per operazioni a loro applicabili Tipi del Linguaggio: Strutture che classificano (in modo univoco tutte) le strutture presenti in un prgramma evidenziando l uso di ciascuna struttura da un punto di vista semantico forniscono una semantica statica del programma Non solo ai dati è associato un tipo. Ad ogni dato può essere associato un tipo ma non il contrario.

Dati: Proprietà Generali/1 Dati: Le strutture più semplici con cui esprimere valori Anche se non essenziali per la calcolabilità (il lambda calcolo tipato è Turing Completo): Aumentano l espressività del linguaggio Literal: Possono avere una presentazione esterna oppure no: espressi direttamente come Literal (ad es.: interi in tutti i linguaggi) solo calcolati (ad es.: variabili del linguaggio a 3 indirizzi, puntatori in Pascal, array di valori struct in C)

Dati: Proprietà Generali/2 In un linguaggio sono distinti (in accordo all uso fatto) in: valori Denotabili (dichiarati come cotanti) valori Esprimibili (calcolati da espressioni non variabile) valori Memorizzabili (associati a locazione di memoria [oggetti di Java] o a valori modificabili [C e gli imperativi, in generale]) Un altra distinzione: scalari: sono atomici: solo operazioni per calcolare altre valori strutturati: hanno anche operazioni per visitare e/o modificare i componenti

Dati: Proprietà Generali/3 Distinzione rispetto alla Modificabilità Gli scalari non sono modificabili sebbene una variabile di un tipo di dato scalare possa avere il valore associato modicato più volte gli strutturati in genere sono modificabili nei componenti in aggiunta, una variabile di un tipo di dato strutturato può vedere il valore associato sostituito da altri valori.

Dati: Proprietà Generali/4 Distinzione rispetto alla Allocazione di Memoria Statica a compile/loading time: {...int A[100];...} Memoria Statica a run time: {...int A[x*y+10];...} Memoria Dinamica: {...u=malloc((x*y+10)*sizeof(int));...} Ma dove sta questa memoria e quando è deallocata? In principio, abbiamo visto che il Run Time Support o la Macchina Virtuale o quella Astratta prevedono: Dinamica. Allocata nello Heap e deallocata in vari modi Statica. Allocata nella Memoria Statica e deallocata a fine programma

Dati: Proprietà Generali/5 Memoria Dinamica è allocata nello Heap deallocata sotto il controllo del programma (dispose, free) deallocata automaticamente dal garbage collector Memoria statica Alcune implementazioni. Allocata nello AR nello stack di AR e recuperata quando lo AR è popped. Solo se il linguaggio ha ciclo di vita dei valori memorizzabili è uguale a quello dei bindings. Oggi nessun linguaggio adotta tale sistema per la memoria statica. Utilizzato per la memoria temporanea: valori intermedi - stack

Dati Scalari e Derivati Sono Valori Atomici Dati Scalari: int, real, float, double, bit, char, boolean Hanno presentazione esterna (I/O) Hanno operazioni primitive associate per calcolare altri valori: Interi e le operazioni aritmetiche Aiutano l espressività nelle applicazioni che richiedono tali valori Dati derivati: enumerati [ad es. type T = (I 1,..., I k )], intervallo [type T = V inf..v sup ] hanno le operazioni del dato originale Migliorano il controllo degli indici per la visita di dati strutturati indiciati (array, vector)

Dati Strutturati Record (con varianti o union), Array (statici e dinamici), List, Set, Pointer Hanno operazioni e caratteristiche specifiche Aiutano l espressività nelle applicazioni che richiedono valori strutturati Dati Concreti e Astratti: Aiutano l espressività nelle rappresentazione di valori del problema non disponibili nel linguaggio (ad es. String può essere rappresentato con un array di char.

Dati Strutturati: Record (con varianti e union) Example struttura di valori non omogenei modificabili, accessibile attraverso field, campi, selettori sono prodotto cartesiano dei dati componenti campi sono(funzioni proiezione) proiezioni attraverso cui accedere i componenti record con varianti o union pericolosi meccanismi di basso livello type enum = (a,b); var ex : record c1:integer; case u:enum of a:(a1:array[1..5] of integer); b:(b1:array[1..10] of char); end;... ex.u:= a;...ex.b1[5]...

Record: Formalizzazione Ambiente delle sue proiezioni Table15.1 Variabile Record Funzioni Semantiche D[[D]] ρ : (Env Store) (Env Store) D[[I :Rec I 1 : T 1...I n : T n End]] ρ (s) = Let{s 0 = s, T i.(l i, s i ) = allocate(t i, s i 1 } { I i.γ(i i ) = l i } (bind(i, E(γ), ρ), s n ) E[[E]] ρ : Env State State E[[Den(I.I 1 )]] ρ = Let{E(γ) = ρ(i)}γ(i 1 ) E[[Val(I.I 1 )]] ρ =... Funzioni Ausiliarie e Domini Ausiliari E : EnvL Den Den ::=... + EnvL EnvL ::= I Den

Record: Implementazione Diverse tra loro Dipendono: dal linguaggio dal contesto di implemetazione: RTS, M. Virtuale, M. Astratta Tutte realizzate con un codice per l accesso in memoria dei componenti.

Dati Strutturati: Array (statici e dinamici) struttura dati di base dei Linguaggi Imperativi struttura di valori omogenei modificabili e indiciata sono funzioni finite su domini (con operatore successore) controllo dei bounds degli indici dimensione fissa: allocati a compile time o run time in Memoria Statica dimensione variabile: allocati a run time nello heap. può avere struttura determinata a run time (dope vector - controlla gli outbounds)

Dati Strutturati: Insiemi Example Presente in Pascal like (imperativo) e in SETL (applicativo) struttura non di valori omogenei non modificabili nessun accesso ai componenti sono insiemi finiti su tipi di dato type T = Set of T 1 ; var T x, y, z; T 1 u; begin...x := [e 1,..., e k ];...; y := x + [e 1,..., e n];...; z := x y... if u in x then...else...;... operazioni su insiemi dimensione variabile: allocata a run time su heap

Dati Strutturati: Liste struttura dati di base dei Linguaggi Funzionali struttura ordinata di valori omogenei non modificabili operazioni per accesso ai componenti (car, cdr) costruzione di nuove liste (empty, cons, append) dimensione variabile: allocata a run time su heap

Dati Strutturati: Puntatori/1 struttura dati modificabile ad un solo componente struttura dati per usare memoria in modo diretto struttura di basso livello: uso diretto di strutture semantiche Uso controllato in Pascal like: introdotti attraverso new (trasparenti) operano in memoria separata da quella statica deallocazione a programma dispose e automatica Uso controllato in C like: introdotti attraverso malloc (trasparenti) ed anche: operatore & e aritmetica (non trasparanti) operano in memoria non separata da quella statica (&) deallocazione a programma free Un unica operazione: accesso al valore puntato dimensione variabile: allocata a run time su heap (C anche statica)

Dati Strutturati: Deallocazione di Memoria/1 Example Automatica e Trasparente: Haskell, Caml Le liste non accessibili dal reductum (del programma) sono deallocate (garbage collector) A programma con operatori usata con puntatori Dangling Reference {...int x, y;...x = (int )malloc(sizeof (int));...y = x; x = 3; printf ( x, y);...free(x); printf ( y);... Tombstone: accesso al valore associato attraverso Tombstone che non sono rimossi ma marcati se elemento rimosso (variante: puntatori con chiave e valori associato con lucchetti)

Dati Strutturati: Deallocazione Automatica di Memoria/2 Tecnica a contatore: Un contatore, C(V ) è inizializzato a 1 alla creazione della struttura puntata V (e.g. malloc...) Ad ogni operazione di copia (assegnamento, trasmissione parametri) con sorgente p s e destinazione p t : C(V ps ) + +, dove V ps sia la struttura associata a p s ; C(V pt ), dove V ps sia la struttura associata a p s ; Ad ogni pop di un AR (uscita da blocco inline o procedura) Si considerano tutte le variabili locali e per ciascuna i puntatori accessibili come valori o come componenti di valori. Siano essi {p si }. C(V psi ) Se C(V psi ) == 0, la struttura V psi è deallocata.

Tipi del Linguaggio Example int main (int argc, char argv[]){//cosa calcola? int x = 10; char a = b ; x+ = a; printf( stampa%2d\n, x + a); return0; } Gnu CC compila un oggetto la cui esecuzione termina correttamente producendo : stampa 206 Potremmo dire: Vabbuó si sa che C fà accussì

Tipi del Linguaggio/2 Potremmo dire: Vabbuó si sa che C fà accussì E se la variabile a fosse stato il nome dell operatore di volo e x l angolo della rotta da tenere per superare la cresta della montagna? - Abbiamo ancora voglia di rispondere così (se la rotta è quella dell aereo su cui stiamo viaggiando)? La situazione peggiore nella quale puó incorrere l esecuzione di un programma: non è che termini a causa di floating point exception o illegal division by 0 o array outbounds (errori trapped) nemmeno che il programma non termini (il sistema operativo, e molti altri, lo devono fare) La peggiore è che l esecuzione raggiunga stati di calcolo del tutto inattesi

Tipi del Linguaggio/3 La peggiore è che l esecuzione raggiunga stati di calcolo del tutto inattesi Lo scopo principale della presenza di una struttura dei tipi in un linguaggio è quella di riconoscere programmi che contengono codice che possa condurre a comportamenti inattesi ovvero, programmi che possono produrre errori untrapped, ovvero errori che non sono riconosciuti come tali e che per tale ragione non possono essere intrappolati codice che conduce a comportamenti inattesi è detto codice stuck o impantanato.

Sistemi di Tipi Costituito da 3 strutture: il Dominio dei tipi includente i tipi base del linguaggio Le Espressioni di tipo anche per formare tipi nuovi Le Regole con le quali il linguaggio associa tipi ad ogni struttura dei programmi del linguaggio Vediamo tutto questo nel sistema F1 per linguaggio Lambda Calcolo Tipato il sistema può essere utilizzato come base per i sistemi di tipi di linguaggi più complicati Ne vediamo l estensione al sistema F2 per tipi polimorfi

Type Safety o Soundness Un linguaggio può avere un sistema di tipi che garantisce che i programmi prodotti siano type safe (Haskell, Ocaml, Java) Progress L esecuzione di un programma well typed, [ P : T], non è stuck: o ha raggiunto uno stato finale e calcolato i valori dei tipi attesi, [P Val]; o, raggiungere un nuovo stato, in accordo alle regole semantiche, [ P P ]. Preservation o Subject Reduction Un programma well typed, [ P : T], mantiene i tipi delle sue strutture componenti per tutta l esecuzione [se P P allora, P : T].

Sistema F1 Vediamo come è definito F1

Espressioni di tipo Permettono di definire nuovi tipi per le strutture del programma in aggiunta ai tipi costruiti con prodottti,, somma, +, funzione, Example naming di tipi State = Env X Store Env = Ide Den Store = Loc Mem Example ricorsivi a list = Cons a ( a list) Nil

Relazioni tra tipi equivalenza nominale Equivalenza solo con sè stesso strutturale Stessa espressione di tipo, rimpiazzando nomi con definizioni sottotipi esplicita (java) o implicita (contra-covariance delle funzioni) coercion: Operazione di conversione di rappresentazione di valori e conseguente cambiamento di tipo cast: Vincolo di tipo che deve essere soddisfatto a run time overloading tipi e valori differrenti per uno stesso identificatore (di funzione) polimorfismo di sottotipo In combinazione con i sottotipi: un metodo si applica anche a valori di sottotipi dei tipi attesi.