1 Tipi di Dato §descrittori, tipi, controllo e inferenza dei tipi §specifica (semantica) e implementazione di tipi di dato l implementazioni “sequenziali”

Slides:



Advertisements
Presentazioni simili
Traduzione ed Interpretazione
Advertisements

Definitezza Vogliamo poter richiedere la “definitezza” delle funzioni
Tipi di dato astratti Lista, Pila, Coda, Albero.
Strutture dati lineari
Definizione e tipi di implementazione
Linguaggi di programmazione
Specifiche Algebriche
Algebra parziale con predicati
Type Checking (1° parte)
Algoritmi e Programmazione
Programmazione II Docente: Francesca Levi
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
1 Semantica Operazionale di un frammento di Java: lo stato.
Semantica Operazionale di un frammento di Java: lo stato
Generalità Linguaggio e Macchina Astratta
1 Strutture dati nel supporto a run time. 2 Entità presenti quando un programma va in esecuzione §programmi dutente (compilati) §routines del supporto.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A CDL in Ingegneria Elettronica - A.A Strutture dati dinamiche.
Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A CDL in Ingegneria Elettronica - A.A Strutture dati dinamiche.
Semantica Denotazionale
Semantiche dei linguaggi di programmazione
Laboratorio di Linguaggi lezione VIII Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea.
Introduzione al linguaggio C++ 5 lezioni
Progettazione dei sistemi interattivi (A.A. 2004/05) - Lezione 3 1 La relazione di ereditarietà Punto di vista insiemistico: la relazione di ereditarietà
1 Implementazione di Linguaggi 2 Implementazione di Linguaggi 2 Federico Bernardi Type checking 2° parte Type checking 2° parte - Equivalenza di type expressions.
nome: sequenza di caratteri usata per denotare un oggetto
Type int_stack = struct { int top; int P[100]; } int_stack creapila() { int_stack s = new int_stack; s.top = 0; return s; } int_stack push(int_stack s,
mosaic manipola oggetti primitivi (ruota e unisci) regole:
Type int_stack = struct { int top; int P[100]; } int_stack creapila() { int_stack s = new int_stack; s.top = 0; return s; } int_stack push(int_stack s,
memoria gestita staticamente:
Il Linguaggio C.
AN FI Un denominatoe comune Comandi u notazioni che esprimono azioni che, una volta eseguite, comportano una modifica permanente dello stato interno.
AN FI Un denominatoe comune Linguaggi di programmazione Un denominatore comune.
AN FI Un denominatoe comune Lo stile funzionale Concetti fondamentali.
1 Programmazione = decomposizione basata su astrazioni (con riferimento a Java)
Javascript: fondamenti, concetti, modello a oggetti
Introduzione alla programmazione Object Oriented
Macchine astratte, linguaggi, interpretazione, compilazione
Implementazione di un linguaggio ad alto livello (con riferimento a Java)
Laboratorio di Linguaggi lezione VII: variabili Globali e Locali Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali.
Sintassi base e struttura di un programma
Nota (rif. alla lezione precedente): Vector vs ArrayList Le classi generiche Vector e ArrayList sono sostanzialmente equivalenti, ma: I metodi.
1 Tecniche per il passaggio dei parametri. 2 Contenuti ¥la tecnica base (nei vari paradigmi) ¥ passaggio per costante, per riferimento, di funzioni, procedure.
1 Implementazione di (ambiente e) memoria nel linguaggio imperativo.
Introduzione a Javascript
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
AlgoLab - Pile e Code Pile e code Laboratorio di Algoritmi 02/03 Prof. Ugo de’ Liguoro.
Università di Torino – Facoltà di Scienze MFN Corso di Studi in Informatica Programmazione I - corso B a.a prof. Viviana Bono Blocco 7 – Array.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 7 Tipi di dato e strutture dati Specifica e realizzazione di strutture informative come classi.
Algoritmi e Strutture Dati Strutture Dati Elementari.
1 Controllo di sequenza: espressioni e comandi. 2 Contenuti ¥espressioni pure (senza blocchi e funzioni) ¥ regola di valutazione, operazioni strette e.
1 Tipi di Dato §descrittori, tipi, controllo e inferenza dei tipi §specifica (semantica) e implementazione di tipi di dato l implementazioni “sequenziali”
1 Interpretazione astratta: un approccio sistematico all’analisi statica.
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
estensione (con piccole varianti) di quella in
Nucleo di Java: Struttura e Semantica Espressioni Assegnamento Controllo di sequenza Dichiarazioni.
1 Progettazione dettagliata di un Tipo di Dato Astratto: l’ambiente di metodi.
1 Semantica Operazionale di un frammento di Java: le regole di transizione estensione (con piccole varianti) di quella in FONDAMENTI DI PROGRAMMAZIONE.
Linguaggi di Programmazione
Elementi di semantica denotazionale ed operazionale
1 Strutture dati. 2 Astrazione Non vogliamo sapere l’organizzazione fisica dei dati  indirizzi e celle di memoria Ci interessa solo la loro organizzazione.
LIP: 2 Maggio 2008 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
1 Semantica Operazionale di un frammento di Java: lo stato estensione (con piccole varianti) di quella in Barbuti, Mancarella, Turini, Elementi di Semantica.
1 Programmazione Funzionale: ML 1 implementazione del -calcolo tipato l definizione di nuovi tipi ricorsivi l i valori dei nuovi tipi sono termini, che.
1 Macchine astratte, linguaggi, interpretazione, compilazione.
1 Linguaggi: guardando la semantica §esistono un insieme di concetti semantici e di strutture di implementazione in termini dei quali si descrivono in.
Progetto Parte II OCAML.
LIP: 4 Maggio 2007 Interfacce. Cos’e’ una Interfaccia una interfaccia e’ un particolare tipo di classe contiene solo la specifica non ha implementazione.
1 Tipi di dato modificabili §a livello semantico, riconduciamo la modificabilità alla nozione di variabile l lo stato “modificabile” corrispondente sarà.
13. Strutture dati dinamiche Ing. Simona Colucci Informatica - CDL in Ingegneria Industriale- A.A
Transcript della presentazione:

1 Tipi di Dato §descrittori, tipi, controllo e inferenza dei tipi §specifica (semantica) e implementazione di tipi di dato l implementazioni “sequenziali” pile non modificabili l implementazione delle liste con la heap l termini con pattern matching e unificazione l ambiente, tabelle l tipi modificabili pile modificabili S-espressioni l programmi come dati e metaprogrammazione §meccanismi per la definizione di nuovi tipi §astrazioni sui dati

2 Tipi di Dato di Sistema e di Programma (Run-Time Support) §in una macchina astratta (e in una semantica) si possono vedere due classi di tipi di dato (o domini semantici) l i tipi di dato di sistema domini semantici che definiscono lo stato (ambiente, memoria) e strutture dati utilizzate nella simulazione di costrutti di controllo (stack di frame, stack di operandi) l i tipi di dato di programma domini corrispondenti ai tipi primitivi del linguaggio ed ai tipi che l’utente può definire (se il linguaggio lo permette) §tratteremo insieme le due classi (entrambe sono nel RTS) l anche se il componente “dati” del linguaggio comprende ovviamente solo i tipi di dato di programma

3 Cos’è un Tipo di Dato e cosa vogliamo sapere di lui §una collezione di valori l rappresentati da opportune strutture dati + l un insieme di operazioni per manipolarli §come sempre ci interessano a due livelli l semantica una specie di semantica algebrica “implementata” con i meccanismi per la definizione di nuovi tipi (mediante termini) in OCAML l implementazione altre implementazioni in OCAML, date tipicamente in termini di strutture dati “a basso livello” (array)

4 I Descrittori di Dato §immaginiamo di voler rappresentare una collezione di valori utilizzando quanto ci viene fornito da un linguaggio macchina l un po’ di tipi numerici, caratteri, etc. l sequenze di celle di memoria §qualunque valore è alla fine una stringa di bits §per poter riconoscere il valore e interpretare correttamente la stringa di bits l è necessario (in via di principio) associare alla stringa un’altra struttura che contiene la descrizione del tipo (descrittore di dato), che viene usato ogniqualvolta si applica al dato un’operazione per controllare che il tipo del dato sia quello previsto dall’operazione (type checking “dinamico”) per selezionare l’operatore giusto per eventuali operazioni overloaded

5 Tipi a tempo di compilazione e a tempo di esecuzione §se l’informazione sul tipo è conosciuta completamente “a tempo di compilazione” l si possono eliminare i descrittori di dato l il type checking è effettuato totalmente dal compilatore (type checking statico) l FORTRAN, ML §se l’informazione sul tipo è nota solo “a tempo di esecuzione” l sono necessari i descrittori per tutti i tipi di dato l il type checking è effettuato totalmente a tempo di esecuzione (type checking dinamico) l LISP, PROLOG §se l’informazione sul tipo è conosciuta solo parzialmente “a tempo di compilazione” l i descrittori di dato contengono solo l’informazione “dinamica” l il type checking è effettuato in parte dal compilatore ed in parte dal supporto a tempo di esecuzione l JAVA

6 Tipi a tempo di compilazione: specifica o inferenza? §l’informazione sul tipo viene di solito fornita con delle asserzioni (specifiche) l nelle dichiarazioni di costanti e variabili l nelle dichiarazioni di procedura (tipi dei parametri e tipo del risultato) l i fans di LISP sostengono che essere costretti a specificare tipi ovunque e sempre è NOIOSO e rende il linguaggio poco flessibile, ma.... §in alternativa (o in aggiunta) alle asserzioni fornite nel programma, il linguaggio può essere dotato di un algoritmo di analisi statica che riesce ad inferire il tipo di ogni espressione l tipico dei linguaggi funzionali moderni (esempio, ML)

7 Tipi come valori esprimibili e denotabili §importante strumento per la definizione di astrazioni sui dati l manca del tutto nei linguaggi che ignorano i tipi (LISP e PROLOG) e nei linguaggi antichi (FORTRAN, ma anche ALGOL) l nasce con PASCAL l sempre più importante nei linguaggi funzionali, imperativi e object-oriented moderni §ne parleremo alla fine di questo gruppo di lezioni

8 Semantica dei tipi di dato §useremo per la semantica semplicemente OCAML l utilizzando il meccanismo dei tipi varianti (costruttori, etc.) per definire (per casi) un tipo (generalmente ricorsivo) §Alcuni esempi due tipi di pila (non modificabile e modificabile) liste (non polimorfe) termini, sostituzioni, unificazione, pattern matching S-espressioni (LISP)

9 Pila non modificabile: interfaccia # module type PILA = sig type 'a stack val emptystack : int * 'a -> 'a stack val push : 'a * 'a stack -> 'a stack val pop : 'a stack -> 'a stack val top : 'a stack -> 'a val empty : 'a stack -> bool val lungh : 'a stack -> int exception Emptystack exception Fullstack end

10 Pila non modificabile: semantica # module SemPila: PILA = struct type 'a stack = Empty of int | Push of 'a stack * 'a exception Emptystack exception Fullstack let emptystack (n, x) = Empty(n) let rec max = function | Empty n -> n | Push(p,a) -> max p let rec lungh = function | Empty n -> 0 | Push(p,a) -> 1 + lungh(p) let push (a, p) = if lungh(p) = max(p) then raise Fullstack else Push(p,a) let pop = function | Push(p,a) -> p | Empty n -> raise Emptystack let top = function | Push(p,a) -> a | Empty n -> raise Emptystack let empty = function | Push(p,a) -> false | Empty n -> true end

Esercizio §Modificare la rappresentazione in modo tale le operazioni lungh e free (quest'ultima calco- lante il numero di celle allocabili) siano calco- late in tempo costante.

12 Pila non modificabile: semantica algebrica §semantica “isomorfa” ad una specifica in stile algebrico l trascuriamo i casi eccezionali 'a stack = Empty of int | Push of 'a stack * 'a emptystack (n, x) = Empty(n) lungh(Empty n) = 0 lungh(Push(p,a)) = 1 + lungh(p) push(a,p) = Push(p,a) pop(Push(p,a)) = p top(Push(p,a)) = a empty(Empty n) = true empty(Push(p,a)) = false §tipo (ricorsivo) definito per casi (con costruttori) §semantica delle operazioni definita da un insieme di equazioni fra termini §regole = assiomi di un algebra iniziale di operatori §il tipo di dato è un’algebra (iniziale)

13 Pila non modificabile: implementazione # module ImpPila: PILA = struct type 'a stack = Pila of ('a array) * int exception Emptystack exception Fullstack let emptystack (nm,x) = Pila(Array.create nm x, -1) let push(x, Pila(s,n)) = if n = (Array.length(s) - 1) then raise Fullstack else (Array.set s (n +1) x; Pila(s, n +1)) let top(Pila(s,n)) = if n = -1 then raise Emptystack else Array.get s n let pop(Pila(s,n)) = if n = -1 then raise Emptystack else Pila(s, n -1) let empty(Pila(s,n)) = n == -1 let lungh(Pila(s,n)) = n end

14 Pila non modificabile: implementazione # module ImpPila: PILA = struct type 'a stack = Pila of ('a array) * int end §il componente principale dell’implementazione è un array memoria fisica in una implementazione in linguaggio macchina §classica implementazione sequenziale utilizzata anche per altri tipi di dato simili alle pile (code)