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:
- Programmazione funzionale
- Programmazione ad oggetti
- Programmazione generica
- Metaprogrammazione
Le capacità di applicare le conoscenze elencate riguardano lo sviluppo multi-paradigma, adatto al contesto di sistemi distribuiti, eterogenei e paralleli:
- Riconoscere ed utilizzare caratteristiche comuni a vari linguaggi
- Usare l'analisi statica per ottenere codice robusto ed efficiente
- Usare il polimorfismo e la metaprogrammazione per alzare il livello di astrazione
- Usare la programmazione funzionale per la consistenza dei risultati e la computazione parallela
Prerequisiti
Nessuna propedeuticità è formalmente richiesta. Si suppone comunque che lo studente abbia buona comprensione della programmazione strutturata e ad oggetti.
Contenuti dell'insegnamento
1. Introduzione al corso
2. Introduzione ai linguaggi formali
3. Programmazione funzionale
4. Programmazione ad oggetti
Programma esteso
1. Introduzione al corso (4 ore di lezione)
1.1 Paradigmi e linguaggi di programmazione
1.2. Concetti e classificazione dei linguaggi
1.3. Sviluppo dei principali linguaggi e loro relazioni
2. Introduzione ai linguaggi formali (8 ore di lezione e 4 di esercizi)
2.1. Classificazione di Chomsky
2.2. Espressioni regolari
2.3. Grammatiche non contestuali
2.4. Analisi sintattica e generatori di parser
2.5. Alberi sintattici e generazione del codice
3. Programmazione funzionale (12 ore di lezione e 6 di esercizi)
3.1. Presentazione del linguaggio Haskell
3.2. Classi di tipi in Haskell
3.3. Funzioni ricorsive e tail recursion
3.4. Funzioni di ordine superiore, currying
3.5. Mapping, filtering, folding
3.6. Polimorfismo a tempo di compilazione ed esecuzione
3.7. Azioni di I/O in Haskell
3.8. Caratteristiche funzionali di Python ed altri linguaggi
4. Programmazione ad oggetti (12 ore di lezione e 6 di esercizi)
4.1. Incapsulamento, composizione, ereditarietà, polimorfismo
4.2. Tecniche di compilazione ed esecuzione di programmi C++
4.3. Presentazione del linguaggio Rust
4.4. Gestione della memoria con ownership
4.5. Programmazione generica
4.6. Linguaggi dinamici e di scripting
4.7. Metaprogrammazione in Python
4.8. Confronto tra vari linguaggi: C++, Java, Python, Go, Rust
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 aula o in laboratorio.
Modalità verifica apprendimento
L'esame consiste di una prova di programmazione, che può essere svolta anche gradualmente 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
- - -