TECNICHE DI PROGRAMMAZIONE FUNZIONALE E IMPERATIVA Canale unico
Docente coordinatore e verbalizzante: IVANO SALVO
Docenti
Obiettivi formativi
Obiettivi generali:
Apprendimento del paradigma di programmazione funzionale e di aspetti avanzati di programmazione imperativa.
Studio comparato di diversi paradigmi di programmazione (imperativo, funzionale e a oggetti) per sviluppare un senso critico nell'apprendimento e valutazione dei linguaggi di programmazione.
Obiettivi specifici:
Conoscenza e Comprensione:
Aspetti avanzati di programmazione C (in particolare uso di puntatori espliciti e (de)allocazione dinamica di memoria, valutazione della complessità concreta dei programmi). Aspetti base ed avanzati di programmazione funzionale in Haskell (in particolare tipi polimorfi, funzionali di ordine superiore, laziness).
Applicare Conoscenza e Comprensione:
Applicare la metodologie specifiche di diversi paradigmi di programmazione alla soluzione dei problemi.
Capacità Critiche e di Giudizio:
Lo studio comparato dei paradigmi di programmazione permette di valutare ad esempio quale sia il linguaggio più adatto per risolvere un certo problema o sviluppare un progetto software.
Le tecniche di ragionamento sui programmi possono guidare sia il testing che lo sviluppo dei programmi.
Inoltre, lo studente dovrebbe acquisire strumenti necessari per valutare criticamente altri linguaggi di programmazione.
Capacità Comunicative
Lo studente è stimolato, soprattutto nella presentazione da fare a fine corso, a esporre concisamente ma in modo preciso le idee necessarie allo sviluppo di una brillante soluzione a un problema computazionale ed anche l'analisi di un programma.
Capacità di Apprendimento:
Lo studio comparato di diversi paradigmi di programmazione stimola la capacità di apprendimento di altri linguaggi di programmazione, dando allo studente gli strumenti per distinguere gli aspetti caratterizzanti di un linguaggio di programmazione (logica del core language, come ad esempio passaggio di parametri, sistema dei tipi, semantica dei comandi) da quelli più strettamente tecnici (come imparare a usare librerie e strumenti di sviluppo, come IDE e debugger).
Risultati di apprendimento attesi
Conoscenze e capacità di comprensione: caratteristiche della programmazione funzionale, scrivere programmi Haskell corretti, astrazioni per costruire schemi di programmi.
Utilizzazione delle conoscenze e capacità di comprensione: applicare la logica funzionale alla soluzione dei problemi, anche quando si usa un linguaggio imperativo.
Capacità di trarre conclusioni: determinare il giusto linguaggio di programmazione per un progetto software; determinare problemi di un progetto software esistente;
Abilità comunicative: descrizione astratta ma precisa delle funzionalità di un artefatto software;
Capacità di apprendere: apprendere rapidamente nuovi linguaggi di programmazione, concentrandosi su questioni critiche chiave della semantica dei linguaggi di programmazione.
Prerequisiti
Concetti ed esperienza di programmazione imperativa e/o oggetti (Java, Python, etc.)
Programma dell’insegnamento
Parte 1: Programmazione Funzionale.
1.1) Concetti base di Haskell: tipi, funzioni, definizioni ricorsive.
1.2) Classi, tipi definiti dall'utente, funzioni di ordine superiore.
1.3) Call-by-name e valutazione lazy. Tipi di dato infiniti.
1.4) Trattamento di aspetti non-funzionali (IO, eccezioni, stato, etc.) in Haskell:
Funtori, Applicativi e Monadi.
1.5) Sviluppo di programmi corretti e trasformazioni di programmi: ragionamento equazionale.
Parte 2: Programmazione Imperativa.
2.1) Ripasso di programmazione base in C.
2.2) Gestione esplicita della memoria in C, alias, side-effects.
2.3) Programmazione Funzionale in C.
2.4) Sviluppo di Programmi corretti in C: asserzioni logiche. Limiti di questa metodologia nella programmazione imperativa.
Parte 3: Perle di Programmazione Funzionale e Imperativa.
Testi di riferimento
Testi:
R. Bird: "Thinking Functionally with Haskell". Cambridge University Press, 2015.
G. Hutton: Programming in Haskell (2nd edition). Cambridge University Press (2016).
B.W.Kernigham, D. Ritchie: "The C Programming Language" (2nd edition), Pearson, 1988.
Dispense del docente.
Bibliografia
Testi di consultazione e ispirazione:
E. W. Dijkstra: "A Discipline of Programming", Prentice Hall, 1976.
A. Oram, G. Wilson (eds.): "Beautiful Code", O'Reilly, 2008.
R. Bird: "Pearls of Functional Algorithm Design", Cambridge University Press, 2010.
J. Bentley: "Programming Pearls" (1986) and "More Programming Pearls" (1988), Addison Wesley.
R. Bird, P. Wadler: "Introduction to Functional Programming", Prentice Hall (1988).
Modalità di svolgimento
La modalità di svolgimento è tradizionale in aula con slides (lezioni)
e lavagna (esercitazioni).
Frequenza
La frequenza è fortemente raccomandata.
Modalità di esame
L'esame consiste di una prova scritta/homework e di una presentazione orale.
La prova scritta valuta le capacità di problem solving e lo stile di programmazione
acquisite, mentre la presentazione orale la capacità di esporre un piccolo
progetto di programmazione oppure un problema e la sua soluzione in modo sintetico
ed efficace.
Esempi di domande
Esercizi: Scrivere piccole funzioni su liste (finite/infinite).
Domande:
tipi e polimorfismo, trattamento di aspetti non funzionali (input/output, stato, strutture dati mutabili).
Programmazione delle attività didattiche
- Fondamenti della Programmazione Funzionale
- Temi avanzati di Programmazione Funzionale
- Temi avanzati di Programmazione Imperativa in C
Obiettivi per lo sviluppo sostenibile - Agenda ONU 2030
- Anno accademico2026/2027
- Corso di studio a cui afferisce l’insegnamentoInformatica
- Codice insegnamento10589652
- CurriculumMetodologico
- Anno e semestre3º anno - 2º semestre
- TipologiaAttività formative affini ed integrative
- AmbitoAttività formative affini o integrative
- SSDINF/01
- Presenza obbligatoriaNo
- Linguaita
- CFU6 CFU
- Durata complessiva60 ore
- Distribuzione delle ore36 classroom hours, 24 training hours