Linguaggi di Programmazione

Похожие документы
Astrazione Dati. Nicola Fanizzi. Linguaggi di Programmazione [010194] 10 mag, Dipartimento di Informatica Università degli Studi di Bari

A. Lorenzi, A. Rizzi Java. Programmazione ad oggetti e applicazioni Android Istituto Italiano Edizioni Atlas

Esercitazione: Implementazione in linguaggio C dell ADT. Stack con l utilizzo. di linked list

Implementazione Java di un ADT

Specifica: la sintassi. Specifica: la semantica. Specifica: la semantica

Funzioni, Stack e Visibilità delle Variabili in C

Programmazione orientata agli oggetti. Ivan Lanese

Introduzione all OOP!

ADT: Abstract Data Type. Quasi ADT. ADT per collezioni di dati (code generalizzate) 04 I tipi di dati astratti (I parte)

Liste con sentinella. intlist *createlist(void){ intlist *q = malloc(sizeof(intlist)); if(!q) { exit(-1); } q->next = q->prev = q; return q; }

Esempio su strutture dati dinamiche: ArrayList

Le basi del linguaggio Java

Questa soluzione va contemplata quando le lunghezze stimate dalle liste usate sono significativamente maggiori delle dimensioni di un elemento.

La programmazione ad oggetti: chiamate di metodi. Overloading. This

Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014

14 - Metodi e Costruttori

Indice PARTE A. Prefazione Gli Autori Ringraziamenti dell Editore La storia del C. Capitolo 1 Computer 1. Capitolo 2 Sistemi operativi 21 XVII XXIX

Corso di Algoritmi e Strutture dati Programmazione Object- Oriented in Java (Parte I)

Informatica 3. LEZIONE 5: Tipi di dati

Esercizi Strutture dati di tipo astratto

Classi. Oggetti e classi. Creazione e inizializzazione di oggetti in C++ Distruzione di oggetti in C++

Polimorfismo parametrico vs polimorfismo per inclusione

CORSO DI PROGRAMMAZIONE

Client - Interfaccia - Implementazione

Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre Negli esercizi proposti si utilizzano le seguenti classi:

Algoritmi e Strutture Dati

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

ISTITUTO STATALE D ISTRUZIONE SUPERIORE FERRARIS - BRUNELLESCHI EMPOLI Anno scolastico 2015/2016

PILE E CODE. Pile (stack):

Informatica 3. LEZIONE 1: Introduzione. Modulo 1: Introduzione al corso Modulo 2: Introduzione ai linguaggi di programmazione

Implementazione ADT: Alberi

Esempio su strutture dati dinamiche: ArrayList

18 - Vettori. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Il paradigma OO e le Classi

Esempio su strutture dati dinamiche: ArrayList

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

Indice generale Introduzione...vii Parte I Concetti e costrutti fondamentali... 1 Capitolo 1 Introduzione al linguaggio... 3

Laboratorio di programmazione

Strutture dati e loro organizzazione. Gabriella Trucco

Perché il linguaggio C?

Ereditarietà e Polimorfismo

strutturare dati e codice

Programmazione Orientata agli Oggetti in Linguaggio Java

19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Ingegneria del Software

OO puro. Primi concetti di Java. Tipi primitivi. Ogni cosa è un oggetto. Java è object-oriented puro Non come il C+ + (OO ibrido) Lorenzo Bettini

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

Struttura dati astratta Coda

Il linguaggio C. Puntatori e dintorni

9 - Array. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Le funzioni in JavaScript. Modularizzazione

Транскрипт:

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 information hiding modularizzazione N. Fanizzi Linguaggi di Programmazione (cc) 2006 2

Incapsulamento e tipi macchina fisica: stringa di bit (unico tipo di dato) macchina astratta (LdP ad alto livello): Organizzazione delle stringhe di bit Ogni stringa di bit (valore) ha una capsula (il suo tipo) che la riveste (operazioni associate) LINGUAGGI SICURI RISPETTO AI TIPI: Capsula Opaca (accesso alla rappresentazione, consentito solo per mezzo della capsula) N. Fanizzi Linguaggi di Programmazione (cc) 2006 3

