PROGRAMMA DEL CORSO DI
PROGRAMMAZIONE II
Prof. Donato Malerba
Obiettivi. Il corso approfondisce alcune
tecniche di programmazione utilizzabili nello sviluppo di applicazioni
function-oriented, in cui la complessità prevalente del sistema
riguarda le funzioni da realizzare. In particolare sono analizzate le tecniche
di programmazione orientata agli oggetti, funzionale, e logica, legate
a nuovi paradigmi di programmazione che si sono affermati in diversi contesti.
L’obiettivo è duplice: da una parte, illustrare i fondamenti teorici
dei paradigmi, per i benefici di rigore e sistematicità che ne derivano,
e dall’altra presentare alcuni strumenti operativi che supportano i diversi
stili di programmazione, ovvero i linguaggi di programmazione. Questa edizione
del corso è stata interamente dedicata alla programmazione sequenziale,
utilizzata in applicazioni più tradizionali.
Prerequisiti: conoscenze di programmazione
imperativa, algoritmi e strutture dati, logica matematica.
Programma del corso a.a. 1999-2000
1. Introduzione ai paradigmi di programmazione.
I tre approcci alla programmazione: operazionale, definizionale
e dimostrazionale.
2. Il paradigma imperativo.
Fondamenti: la manipolazione sequenziale di dati
in memoria. La struttura dei programmi, i dati (dichiarazioni, tipi primitivi,
composti e ricorsivi, equivalenza dei tipi), le espressioni, i comandi,
la gestione del flusso di controllo, la composizione (blocchi e sottoprogrammi),
legame statico e dinamico.
Ambienti e linguaggi di programmazione.
Linguaggio C: caratteristiche generali, operatori, operazioni
di I/O, funzioni, tipi strutturati, puntatori. Linguaggio Ada: caratteristiche
generali, istruzioni di controllo, operatori, procedure e funzioni, tipi
di dati.
3. Astrazione.
Fondamenti: L'astrazione nella programmazione.
Astrazione di funzione, di procedura, di controllo, e di selettore. Astrazione
di dati: requisiti di astrazione e protezione. La formalizzazione algebrica
dei tipi astratti di dato: la nozione di segnatura, la nozione di S
-algebra, relazione tra tipi astratti e S -algebre.
Specifiche algebriche e assiomatiche per i tipi di dati astratti. I moduli
per l’incapsulamento dell’informazione e l'information hiding. Oggetti
e classi di oggetti. Tipo astratto di dati vs. classe di oggetti. Astrazione
generica.
Ambienti e linguaggi di programmazione.
I moduli in Modula-2, Turbo Pascal, C e Ada.
Laboratorio: il gioco del sette e mezzo in Modula-2.
4. La programmazione orientata agli oggetti.
Fondamenti: oggetti, classi concrete, classi
astratte, metaclassi, ereditarietà singola ed ereditarietà
multipla, polimorfismo, gerarchia di classi e gerarchia di interfacce.
Composizione di classi. Confronto tra ereditarietà e composizione.
Realizzazione di tipi astratti mediante classi. Tipi astratti ed ereditarietà:
realizzazione mediante delegation.
Ambienti e linguaggi di programmazione.
Smalltalk: origini, sintassi di espressioni; i messaggi;
i blocchi; selezione e ripetizione; i metodi; classi ed ereditarietà
singola; il polimorfismo; le classi astratte; le classi predefinite; le
metaclassi; l’ambiente a finestre; l’implementazione.
C++: dalle strutture alle classi; classi di oggetti ed
ereditarietà multipla; template di classe e di funzione; classi
derivate; le funzioni virtuali; i sottotipi; macro e funzioni in-line.
Java: origini e motivazioni, classi, metodi, ereditarietà
singola, interfacce, i tipi di dati predefiniti, gli operatori, il flusso
di controllo, dalle applicazioni agli applet.
Laboratorio: semplici esperienze di programmazione
in Smalltalk e Java.
5. La modellazione orientata a oggetti in UML.
Un modello concettuale di UML: Structural thing (classi,
interfacce, collaborazioni, casi d’uso, classi attive, componenti, nodi);
Behavioral thing (interazioni; state machine); Grouping thing (package);
Annotational thing (note); Relationship: dipendenze; associazioni, generalizzazioni,
realizzazioni; Diagram: diagramma delle classi, diagramma degli oggetti,
diagramma dei casi d’uso, diagramma delle sequenza, diagramma delle collaborazioni,
diagrammi statechart, diagrammi di attività, diagrammi dei componenti,
diagramma di dispiegamento. Meccanismi comuni in UML: specifiche, ornamenti,
estensioni (stereotipi, valori etichettati e vincoli). Le cinque viste:
vista dei casi d’uso, vista di progetto, vista di implementazione, vista
di processo, vista di dispiegamento. Il caso di studio della Eastern State
University.
6. La programmazione logica.
Fondamenti: programmare per dimostrazioni, clausole
e programmi definiti, le interrogazioni, semantica dei modelli e modello
minimo di Herbrand, semantica del punto fisso e caratterizzazione di punto
fisso del minimo modello di Herbrand, unificazione di termini, risoluzione
binaria e proprietà, semantica operazionale e la risoluzione SLD.
La negazione in programmazione logica: negazione per fallimento, completamento
di un programma definito, correttezza della regola NF, programmi normali
e stratificati.
Ambienti e linguaggi di programmazione logica.
Prolog: dalla programmazione logica al Prolog, la ricerca
depth-first, sintassi del Prolog, liste e operazioni su liste, il principio
di invertibilità, gli operatori, il cut, implementazione della negazione.
Caso di studio: il problema della scimmia e della banana.
Principali testi e articoli di riferimento
1. Introduzione ai paradigmi di programmazione.
A.L. Ambler, M.H. Burnett, & B.A. Zimmerman
Operational Versus Definitional: A Perspective on Programming
Paradigms
IEEE Computer, 25(9): 28-43, September 1992.
2. Il paradigma imperativo.
C. Montangero, F. Turini
Introduzione alla Programmazione: Sintassi, Semantica
e Metodo
Boringhieri, 1987.
H. E. Bal, D. Grune
Programming Languages Essentials (cap. 1-2)
Addison-Wesley, 1994
3. Astrazione dati.
E. Lodi, & G. Pacini
Introduzione alle Strutture di Dati (cap. 3-4)
Bollati Boringhieri, 1990.
M. Shaw
Abstraction Techniques in Modern Programming Languages
IEEE Software, 10-26, October 1984.
D. A. Watt
Programming Language Concepts and Paradigms (cap.
5-6)
Prentice Hall, 1990.
4. La programmazione orientata agli oggetti.
M. Cadoli, M. Lenzerini, P. Naggar, A. Schaerf
Fondamenti della progettazione dei programmi (cap.
3, 4, 5, 13.1, 13.4)
Città Studi Edizioni, 1997.
C. Giustozzi, & S. Polini
OOP: Object Oriented Programming
Technimedia, 1991
G. Masini, A. Napoli, D. Colnet, D. Léonard, &
K. Tombre
Linguaggi per la Programmazione a Oggetti (cap.
2-3, 6)
Gruppo Editoriale Jackson, 1989
R. Sethi
Linguaggi di Programmazione (cap. 5-6)
Zanichelli, 1994
B. Stroustrup
What is Object-Oriented Programming?
IEEE Software, May 1988.
B. Breedlove et al.
Web Programming Unleashed (cap. 5-8)
Sams.net, 1996
5. La modellazione orientata a oggetti in UML.
G. Booch, I. Jacobson, J. Rumbaugh
The Unifing Modeling Language: User Guide
Addison-Wesley, 1999
Capitoli 1, 2, 3
6. La programmazione logica.
U. Nilsson, & J. Maluszynski
Logic, Programming and Prolog (cap. 1-5)
Wiley, 1990
I. Bratko
Prolog Programming for Artificial Intelligence
Addison-Wesley, 1993.
(È disponibile in italiano una precedente edizione:
I.Bratko,Programmare in Prolog per l'intelligenza artificiale, Masson.)