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, logica, e concorrente, 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. La prima metà del corso è dedicata alla programmazione sequenziale, utilizzata in applicazioni più tradizionali, mentre la seconda parte è rivolta alla programmazione concorrente, e in particolare ai meccanismi di sincronizzazione e comunicazione.
Prerequisiti: conoscenze di programmazione imperativa, sistemi operativi, logica matematica.
Programma del corso a.a. 1997-98
1. Introduzione ai paradigmi di programmazione.
Ambienti e linguaggi di programmazione.
Due linguaggi a confronto: C e Ada.
Ambienti e linguaggi di programmazione.
I moduli in Modula-2, Turbo Pascal, C e Ada.
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
eraditarietà multipla; template di classe e di funzione; classi
derivate; le funzioni virtuali; i sottotipi; macro e funzioni in-line.
Visual C++: cenni. Caso di studio: il sistema WISDOM++.
Le standard template libraries.
Java: origini e motivazioni, classi, metodi, erediarietà
singola, interfacce, i tipi di dati predefiniti, gli operatori, il flusso
di controllo, dalle applicazioni agli applet.
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.
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.
Generalità. Classi di applicazioni distribuite: parallele e ad alta prestazione; fault-tolerant; applicazioni che usano la specializzazione funzionale; applicazioni inerentemente distribuite. Requisiti per i sostegno alla programmazione distribuita. Ambienti per il calcolo distribuito. Definizione delle unità di parallelismo. Comunicazione e sincronizzazione fra processi: Message passing (implicita/esplicita, sincrona/asincrona, comunicazione punto a punto con rendez-vous e chiamate a procedure remote, broadcast/multicast) e condivisione dei dati (strutture distribuite di dati vs. variabili logiche condivise). Nondeterminismo nella sincronizzazione dei processi. Potenzialità dei linguaggi operazionali (imperativi e object-oriented) e dichiarativi (funzionali e logici) per la programmazione distribuita.
1. Introduzione ai paradigmi di programmazione.
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.
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.
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
G. Masini, A. Napoli, D. Colnet, D. Léonard, &
K. Tombre
Linguaggi per la Programmazione a Oggetti (cap.
5)
Gruppo Editoriale Jackson, 1989
I. Bratko
Prolog Programming for Artificial Intelligence
Addison-Wesley, 1993.
E. Shapiro
Concurrent Prolog: A Progress Report
IEEE Computer, 19(8), 1986
L. Lemay, C. L. Perkins
Teach Yourself Java in 21 days (cap. 18)
Sams.net, 1996
M. Carli
Java e il problema dei cinque filosofi
Computer Programming, Gennaio 1998.