Costruttori di tipo I comuni meccanismi di costruzione di tipo (es. array, struct) consentono la definizione di operazioni sui valori che si rappresentano ma non garantiscono che siano le sole modalità di manipolazione es pila di interi realizzata con un array (Pascal, C,...) operazioni push, pop, empty, top nulla vieta la manipolazione diretta dell'array N. Fanizzi Linguaggi di Programmazione (cc) 2006 4

Costruttori di tipo I comuni meccanismi di costruzione di tipo (es. array, struct) consentono la definizione di operazioni sui valori che si rappresentano ma Il linguaggio fornisce tipi predefiniti che nascondono l'implementazione (astrazione sui dati) non garantiscono che siano le sole modalità di manipolazione es pila di interi realizzata con un array (Pascal, C,...) No per il programmatore operazioni push, pop, empty, top nulla vieta la manipolazione diretta dell'array N. Fanizzi Linguaggi di Programmazione (cc) 2006 5

Astrazione sui dati Per rendere inaccessibile la rappresentazione: meccanismo ADT tipo di dato astratto (ADT- aspetti principali): nome tipo implementazione (rappresentazione) valori insieme di nomi di operazioni per ogni operazione implementazione dell'operazione che usi la rappresentazione fornita capsula che separi nomi dei tipi ed operazioni dalla loro implementazione la capsula (opaca) separa interfaccia (segnatura) dalla implementazione (realizzazione) N. Fanizzi Linguaggi di Programmazione (cc) 2006 6 nei linguaggi più evoluti ADT come tipi predefiniti (ML, CLU,...)

