I linguaggi di programmazione e la programmazione funzionale e object-oriented sono strumenti e concetti alla base dello sviluppo del software.
L'insegnamento fornisce le principali nozioni necessarie alla progettazione, comprensione, utilizzo, e implementazione di un linguaggio di programmazione: sintassi, sematica statica e dinamica, interpreti.
Vengono inoltre approfondite le tecniche e metodologie di programmazione funzionale e object-oriented mediante l'apprendimento dei linguaggi F# e Java.
L'insegnamento permette di applicare i concetti più teorici acquisiti a lezione attraverso diverse esperienze pratiche di laboratorio e lo sviluppo di un progetto finale di medie dimensioni.
Acquisire le nozioni fondamentali relative ai linguaggi di programmazione ad alto livello e una conoscenza approfondita di diversi paradigmi di programmazione (in particolare object-oriented e funzionale), dal punto di vista concettuale e operativo. Essere in grado, inoltre, di sviluppare programmi a partire da specifiche informali nell'ambito della programmazione in piccolo mediante l'utilizzo di un ambiente di sviluppo integrato.
Al termine dell'insegnamento, lo studente/la studentessa sarà in grado di:
Nozioni fondamentali di programmazione imperativa e di algoritmi e strutture dati
Lezioni frontali dedicate alla teoria, a dimostrazioni pratiche e alla discussione degli esercizi via via proposti da svolgere individualmente per l'autovalutazione dell'apprendimento.
Esercitazioni di gruppo in laboratorio su programmazione in F# e Java. Svolgimento in gruppo di un progetto finale in Java.
Le esercitazioni e il progetto vengono svolti utilizzando lo strumento GitHub Classroom per lo sviluppo collaborativo del software.
Elementi di un linguaggio di programmazione: generalità, diversi paradigmi; sintassi, semantica statica e dinamica, sviluppo di un interprete guidato dalla semantica formale. Paradigma object oriented (linguaggio Java): oggetti, classi, interfacce, ereditarietà e binding dinamico, casting, overloading, eccezioni. Caratteristiche avanzate: classi e metodi generici. Esempi d'uso dell'API standard, design pattern iterator, decorator e visitor. Paradigma funzionale (linguaggio F#): funzioni di ordine superiore e polimorfe, inferenza di tipi polimorfi, currying, funzioni su liste, ricorsione di coda e parametri di accumulazione, tipi user-defined.
Ricevimento: Su appuntamento tramite email o Teams
DAVIDE ANCONA (Presidente)
ELENA ZUCCA SCHILLANI
FRANCESCO DAGNINO (Presidente Supplente)
GIOVANNI LAGORIO (Supplente)
PAOLA MAGILLO (Supplente)
In accordo con il calendario didattico approvato dal Consiglio dei Corsi di Studio in Informatica
Esame scritto, progetto software finale in Java, colloquio individuale sul progetto.
Apprendimento e capacità di applicazione dei concetti base della programmazione object-oriented: sviluppo del progetto software finale e corrispondente colloquio individuale; esercizi di comprensione e programmazione in Java da svolgere durante l'esame scritto.
Comprensione, uso e implementazione dei design pattern iterator, decorator e visitor: sviluppo del progetto software finale e corrispondente colloquio individuale; esercizi di programmazione in Java da svolgere durante l'esame scritto.
Apprendimento e applicazione dei concetti base della programmazione funzionale: esercizi di programmazione in F# da svolgere durante l'esame scritto.
Comprensione della specifica di un linguaggio di programmazione e delle problematiche alla base dell'implementazione di interpreti di liguaggi di programmazione: sviluppo del progetto software finale e corrispondente colloquio finale; esercizi su espressioni regolari e grammatiche context free da svolgere durante l'esame scritto.
Capacità di collaborare all'interno di un team di sviluppo software per implementare un progetto di un migliaio di linee di codice; capacità di interazione con gli altri componenti del team e con i docenti: sviluppo del progetto software finale con l'aiuto dello strumento collaborativo GitHub e corrispondente colloquio finale.