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
L'esame consiste di una prova scritta, una prova di programmazione, che può essere svolta anche durante le esercitazioni, e la presentazione di un progetto finale, che applichi lo sviluppo multi-paradigma ad un caso reale.
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.
Obiettivi agenda 2030 per lo sviluppo sostenibile
- - -