Scopo del corso è approfondire le conoscenze relative ai linguaggi di
programmazione. Usando come base le conoscenze già acquisite, negli anni
passati, su diversi linguaggi di programmazione, vengono presentate
nozioni e principi "universali" che guidano la definizione e
l'implementazione dei moderni linguaggi di programmazione.
Acquisire una solida base di conoscenze generali permette di muoversi
con una certa disinvoltura tra i vari linguaggi di programmazione e
permette di apprendere in maniera rapida ed efficace nuovi linguaggi. La
conoscenza degli aspetti implementativi permette di avere una stima del
costo di esecuzione dei diversi costrutti di un linguaggio, e quindi
fornisce le informazioni base per la scrittura di codice
efficiente.
Nel corso particolare risalto viene dato al paradigma di programmazione
funzionale per le sue caratteristiche di pulizia ed espressività. Viene
presentato il linguaggio funzionale Haskell e si mostra quindi come
meccanismi quali high-order e non-determinismo possano essere sfruttate
per scrivere codice compatto, elegante e flessibile
(riutilizzabile).
Programma del CORSO
Macchine astratte, interpretazione e compilazione. Introduzione alla
struttura dei compilatori.
Descrivere un linguaggio di programmazione: sintassi, semantica,
pragmatica.
Analisi lessicale. Analisi sintattica. Generatori di analizzatori,
lessicali e sintattici: Lex, Alex, Yacc, Happy.
I nomi e l'ambiente.
La gestione della memoria.
Strutturare il controllo.
Astrarre sul controllo: procedure e funzioni.
Strutturare i dati: i tipi di dati nei linguaggi di
programmazione.
Paradigma funzionale.
Introduzione alla programmazione funzionale. Il linguaggio Haskell.
Paradigma logico.
Sistemi di assegnazione di tipo, descrizione formale.
Programmazione concorrente.
Libri di testo
Testi adottati
[GM] M. Gabbrielli e S. Martini. Linguaggi di programmazione -
Principi e paradigmi. McGraw-Hill, 2011. ISBN-10: 8838665737
[GM2] M. Gabbrielli e S. Martini. Programming Languages: Principles
and Paradigms, second edition. Springer, 2023. ISBN
978-3-031-34143-4.
[LY] S. Debray. Lex and Yacc: A Brisk Tutorial - University of
Arizona Disponibile
in rete.
Altri documenti e testi di possibile consultazione
Gli argomenti trattati nel corso sono reperibili su diversi libri di
testo, piuttosto simili tra di loro per contenuti e struttura.
In particolare, questo corso prende ispirazione anche da:
Michael Scott. Programming language pragmatics. Morgan Kaufmann.
Un libro di testo analogo, facilmente reperibile in rete:
Robert W. Sebesta. Concepts of Programming Languages. Pearson. ISBN-13:
978-0131395312
LUCIDI presentati a lezione e riferimenti ai testi
Introduzione
Lucidi in formato pdf: [1 per
pagina], [4 per
pagina].
Pag. 1-5,9-24, 42-47 da [GM]. Pag. 1-4, 9-21, 39-42 da [GM2].
Sintassi
Lucidi in formato pdf: [1 per
pagina], [4 per
pagina].
Pag. 25-42, 47-49, 51-57, 71-76, 83-85, 90-92, 100-101, 108-110, 129-133
da [GM]. Pag. 25-38, 43-49 da [GM2]. Per gli interessati, [LY] e, più
estesamente, [Ni] offrono un approfondimento di Lex/YACC.
Nomi e ambiente
Lucidi in formato pdf: [1 per
pagina], [4 per pagina].
Pag. 143-161, 354-356 da [GM]. Pag. 63-79, 274-275 da [GM2].
Gestione della memoria
Lucidi in formato pdf: [1 per
pagina], [4 per
pagina].
Capitolo 7 da [GM]. Pag. 87-112 da [GM2].
Strutture di controllo
Lucidi in formato pdf: [1 per
pagina], [4 per
pagina].
Capitolo 8 da [GM]. Pag. 117-157 da [GM2].
Astrarre sul controllo
Lucidi in formato pdf: [1 per
pagina], [4 per
pagina].
Capitolo 9 da [GM]. Pag. 164-192 da [GM2].
Astrarre sui dati
Lucidi in formato pdf: [1 per
pagina], [4 per pagina].
Pag. 279-329 da [GM]. Pag. 199-255 da [GM2].
Tipi di dati astratti
Lucidi in formato pdf: [1 per
pagina], [4 per
pagina].
Pag. 347-354 da [GM]. Pag. 268-275 da [GM2].
Paradigma funzionale
Lucidi in formato pdf: [1 per
pagina], [4 per
pagina], Esempi di codice presentati a
lezione.
Pag. 415-419 da [GM]. Pag. 335-354 da [GM2]. Tutto "A gentle
introduction to Haskell '98" tranne le sezioni 4.4 e 13. Gli argomenti
della sezione 9.3 sono stati svolti usando un diverso esempio guida.
Paradigma logico
Lucidi in formato pdf: [1 per
pagina], [4 per pagina],
Capitolo 14 da [GM]. Pag. 369-403 da [GM2].
Sistemi di assegnazione di tipo
Lucidi in formato pdf: [1 per
pagina], [4 per
pagina].
Dal capitolo "Type System" [Car], le sezioni 2-4.
È consigliata la lettura della sezione 1 che costituisce un'interessante
introduzione ai sistemi di tipi.
Concorrenza
Lucidi in formato pdf: [1 per
pagina], [4 per
pagina].
Pag. 493-525 da [GM]. Pag. 433-468 da [GM2].
L'esame si compone di una prova scritta e di una prova orale. Per
poter accedere alla prova orale è necessario avere svolto, a casa nei
tempi desiderati, una serie di esercizi; una breve presentazione di
alcune delle soluzioni svolte verrà richiesta durante l'orale.
Esercizi a casa:
Per completare la preparazione delle parti di programma relative alla
programmazione Haskell e all'uso degli strumenti software Alex e Happy
viene chiesto allo studente di svolgere per conto proprio una serie di
esercizi di programmazione. Gli esercizi svolti vanno consegnati via
web, caricandoli attraverso il sito di e-learning del corso (cartelle in
fondo alla pagina). Il sistema accetta la consegna di un unico file di
testo, quindi per ciascuno dei due argomenti, le diverse soluzioni vanno
inserite in un unico file. La consegna va fatta prima dell'esame orale e
fino alla data dell'orale è possibile modificare il lavoro consegnato
ricaricandolo. Si avverte che attraverso il software Turnitin viene
svolto un controllo antiplagio.
Gli esercizi da svolgere sono:
Haskell:
dall'elenco, reperibile nella pagina web del corso, nel sito e-learning,
cartella "Materiale didattico", file
"Esercizi-di-Programmazione-Haskell.pdf", svolgere almeno una ventina di
esercizi, possibilmente 2 per ogni categoria. Naturalmente viene
valutato positivamente l'aver risolto esercizi più avanzati nelle varie
categorie (vedi le note introduttive nell'elenco). Viene inoltre
valutato positivamente il presentare più soluzioni, che hanno usato
tecniche di programmazione diverse, per lo stesso esercizio. È comunque
sufficiente risolvere gli esercizi più semplici o versioni semplificate
degli esercizi proposti. Nota. In alcuni esercizi (esempio 2.7) si
richiede l'uso di tecniche non spiegate a lezione, queste richieste
possono essere ignorate.
lo svolgimento di una serie di esercizi analoghi a quelli presentati
durante le esercitazioni e reperibili nell'ultimo dei lucidi elencati di
sopra. Più nel dettaglio l'esame prevede:
un esercizio sulle grammatiche: da una specifica definire una
grammatica formale, e da questa una serie di regole per la costruzione
di un analizzatore lessicale o sintattico, con gli strumenti Lex, Alex,
Yacc, Happy.
uno o due esercizi sullo scope e sullo stack di attivazione, gli
esercizi consistono nel determinare il risultato della computazione di
un semplice programma imperativo, mostrando come variano stack di
attivazione e i valori assegnati alle variabili
un esercizio di programmazione in Haskell
un esercizio di derivazione formale del tipo di un'espressione
un eventuale esercizio sulla rappresentazione dei tipi di dato
la risposta ad una serie di domande riguardanti gli argomenti
trattati a lezione. Durante questa parte della prove scritta non sarà
possibile consultare il libro di testo o gli appunti.
Prova Orale:
La prova orale, obbligatoria per tutti, solitamente consiste in poche e
brevi domande sugli argomenti trattati a lezione. Per poter sostenere la
prova orale è necessario aver superato l'esame scritto con un voto
maggiore o uguale a 16. Si richiede inoltre che la prova scritta sia
stata superata da meno di un anno. Nel caso la prova orale non venga
superata o si decida di non accettare il voto, la prova scritta resta
valida, è quindi possibile ripetere la sola prova orale.
Esse3:
L'iscrizione all'esame con Esse3 è utile nell'organizzazione. In questo
senso, iscriversi all'esame e non presentarsi crea quasi gli stessi
inconvenienti di presentarsi all'esame senza essersi iscritti. Pertanto
chi rinunciasse a presentarsi ad una prova d'esame è caldamente
invitato a cancellare la propria iscrizione su Esse3.
Gli studenti che non dispongano di un account su Esse3 possono
iscriversi mandandomi un messaggio di posta elettronica all'indirizzo
"pietro.digianantonio at uniud.it".
Periodo di validità delle prove:
Le prove scritte mantengono la loro validità per un anno, ossia una
volta superato lo scritto lo studente ha un anno di tempo per completare
l'esame sostenendo le rimanenti prove.