Corso di Laurea Specialistica in Informatica
Linguaggi di Programmazione I e II 2006/2007
pagina aggiornata il
11-05-2009
There are two ways of constructing a software design: one way
is to make it so simple that there are obviously no deficiencies, and
the other way is to make it so complicated that there are no obvious deficiencies.
The first method is far more difficult.
[C. A. R. Hoare]
Indice
Finalità del corso
Programma
Bibliografia
Finalità del corso
I corsi di Linguaggi I e II, intendono fornire una conoscenza delle
caratteristiche dei vari paradigmi di programmazione, cercando il più
possibile di evitare di concentrarsi su uno specifico linguaggio, andando
bensì a presentare i principi che guidano la progettazione, realizzazione
e
implementazione dei moderni linguaggi di programmazione. Con solida
conoscenza delle caratteristiche “universali” si potranno così in
futuro
imparare nuovi linguaggi in pochissimo tempo.
A questa visione generale si giunge attraverso la descrizione dei
principali paradigmi di programmazione:
- imperativo,
- funzionale,
- logico e
- logico-funzionale.
Questi paradigmi, oltre a essere esaminati nei loro
aspetti pragmatici più immediati, sono analizzati e confrontati sulla
base
dei principi generali, in modo tale da permettere una comprensione critica
della maggior parte dei linguaggi di uso comune. In questo modo si intende
sviluppare uno spirito critico che permetta di arrivare ad una
programmazione consapevole in cui saper scegliere il paradigma più adatto
a
seconda del problema da risolvere e sapere quali costrutti di un linguaggio
usare, e (soprattutto) a quale costo.
I due corsi inoltre intendono fornire una conoscenza relativamente
approfondita (soprattutto dell'aspetto programmativo) dei paradigmi di
programmazione dichiarativa (funzionale, logico e logico-funzionale) che,
grazie alla loro espressività, si prestano naturalmente quale base di
sviluppo di software corretto. Si mostrerà come caratteristiche quali
high-order e non-determinismo possano essere sfruttate per scrivere codice
compatto, elegante e flessibile (riutilizzabile).
Il corso di Linguaggi I, in particolare, tratterà innanzitutto
i concetti generali, fornendo una conoscenza
“language independent” delle caratteristiche di tutti i paradigmi.
Si vedranno poi il paradigma imperativo e i meccanismi di supporto a
“run-time” dei linguaggi imperativi. Dopodiché si illustreranno
le caratteristiche del paradigma funzionale (specialmente l'high-order programming).
Il corso di Linguaggi II, in particolare, illustrerà i modelli d'esecuzione dei linguaggi funzionale
e poi completerà la presentazione dei paradigmi dichiarativi: logico
e logico-funzionale (specialmente il non-deterministic high-order programming).
Programma
Linguaggi 1
- Paradigma Imperativo
- Macchine astratte, Interpretazione e Compilazione
- Descrivere un linguaggio di Programmazione (Sintassi e Semantica)
- I nomi e l'ambiente
- La gestione della memoria
- Strutturare il controllo
- Astrarre sul controllo (Metodi di passaggio dei parametri)
- Strutturare i dati
- Type checking monomorfo e polimorfo
- Un esempio di Macchina Astratta: P-code Pascal
- Per informazioni dettagliate e approfondimenti si vedano i capitoli 10
e 12 del
libro Pascal
Implementation , Pemberton&Daniels
- Per sperimentare è disponibile
l'implementazione (freeware) P4
- Paradigma Funzionale
- Introduzione alla Programmazione Funzionale.
- High-order Programming.
- Il linguaggio Haskell (tutorial,
prelude, file
usato a lezione per le demo,
miei
esempi 2006/11/09).
- list comprehensions, partial applications of curried functions, sections, non-strict functions, infinite data structures, case expressions, pattern matching
- Types, Classes and Overloading
- Haskell's monadic I/O
- Standard Haskell Classes
- Monads
- Modules
Linguaggi 2
- Modelli di esecuzione
del paradigma funzionale
- Paradigma Logico
- Introduzione alla Programmazione Logica: Unificazione, SLD-derivations
- Semantica denotazionale della Programmazione
Logica.
- Non-deterministic Programming
- Il linguaggio Prolog (file
usato a lezione per le demo, alcune implementazioni:
Sicstus, GProlog)
.
- Warren Abstract Machine (testo)
- Paradigma Logico-Funzionale
Bibliografia
-
M. Gabbrielli e S. Martini. Linguaggi di Programmazione
- Principi e Paradigmi.
McGraw-Hill. ISBN 88-386-6261-4
- P. Hudak, J. Peterson, J. Fasel. A Gentle Introduction
to Haskell 98.
1999
- L. Sterling, E. Shapiro. The art of Prolog, MIT Press, 1986.
Libri e Testi di consultazione
- Paradigma Logico
- Paradigma funzionale
- B. Wadler, Introduction to Functional Programming using Haskell.
ISBN: 0134843460, Prentice Hall PTR, 1998
- Terese, Term Rewriting
Systems.
Cambridge Tracts in Theoretical Computer Science, Vol. 55, Cambridge
University Press, 2003
- Paradigma Logico-Funzionale
Esercizi di Programmazione
Per chi volesse esercitarsi a programmare in uno dei paradigmi visti a lezione
ho scritto alcuni
esercizi a difficoltà (più o meno) crescente. Vi consiglio
fortemente di non scriverli solo su carta ma provare ad eseguirli (ci sono ottime
implementazioni freeware disponibili sia di Prolog che di Haskell). Quando poi siete
ragionevolmente sicuri di aver fatto un programma funzionante secondo la specifica
(che implica averlo provato a calcolatore), se volete avere i miei commenti su
quanto avete fatto (e, se siete a buon punto, avere le mie soluzioni) mandatemi
via mail quanto avete fatto oppure (anche meglio) portatemi tutto a ricevimento.
Didatticamente reputo controproducente mettervi on-line le mie soluzioni perchè altrimenti
restereste influenzati dalla mia soluzione prima di metabolizzarne una vostra.
Inoltre vi sconsiglio di fare tutti gli esercizi e mandarmi tutto in blocco alla
fine: meglio fare 2/3 esercizi e poi, prima di affrontare quelli più complessi,
verificare quanto appreso per poi trarre profitto dall'esperienza fatta nell'affrontare
i nuovi esercizi ed evitare di ripetere gli stessi errori.
Modalità d'esame
L'esame di Linguaggi 1 o 2 si compone di una prova scritta ed (eventualmente)
di una prova orale (soprattutto per discriminare le situazioni "di confine" o,
in ogni caso, "sospette" e/o dare la
possibilità di alzare il voto rispetto allo scritto).
- Iscrizioni Necessarie!!!
- Si ricorda che sia per potersi presentare alle prova scritta che a quella
orale è necessaria l'iscrizione elettronica (mediante il sito www.sindy.uniud.it).
- Prova Scritta:
- La prova scritta richiede di:
- svolgere degli esercizi analoghi a quelli presentati nelle esercitazioni
e a quelli dati per casa (inclusi quelli qui)
- rispondere ad alcune domande sugli argomenti trattati nelle lezioni.
Ogni volta che si consegna per la correzione una prova scritta si cancella
il voto precedente.
-
- Prova Orale (se necessaria) e Registrazione Voto Esame:
- La prova orale consiste nella discussione di alcuni degli argomenti trattati
a lezione.
Per poter sostenere la prova orale o registrare il voto dell'esame (se
la prova orale non fosse necessaria e non si intendesse sostenerla), è necessario
aver superato una prova scritta da meno di un anno.
Se durante la prova scritta non fosse stata fissata una data per l'orale
basta accordarsi via mail.
Nel caso la prova orale non venga superata o si decida di non accettare
il voto, lo scritto rimane valido al fine di sostenere un secondo
esame orale.
La registrazione viene eseguita on-line quindi qualora (potendo) si volesse
registrare il voto proposto ricevuto via Sindy basta accettarlo, da Sindy
stesso, e a quel punto verrà automaticamente registrato.
Sia alla prova scritta, quanto quella orale, è ammesso
l'uso di qualsiasi
materiale didattico (libri, appunti,...) purché
cartaceo.
Testi degli esami passati
Potete inoltre scaricare in formato elettronico (parte dei) testi
dei compiti passati:
Esami di Linguaggi 2
- testo del
compito del 17/09/2007
- testo del
compito del 03/09/2007
- testo del
compito del 13/07/2007
- testo del
compito del 13/04/2007
- testo del
compito del 23/03/2007
- testo del
compito del 07/09/2006
- testo del
compito del 10/07/2006
- testo del
compito del 06/04/2006
- testo del
compito del 27/03/2006
Esami di Linguaggi 1
- testo del
compito del 17/09/2007
- testo del
compito del 13/07/2007
- testo del
compito del 13/04/2007
- testo del
compito del 23/03/2007
- testo del
compito del 12/01/2007
- testo del
compito del 18/12/2006
- testo del
compito del 21/09/2006
- testo del
compito del 07/09/2006
- testo del
compito del 10/07/2006
- testo del
compito del 06/04/2006
- testo del
compito del 27/03/2006
- testo del
compito del 13/01/2006
- testo del
compito del 21/12/2005
- testo
esercizio P-Code Pascal del 02/12/2004
- testo
esercizio P-Code Pascal del 08/09/2004
- testo
esercizio P-Code Pascal del 06/07/2004
- testo
esercizio P-Code Pascal del 23/06/2004