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.)