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.