Date post: | 17-Feb-2019 |
Category: |
Documents |
Upload: | hoangnguyet |
View: | 220 times |
Download: | 0 times |
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 1
2
Richiami Struttura dei programmi
Paradigmi di programmazione
UNIVERSITA’ DI FIRENZEFacoltà di Ingegneria
Giacomo Bucci
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 2
Contenuto
• Concetti basilari di programmazione e struttura dei programmi• Astrazione, Scomposizione dei problemi (divide et
impera)• Programmazione difensiva
• Il caso dell’Arianne
• Information Hiding (incapsulamento)• Dati Astratti• Oggetti
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 3
All’inizio della storia..• Il primo linguaggio di programmazione è
stato il linguaggio Assembler• Rifletteva il linguaggio macchina• Era la forma simbolica del linguaggio macchina
• LD RA, MEM invece di 0010010110100100
• Il linguaggio di macchina non ha alcuna struttura, c’è solo questo:
• Successione di statement (incremento del registro PC di macchina)
• Salto incondizionato (modifica del PC)• Salto condizionato (incremento o modifica del PC)
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 4
I primi linguaggi (di alto livello)
• Indipendenti dall’architettura di macchina e orientati a classi di problemi (FORTRAN, COBOL, BASIC, ..)
• Introducevano due astrazioni fondamentali, alla base di qualunque linguaggio di programmazione (passato, presente e futuro)• Astrazione di controllo • Astrazione procedurale
• Astrazione: Descrizione semplificata di un sistema che mette in evidenza alcuni degli aspetti e ne sopprime altri
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 5
Astrazione di controllo• E’ la forma più elementare di astrazione consentita
dai linguaggi di alto livello• Statement altrimenti indipendenti vengono raccolti in
un unico statement• begin … end {…} • if, switch, while, for
B
S1 S2 if (B) S1 else S2;
if B then S1 else S2;
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 6
Astrazione ProceduraleProceduraleI linguaggi di programmazione tradizionali (FORTRAN,
Basic, Pascal, C) sono procedurali• Un programma/sottoprogramma viene visto come la
trasformazione degli argomenti di ingresso (X) nei risultati (Y), secondo la procedura (la funzione) P
P
Esempio Y = SIN (X) Il simbolo SIN nasconde tutti i dettagli relativi al calcolo del seno di XIl modo in cui viene effettuato il calcolo è irrilevante
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 7
Il problema del go to• A fine anni ’60 ci si accorse che i programmi che
facevano uso di goto tendevano a funzionare male• Il goto corrisponde al salto incondizionato del linguaggio
macchina• Si arrivò a concludere che il goto andava bandito e
che i programmi dovevano essere fatti di costrutti a un solo ingresso e una sola uscita. Inoltre:• Applicazione sistematica dell’astrazione di controllo e
procedurale• Scomposizione in problemi più semplici (divide et impera)• Sviluppo top-down
Era la programmazione strutturata• prima vera “tecnologia” per lo sviluppo dei programmi
(anni ’70)
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 8
In modo intuitivo
• Evitare grafi come quello di destra
{R}
S1
S2
{Q}
{P}
B{Q}
S
{P}
• S viene diviso in S1 e S2; di norma S1 e S2 sono più semplici di S (divide et impera)
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 9
• Vengono dette ASSERZIONI• Si scrive {P} S {Q}• La notazione {P} S {Q} significa:
se lo stato delle variabili soddisfa il predicato P e viene eseguito lo statement S, allora, al termine dello statement S, lo stato delle variabili soddisfa il predicato Q
S
Formalmente{P}
{Q}P e Q: predicati (condizioni) sui valori delle variabili rispettivamente in ingresso e in uscita allo statement S
Verificare formalmente i programmi (come fosse la dimostrazione di un teorema)Sintetizzare i programmi Ricerca anni ‘70
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 10
Conseguenza importante: Programmare in modo difensivo
<type> procedure (p1,p2,…,pn){if (PRE(p1,p2,…)==false) return error;
...corpo della procedura;
if (POST(., ...,) == false) {..cura il malanno;
}}
procedure
{PRE}
{POST}
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 11
Programmazione difensiva• Si assicura la congruenza degli ingressi
rispetto alla specifica della procedura• Si effettuano le azioni per forzare la
postcondizione oppure si prende un provvedimento di altro genere ma che eviti la prosecuzione come se niente fosse
• Concetti parzialmente recepiti nei moderni linguaggi di programmazione (EXCEPTION)
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 12
Il caso dell’Arianne 5
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 13
Arianne 5• On June 4, 1996 an unmanned Arianne 5 rocket launched by the
European Space Agency exploded just forty seconds after its lift-off from Kourou, French Guiana.
• The rocket was on its first voyage, after a decade of development costing $7 billion.
• The destroyed rocket and its cargo were valued at $500 million. • A board of inquiry investigated the causes of the explosion and in
two weeks issued a report. • It turned out that the cause of the failure was a software error in
the inertial reference system. Specifically a 64 bit floating point number relating to the horizontal velocity of the rocket with respect to the platform was converted to a 16 bit signed integer. The number was larger than 32,767, the largest integer storable in a 16 bit signed integer, and thus the conversion failed.
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 14
Arianne 5• Più precisamente si è trattato di un errore di riuso di
un componente sw.• Era stato riusato il software del sistema SRI (Système de
Référence Inertielle) del precedente Arianne 4.• Aveva sempre funzionato con Arianne 4 perché la velocità
orizzontale non aveva mai raggiunto un valore superiore a 32767
• Il precedente software era stato preso come “buono”:• Per Arianne 4 era stato dimostrato che la velocità in questione
non poteva superare il max rappresentabile in 16 bit.• Ma Arianne 5 seguiva una differente traiettoria e aveva una
maggiore velocità.
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 15
Anche la beffa!• Il modulo SRI eseguiva un calcolo che serviva ad
“allineare” alcuni parametri del sistema prima del lancio.
• Non aveva nessuna funzionalità a lancio avvenuto!!!
• A rigore questo calcolo avrebbe dovuto concludersi a -9.• Siccome in un lancio il count down può essere sospeso (per
qualche secondo) e siccome il reset di RSI richiedeva qualche ora, i progettisti si erano dati un po’ margine, mantenendo il calcolo attivo per 50 secondi (dallo start of fligth mode).
• Dopo circa 40 secondi dallo stacco
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 16
Eppure…• Il modulo SRI era duplicato
• (due computer uno in backup)
• Il calcolatore principale era duplicato• Ha tentato di aggiustare la traiettoria sulla base del valore errato,
deviando bruscamente e poi comandando (correttamente) l’esplosione
Ma…• Non c’era uno specifico exception handler per catturare
l’eccezione….. • Il progettisti avevano previsto controlli sui valori di 4 variabili su 7
(quelle per le quali l’analisi aveva previsto la possibilità di errore, che non era stata prevista sulla velocità orizzontale - correttamente per Arianne 4!!!)• Ciò per motivi di prestazioni (80% utiliz.)
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 17
Design by contractint convert (double horizontal_bias){require {
horizontal_bias <= MAXIMUM_BIAS;}//corpo della procedura
}
La precondizione (require ..) dice chiaramente e in modo inequivocabile il vincolo che il parametro di ingresso deve soddisfare
Dovrebbe essere parte del linguaggio !!
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 18
Meglio ancoratipo nome(parametri){require { :::: }
invariant { ::: n > 10; //esempio di invariante
} \\corpo
ensure { :::n <= old n + 100; //esempio
}}
Le clausole sono il contratto tra “client”e “supplier”
E’ banale pensare a un programma che estrae le clausole ai fini della documentazione.
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 19
Purtroppo…..• Né C++ né JAVA prevedono la
programmazione per contratto• L’unico linguaggio è Eiffel
Raccomandazione: • Usare il criterio della programmazione
difensiva• Eccezioni
Chiuso l’inciso sulla programmazione difensiva
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 20
Contenuto
• Concetti basilari di programmazione e struttura dei programmi• Astrazione, Scomposizione dei problemi (divide et
impera)• Programmazione difensiva
• Il caso dell’Arianne
• Information Hiding (incapsulamento)• Dati Astratti• Oggetti
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 21
Limiti della programmazione strutturata
• Va bene per la progettazione di un algoritmo a misura di singolo programmatore
• Non va bene per la progettazione di sistemi • non realizza il concetto di componente software• riusabilità, modificabilità, manutenibilità basse
• Motivo: dati e strutture di controllo che agiscono su di essi sono sostanzialmente separati
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 22
Esempio
Caio
Data d;
if (d.mese==9)qualchecosa();
• Lavoro diviso tra due programmatori:• Tizio: progetta la parte del sistema che comprende la
definizione della struttura Data• Caio: progetta una parte che usa Data
Tiziostruct Data {
int giorno;int mese;int anno;}
Data d;
if (d.mese==9)printf(“Sett”);
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 23
…..Esempio
Per Caio è un disastro!!!• Il suo codice non funziona
più• Va cambiato:
Data d;if (strcmp(d.mese==“Sett”))
qualchecosa();
• Tizio decide di cambiare la definizione di Data
Tiziostruct Data {
int giorno;char mese[4];int anno;}
Data d;
printf(“%s”,d.mese);
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 24
Cosa accade
P1
Bisogna disciplinare l’accesso alla struttura dati
A D hanno accesso sia P1 sia P2, in modo incontrollato
DP1
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 25
Che fare?
• Nascondere i dati entro i moduli di programma, rendendoli invisibili all’esterno
• imporre che tutte le interazioni avvengano solo attraverso le procedure visibili dall’esterno: queste procedure definiscono l’interfaccia al modulo• Operazioni di lettura• Operazioni di scrittura/modifica
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 26
Information hiding
• I dati (le strutture dati) all’interno di un modulo costituiscono le variabili di stato del modulo stesso
• I dati all’interno del modulo si leggono/modificano solo attraverso l’esecuzione delle procedure che fanno parte dell’interfaccia del modulo
BB
AA
MM
D1
D2
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 27
Un modulo (stile ADA)
Module M is A, B;procedure A is ...procedure B is ...
MM
BB
AA D1
D2 BB
AA
MM
D1
D2
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 28
Interfaccia
• Le procedure visibili dall’esterno costituiscono l’interfaccia1) operazioni di lettura delle variabili di stato del modulo2) operazioni di modifica dello stato del modulo
Principio fondamentale:
Programmare verso l’interfaccia non verso l’implementazione
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 29
Linguaggi convenzionali• FORTRAN, C, Pascal non hanno costrutti di
modularizzazione:• Confinare i dati in “moduli di compilazione indipendenti”• Rendere visibili solo gli identificatori che danno il nome alle
procedure che si vogliono rendere chiamabili dall’esterno
• Esempio• Un modulo che rappresenta uno stack può essere definito
attraverso un numero limitato di procedure:
push, pop, init, is_empty
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 30
Il modulo stack• Il modo in cui è definito è irrilevante
• (vettore, lista, …)• quel che conta è che il modulo risponda alle specifiche di
interfaccia
Interfaccia
Corpo
Specifica come il modulo si interfaccia
Implementa la specifica
In C ci si aiuta con i file .h Java ha il concetto di Interfaccia
e Implementazione
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 31
Buoni e cattivi
• La soluzione a destra• difficile da capire• difficile localizzare gli errori• difficile da modificare/estendere• difficile da riusare• costosa da manutenere
Porte
Flip-flop
ALU
Registri
• Di per sé i moduli non sono né buoni né cattivi
Non è coesa
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 32
Coesione• I moduli dovrebbero essere altamente coesivi
• all’interno dello stesso modulo componenti che sono strettamente legate l’una all’altra
• in modo che un modulo costituisca una unità di programma ben identificata
• In letteratura: 7 livelli di coesione • Funzionale (MAX) … Incidentale (MIN)
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 33
Accoppiamento
• L’accoppiamento tra moduli di programma dovrebbe essere minimo:
• Nessuna assunzione da parte del chiamante
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 34
AccoppiamentoIn letteratura: 5 livelli di accoppiamento• Minimo: i moduli si passano (attraverso le
interfacce) solo parametri scalari o strutture di cui vengono usati tutte le componenti
• Massimo: un modulo può modificare direttamente il contenuto di un altro• Esempio: il modulo A modifica le istruzioni
contenute nel modulo B
Che aiuto danno i moderni linguaggi di programmazione ??
Variabili globali ??
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 35
Contenuto
• Concetti basilari di programmazione e struttura dei programmi• Astrazione, Scomposizione dei problemi (divide et
impera)• Programmazione difensiva
• Il caso dell’Arianne
• Information Hiding (incapsulamento)• Dati Astratti• Oggetti
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 36
I dati astratti• Un modulo può essere riguardato come il
manager dei dati che esso racchiude al suo interno
• Oppure come una sorta di dato astratto, cioèun dato sul quale sono definite le operazioni costituite dalle operazioni di interfaccia
Esempio: il precedente stack è definito attraverso queste operazioni:
push, pop, init, is_empty
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 37
….I dati astratti• Il linguaggio di programmazione deve
permettere:• di definire un nuovo tipo di dato, cioè un dato
non primitivo come gli interi, reali, etc.,• di definire variabili di quel tipo
• Il compilatore deve garantire il corretto accesso al nuovo tipo di dati (type checking)
• E’ passato il termine di Abstract Data Type (ADT), anche se sarebbe meglio parlare di User DefinedType
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 38
ADT a run-time
• L’incapsulamento ora è di tipo concettuale (fisicamente i dati sono stati separati dalle procedure)
• Attuato attraverso il controllo dei tipi del compilatore che consente il riferimento a dati solo attraverso le procedure
(Dagli ADT agli oggetti il passo è breve)
pushpushinit
is_empty
Stack_1
Stack_2Stack_3
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 39
Contenuto
• Concetti basilari di programmazione e struttura dei programmi• Astrazione, Scomposizione dei problemi (divide et
impera)• Programmazione difensiva
• Il caso dell’Arianne
• Information Hiding (incapsulamento)• Dati Astratti• Oggetti
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 40
Programmazione OO
• La programmazione OO è l’evoluzione della programmazione con ADT con in più:• Ereditarietà (a volte si usano i termini
Specializzazione Generalizzazione)• Associazione, aggregazione di oggetti• Polimorfismo
• C++, Java, …
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 41
Ereditarietà:
Minerale AnimaleVegetale
Natura
Erbivoro Carnivoro
MuccaElefante Cane Gatto
daTartufi daPenna
ISAISA
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 42
Associazione• L’Associazione è la forma più generale di
relazione tra oggetti
• Si rappresenta con una linea e con alcuni ornamenti
Ditta PersonaLavora per1 1..*
In StarUML questo ornamento non c’è
dipendentedatore
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 43
Aggregazione
• E’ una forma speciale di associazione • Quando un oggetto “aggrega” più oggetti di uno stesso tipo
(classe)• In pratica è una associazione uno a molti (evita di indicare la
molteplicità)
• A volte si distingue tra Aggregazione e Composizione• Aggregazione
• quando un oggetto si compone di altri che hanno vita autonoma
• Composizione• quando un oggetto si compone di altri oggetti che esistono solo
in funzione del primo Una sottigliezza di cui normalmente si fa a meno.
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 44
Polimorfismo• Capacità di presentare comportamenti diversi• Basato sulla presenza di un’interfaccia comune per differenti
classi di oggetti
Cerchio
Where()Move()Draw()Rotate()Area()
Geometria Cerchio
Forma
Where()Move()Draw()Rotate()Area()
Geometria
Quadrato
Where()Move()Draw()Rotate()Area()
GeometriaQuadrato
Triangolo
Where()Move()Draw()Rotate()Area()
GeometriaTriangolo
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 45
Metodi astratti: la loro implementazione èrimandata a una classe derivata da Forma.
class Point {……}
abstract class Forma {protected Point center; //Geometria di Forma
public Point where (){return center;
}public void move (Point to) {
center= to; draw();}public abstract void draw (); public abstract void rotate(int g); public abstract double area();
La classe Forma
Interfaccia
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 46
La classe Cerchiopublic class Cerchio extends Forma{private double r; //geom. del cerchio
public Cerchio(double r, Point center){this.r = r;this.center = center;
}
public double area() {return r*r*3,14;
}public void draw () {..}public void rotate (int g) {}
}
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 47
Uso polimorfico//Creazione
Forma[] ff = new Forma[10];ff[0] = new Cerchio(...); ff[1] = new Cerchio(...);ff[2] = new Quadrato(...);ff[3] = new Triangolo(..); ff[4] = ..;
//Uso polimorfico ff[0].draw(); //ha l’effetto di disegnare il I cerchio ff[1].draw(); //ha l’effetto di disegnare il quadratoff[3].draw(); // ..il triangolo
int i = 0; double a= 0; while (ff[i] != null){
a= a+ff[i].area(); i++;}
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 48
In passato (in C …)
• Si usava la parametrizzazione !!!
void Move (elemento el, tipo t);if (t == cerchio) {/* spostamento del cerchio*/}
if (t == triangolo) {/* spostamento del triangolo*/}
if (t == rettangolo) {/* spostamento del rettangolo*/}
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 49
..in sintesi
• Gli aspetti comuni sono stati definiti solo una volta• Gli aspetti diversificati sono stati ridefiniti per ogni
specifica forma• Se il quadrato deve essere modificato in un
rettangolo, le modifiche vanno apportate solo alla classe Quadrato
• Se si deve aggiungere un’altra figura non si tocca niente dell’esistente.
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 50
Il principio della Delega• Un oggetto che riceve una richiesta può delegare un
altro o altri oggetti a gestire la richiesta stessa• La delega consente di usare ed estendere il
comportamento di una classe:• Classe originale: Delegato• Classe che usa/estende: Delegante
Il concetto di delega è una sorta di “Pattern” basilare della programmazione Object Oriented
DelegatoDelegante1 1usa
usatoIl delegante provvede le funzionalità del delegato (chiamando i suoi metodi) e può aggiungerne di proprie
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 51
Delega
• La Struttura delega i suoi componenti a effettuare il movimento
• Il move() della struttura consiste nell’invocazione dei move() tutti i solidi che la compongono
forall s in solidi s.move()
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 52
Sospendiamo qui
• Seguirà UML
Linguaggi/struttura dei programmi 2011-2012
G. Bucci 53