Rappresentazionenome nome ADT pila di interi (capsula opaca) abstype Int_Stack; type Int_Stack = struct { int P[100]; int n; int top; Int_Stack crea_pila() { Int_Stack s = new Int_Stack(); s.top = 0; return s; Nomi e tipi di operazioni signature Int_Stack crea_pila(); Int_Stack top(int_stack s); bool empty(int_stack s); Int_Stack push(int_stack s, int k); Int_Stack pop(int_stack s); Implementazione delle op. operations Int_Stack top(int_stack s) { return s.p[s.top]; bool empty(int_stack s) { return (s.top == 0); Int_Stack push(int_stack s, int k) { if (s.top == 100) errore(); s.p[s.top] = k; s.top = s.top + 1; return s; Int_Stack pop(int_stack s) { if (s.top == 0) errore(); s.p[s.top] = k; s.top = s.top - 1; return s; Fuori dalla rappresentazione del tipo non c'e alcuna relazione tra tipo astratto e tipo concreto N. Fanizzi Linguaggi di Programmazione (cc) 2006 7

information hiding separare interfaccia da implementazione astrazione sul controllo: nasconde codice del corpo mostra la sua interfaccia (es. funzioni) astrazione dati: nasconde codice ma anche rappresentazione del dato Il sistema dei tipi garantisce la non violazione dell'astrazione vantaggi: possibile sostituire un'implementazione a parità d'interfaccia es. pila realizzata con lista concatenata anziché con vettore N. Fanizzi Linguaggi di Programmazione (cc) 2006 8

ADT: specifica descrizione della semantica delle operazioni di un ADT espresse come relazioni generali astratte (no tipo concreto) in linguaggio naturale, schemi semi-formali, linguaggi formalizzati manipolabili da theorem-prover,... es. ADT pila di interi crea_pila: crea una pila vuota push: inserisce un elemento sulla pila; top: restituisce l'elemento in cima alla pila (non vuota) senza modificare la stessa pop: elimina l'elemento in cima alla pila (non vuota) empty: vero sse pila vuota specifica = contratto cliente con ADT implementazione corretta deve corrispondere alla specifica (assicurata dalla specifica) N. Fanizzi Linguaggi di Programmazione (cc) 2006 9

indipendenza dalla rappresentazione Due implementazioni corrette di una stessa specifica di un ADT risultano indistinguibili da parte dei clienti Un cliente dell'adt non deve accorgersi in caso di cambiamento dell'implementazione versione debole sostituzione (senza errori di tipo) a parità di segnatura dimostrata come un teorema per linguaggi type-safe come CLU, ML,... N. Fanizzi Linguaggi di Programmazione (cc) 2006 10

moduli ADT programmazione in piccolo programmazione in grande modulo: astrazione di più strutture dati correlate: es. package Java; unit Pascal/Delphi partizionamento statico di un programma complesso in unità più semplici, dotate di dichiarazioni dati: tipi, variabili,... operazioni: funzioni,... regole di visibilità che realizzano: incapsulamento, N. Fanizzi Linguaggi di Programmazione (cc) 2006 11 occultamento dell'informazione (information hiding)

ADT vs. moduli in teoria: nessuna differenza ADT è un caso particolare di modulo in pratica: moduli più flessibili Grado di permeabilità della capsula Possibilità di selezione degli operatori visibili e del loro grado di visibilità moduli generici (polimorfi) risoluzione al momento dell'uso N. Fanizzi Linguaggi di Programmazione (cc) 2006 12 compilazione separata (unità di compilazione)

Visibile Non Visibile esempio N. Fanizzi Linguaggi di Programmazione (cc) 2006 13

esempio modulo Counter module Buffer imports Counter; public type Count; void init_counter( int get(count c); void inc(reference Count c); private imports Queue; init_counter(reference reference Count c); type Count = int; void init_counter( int init_counter(reference reference Count c) { c = 0; int get(count c) { return c; void inc(reference Count c); { c = c+1; N. Fanizzi Linguaggi di Programmazione (cc) 2006 14

esempio modulo Queue module Queue; public type Queue; void inqueue( int... private... void...... inqueue(reference Queue q, int n); int dequeue(queue q); dequeue(queue q); void bookkeep(reference Queue q) { N. Fanizzi Linguaggi di Programmazione (cc) 2006 15

modulo composizione parte pubblica: visibile all'esterno parte privata: invisibile uso di un modulo: importazione spesso congiunto con il polimorfismo parametrico risolto a linking-time collegamento a funzioni precompilate di libreria N. Fanizzi Linguaggi di Programmazione (cc) 2006 16

esempio modulo Buffer<T> module Buffer<T> imports Counter; public type Buf; void insert( <T> get(buf b); Count c; insert(reference reference Buf b, <T> n); Count c; // quante volte si è usato il buffer // quante volte si è usato il buffer private imports Queue; type Buf = Queue; void insert(reference Buf b, <T> n) { insert(reference Buf b, <T> n) { inqueue(b,n); inc(c); <T> get(buf b) { inc(c); return dequeue(b); init_counter(c); // inizializzazione del modulo N. Fanizzi Linguaggi di Programmazione (cc) 2006 17

esempio modulo Queue<S> module Queue<S> <S>; public type Queue; void inqueue( <T>... private... void...... inqueue(reference Queue q, <S> n); <T> dequeue(queue q); dequeue(queue q); void bookkeep(reference Queue q) { N. Fanizzi Linguaggi di Programmazione (cc) 2006 18

pila di interi in pseudo C++ type Int_Stack = struct { int P[100]; int top; Int_Stack crea_pila() { Int_Stack s = new Int_Stack(); s.top = 0; return s; Int_Stack top(int_stack s) { return s.p[s.top]; bool empty(int_stack s) { return (s.top == 0); Int_Stack push(int_stack s, int k) { if (s.top == 100) errore(); s.p[s.top] = k; s.top = s.top + 1; return s; Int_Stack pop(int_stack s) { if (s.top == 0) errore(); s.p[s.top] = k; s.top = s.top - 1; return s; N. Fanizzi Linguaggi di Programmazione (cc) 2006 19