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. 1998-99
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. Analisi e progettazione orientata a
oggetti con metodologia Booch: cenni sulla notazione; linee guida per l’individuazione
di classi, attributi e metodi; rappresentazione dell’interazione fra gli
oggetti mediante scenari; raffinamento del modello; architettura di un
sistema object-oriented.
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, erediarietà
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 programmazione funzionale.
Fondamenti: L'approccio operazionale e quello
definizionale. Sintassi del l-calcolo puro,
le sostituzioni, la teoria formale, il teorema di Church-Rosser, teorema
del punto fisso, le due regole computazionali del call-by-value e del call-by-name,
un l-calcolo applicato, ML0.
Ambienti e linguaggi di programmazione.
Lisp e Scheme: le liste e funzioni per la loro manipolazione;
definizione di funzioni; i condizionali; strutture dati in Common Lisp.
CLOS: classi e istanze; ereditarietà; selezione
dei metodi; le funzioni generiche.
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.
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.
Laboratorio:
semplici esperienze di programmazione. 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.
M. Cadoli, M. Lenzerini, P. Naggar, A. Schaerf
Fondamenti della progettazione dei programmi (cap.
7, 11.1)
Città Studi Edizioni, 1997.
4. La programmazione orientata agli oggetti.
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
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.
5. La programmazione funzionale.
R. Sethi
Linguaggi di Programmazione (cap. 7,12)
Zanichelli, 1994
G. Masini, A. Napoli, D. Colnet, D. Léonard, &
K. Tombre
Linguaggi per la Programmazione a Oggetti (cap.
5)
Gruppo Editoriale Jackson, 1989
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.