PARADIGMI E LINGUAGGI DI PROGRAMMAZIONE

Docenti: 
POGGI Agostino
Codice dell'insegnamento: 
10424*16108*2016*2015*9999
Crediti: 
6
Anno accademico di offerta: 
2017/2018
Settore scientifico disciplinare: 
SISTEMI DI ELABORAZIONE DELLE INFORMAZIONI (ING-INF/05)
Semestre dell'insegnamento: 
Secondo Semestre
Lingua dell'insegnamento: 

Italiano

Obiettivi formativi

L’obiettivo del corso è fornire allo studente la capacità di comprendere i principi dei linguaggi di programmazione e le tecniche di programmazione moderna secondo i diversi principali paradigmi:

• Basi di teoria dei linguaggi e dei compilatori
• Programmazione ad oggetti
• Programmazione generica
• Programmazione funzionale

Le capacità di applicare le conoscenze elencate riguardano soprattutto lo sviluppo multi-paradigma, adatto al contesto di sistemi distribuiti, eterogenei e paralleli:

• Gestire in maniera corretta dati e codice in forma testuale
• Riconoscere ed utilizzare caratteristiche comuni a vari linguaggi
• Utilizzare l'analisi statica per ottenere codice robusto e performante
• Utilizzare il polimorfismo e la metaprogrammazione per alzare il livello di astrazione
• Utilizzare la programmazione funzionale per l'integrità e la computazione parallela

Prerequisiti

Nessuna propedeuticità. Si suppone comunque che lo studente abbia buone basi di programmazione strutturata e ad oggetti.

Contenuti dell'insegnamento

1. Introduzione ai linguaggi formali
2. Programmazione ad oggetti
3. Programmazione generica
4. Programmazione funzionale
5. Linguaggi dinamici e metaprogrammazione

Programma esteso

1. Introduzione ai linguaggi formali (12 ore in aula e 4 in lab)
a. Classificazione di Chomsky
b. Espressioni regolari
c. Grammatiche non contestuali
d. Analisi sintattica e generatori di parser
e. Alberi sintattici e generazione del codice
2. Programmazione ad oggetti (4 ore in aula e 2 in lab)
. Introduzione
a. Programmazione ad oggetti in C++14
b. Confronto con altri linguaggi: Java, Python, Go
3. Programmazione generica (4 ore in aula e 2 in lab)
. Introduzione
a. Template C++ e STL
4. Paradigma di programmazione funzionale (8 ore in aula e 4 in lab)
. Introduzione
a. Presentazione del linguaggio LISP
b. Programmazione in Haskell
c. Caratteristiche funzionali del C++14
d. Programmazione parallela con il C++14
5. Linguaggi dinamici e metaprogrammazione (4 ore in aula e 2 in lab)
. Introduzione
a. Caratteristiche dinamiche del C++14
b. Linguaggi dinamici e di scripting
c. Metaprogrammazione in Python

Bibliografia

• M. Gabbrielli, S. Martini (2011). Linguaggi di programmazione - Principi e paradigmi. 9788838665738.
• M. Lipovaca (2012). Learn You a Haskell for Great Good. 9781593272838. http://learnyouahaskell.com/
• S. B. Lippman, J. Lajole, B. E. Moo (2013). C++ Primer. 9780321714111

Metodi didattici

Lezioni in aula, con l'ausilio di slide rese disponibili in anticipo agli studenti. Possibilità di adottare l'approccio Flipped Classroom e seminari per alcuni contenuti. Esercizi di programmazione in laboratorio.

Modalità verifica apprendimento

Sono previste una prova orale e una prova pratica. La prova orale verte su una discussione sugli argomenti trattati durante il corso e ha lo scopo di valutare la conoscenza acquisita su questi argomenti. Questa prova è valutata con scala 0-30 e il voto viene comunicato al termine della prova stessa. La prova pratica consiste nello sviluppo di un sistema software e può essere svolta dagli studenti in modo individuale o in gruppi con massimo due persone. Lo scopo principale di questa prova è valutare la capacità di applicare la conoscenza acquisita durante il corso. Tuttavia, il valore della valutazione dipenderà anche dalla qualità del sistema sviluppato, della documentazione allegata e della presentazione orale (con l’uso di slide) del sistema. Questa prova è valutata con scala 0-30 e il voto viene comunicato al termine della presentazione del sistema realizzato. L’esame è superato se il risultato di entrambe le prove è maggiore o uguale a 18. Il voto finale è uguale alla media aritmetica dei voti delle due prove. La lode può essere assegnata nel caso del raggiungimento del massimo punteggio su entrambe le prove.

Altre informazioni

Testi alternativi e di approfondimento

• J. E. Hopcroft (2009). Automi, linguaggi e calcolabilità. 9788871925523.
• A. V. Aho, M. S. Lam, R. Sethi, J. D. Ullman (2009). Compilatori - Principi, tecniche e strumenti. 9788871925592.
• B. Stroustrup (2015). C++ - Linguaggio, libreria standard, principi di programmazione. 9788865184486.