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.
2000-2001
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. 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.
C++: dalle strutture
alle classi; classi di oggetti e creazione di oggetti; le funzioni friend;
overloading di operatori; strutturazione di un programma C++; sottotipi ed
ereditarietà; costruttori ed ereditarietà; le funzioni virtuali; le classi
astratte; realizzazione di tipi astratti di dato in C++ (pila e albero
binario); la gestione delle eccezioni; template di classe e di funzione; STL;
macro e funzioni in-line; organizzazione delle classi per l’I/O; gli oggetti
cin, cout, cerr; i file ad accesso sequenziale e quelli ad accesso diretto.
Java: origini e motivazioni;
confronto con il C++; costruttori, distruttori, argomenti e valori di ritorno
dei metodi; il controllo della esecuzione; l’inizializzazione; i package; i
modificatori di accesso; le interfacce; ereditarietà singola; polimorfismo; i
tipi di dati predefiniti e i contenitori; dalle applicazioni agli applet.
Laboratorio: il gioco del sette e mezzo in C++ e Java.
5. 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.
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, la valutazione di espressioni
aritmetiche, 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.
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.
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. Breedlove et al.
Web Programming Unleashed
(cap. 5-8)
Sams.net, 1996
Bruce Eckel
Thinking in Java, 2nd Edition (cap. 1-9, 13)
Prentice-Hall, 2000
5. 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.