- Programming Languages
- Summary
Course Syllabus
Obiettivi
Conoscenza e capacità di comprensione
Gli studenti acquisiranno una solida comprensione dei principali paradigmi di programmazione, con particolare attenzione a quello logico e a quello funzionale. Comprenderanno le differenze concettuali tra i paradigmi, nonché le motivazioni storiche e teoriche alla base del loro sviluppo, inclusi aspetti legati alla tipizzazione, alla modellazione dei problemi e al controllo del flusso computazionale.
Conoscenza e capacità di comprensione applicate
Gli studenti saranno in grado di applicare le conoscenze acquisite nello sviluppo di programmi in linguaggi rappresentativi dei paradigmi studiati (es. Common Lisp per il paradigma funzionale, Prolog per quello logico). Utilizzeranno ambienti di sviluppo specifici per progettare e implementare soluzioni a problemi di complessità medio-bassa, anche in contesti applicativi diversi.
Autonomia di giudizio
Gli studenti svilupperanno la capacità di valutare criticamente i diversi paradigmi di programmazione in relazione al problema da risolvere, scegliendo consapevolmente linguaggi e tecniche in base ai vincoli del dominio applicativo. Saranno in grado di analizzare e confrontare approcci alternativi alla programmazione sulla base di criteri teorici e pratici.
Abilità comunicative
Gli studenti saranno in grado di descrivere in modo chiaro e rigoroso soluzioni software e scelte progettuali, sia oralmente sia per iscritto, utilizzando un linguaggio tecnico appropriato. Sapranno inoltre discutere e motivare le scelte di paradigma e linguaggio adottate in relazione al problema affrontato.
Capacità di apprendere
Il corso fornirà agli studenti strumenti teorici e pratici per approfondire autonomamente nuovi linguaggi e modelli di programmazione. In particolare, saranno messi in grado di affrontare con consapevolezza e spirito critico l’apprendimento di linguaggi non trattati direttamente nel corso ma appartenenti ai paradigmi studiati.
Contenuti sintetici
L’insegnamento ha l’obiettivo di mostrare il panorama dei paradigmi di programmazione secondo la tradizionale suddivisione tra paradigma imperativo, paradigma logico (dichiarativo) e paradigma funzionale.
Programma esteso
- I paradigmi di programmazione: imperativo, logico (dichiarativo) e funzionale. Richiami delle nozioni di “run-time” e di esecuzione di un programma su un’architettura idealizzata a pila (stack). Nozioni base degli ambienti di programmazione per i diversi sistemi presentati. Cenni storici.
- Il paradigma di programmazione logico. Introduzione al linguaggio di programmazione Prolog.
- Il paradigma di programmazione funzionale. Introduzione al linguaggio di programmazione LISP (Common Lisp). Note su Haskell, Julia e Javascript.
- Il paradigma di programmazione imperativo. Introduzione al linguaggio di programmazione C/C++.
- Utilizzo dei vari paradigmi in situazioni e contesti diversi: tipizzazione, il concetto di astrazione e abstract data types, concorrenza ee event handling
Prerequisiti
Concetti di base di programmazione ricorsiva, logica matematica e di architetture hardware e software.
Modalità didattica
Il corso si svolgerà mediante lezioni frontali in presenza e con l’ausilio di sistemi di e-learning per la distribuzione del materiale didattico e di esercizi e progetti. Ci saranno inoltre delle lezioni in laboratorio per imparare a programmare nei linguaggi considerati a lezione.
Indicativamente, e a seconda delle necessità contigenti l'insegnamento sarà articolato su
- 48 ore di lezione frontlale da 2-3 ore svolte in modalità erogativa in presenza;
- 8 attività di laboratorio da 3 ore svolte in modalità interattiva in presenza.
Materiale didattico
Libro di Testo: Robert W. Sebesta (12th Edition). Concepts of Programming Languages. Pearson, 2025
Testi consigliati:
- Leon Sterling and Ehud Shapiro, The Art of Prolog Advanced Programming Techniques - 2nd Edition;
- Abelson, Sussman e Sussman, Structure and Interpretation of Computer Programs (SICP);
- Abelson, Sussman, Henz and Wrigstad, Structure and Interpretation of Computer Programs (SICP) - Javascript edition;
- Peter Seibel, Practical Common Lisp (PCL);
- Brian W. Kernigham & Dennis M. Ritchie, C Programming Language (2ⁿᵈ Edition), Prentice Hall, 1988;
- Robert Sedgewick, Algorithms in C, Parts 1-5 (Bundle): Fundamentals, Data Structures, Sorting, Searching, and Graph Algorithms (3rd Edition), Addison Wesley, 2001;
- Varie risorse online per gli altri linguaggi di programmazione presentati.
Periodo di erogazione dell'insegnamento
Primo semestre
Modalità di verifica del profitto e valutazione
L'insegnamento di Linguaggi di Programmazione prevede il superamento di una prova teorica (uno scritto) e di un progetto di programmazione. A discrezione del docente potrà essere richiesta anche una prova orale. La prova scritta ed il progetto corrispondente al primo appello sono strutturati in due prove "in itinere".
Le prove in itinere sono due scritti offerti in Novembre (Programmazione Logica e Prolog) e a Gennaio/Febbraio (Programmazione Funzionale; Programmazione Imperativa), e uno o due progetti in itinere, postati a fine Ottobre, da consegnare in forma elettronica a Gennaio/Febbraio. Le prove in itinere costituiscono, come già detto, il primo appello per il corso, e non sono recuperabili nei restanti appelli.
Dall'appello successivo (Febbraio/Marzo) lo scritto comprende tutte le parti del corso. Lo stesso vale per i progetti. Gli appelli seguenti saranno a Giugno, Luglio e Settembre (in data da precisarsi).
La parte teorica ed i progetti di laboratorio vanno superati entrambi nella stessa tornata; il voto complessivo è la media, ponderata a seconda dei casi, ovvero a discrezione del docente, dei voti parziali. In particolare, una media aritmetica almeno pari a 18 non è sufficiente per garantire il superamento dell'esame.
I progetti posso essere svolti in gruppo (massimo 3 persone). Chi svolge il progetto da solo od in coppia potrà avere un bonus.
Il voto è in trentesimi, ed esprime una valutazione complessiva di tutto cioè che concorre al raggiungimento degli obiettivi formativi dichiarati. Cioè, è frutto di una valutazione complessiva delle varie caratteristiche delle prove. Per esempio: chiarezza, rigore, autonomia di giudizio, capacità di scegliere esempi e di illustrare l'argomento in modo efficace.
Nota finale: tutti gli esiti saranno caricati nel sistema: voto, ritirato, assente, insufficiente etc.
Orario di ricevimento
Prof. Marco Antoniotti: giorno da decidersi o su appuntamento via email.
Prof. Claudio Ferretti: su appuntamento via email.
Prof. Fabio Sartori: su appuntamento via email.
Sustainable Development Goals
Aims
Knowledge and understanding
Students will acquire a solid understanding of the main programming paradigms, with particular focus on the logic and functional paradigms. They will understand the conceptual differences between these paradigms, as well as the theoretical and historical motivations behind their development, including aspects related to typing, problem modeling, and control flow.
Applying knowledge and understanding
Students will be able to apply their knowledge to the development of software using representative languages of the studied paradigms (e.g., Common Lisp for the functional paradigm, Prolog for the logic paradigm). They will use appropriate programming environments to design and implement solutions to problems of low to medium complexity, also in different application contexts.
Making judgements
Students will develop the ability to critically evaluate different programming paradigms in relation to the problem at hand, and to make informed decisions about the most suitable language and approach. They will be able to analyze and compare alternative programming strategies based on both theoretical and practical considerations.
Communication skills
Students will be able to clearly and accurately describe software solutions and design decisions, both orally and in writing, using appropriate technical terminology. They will also be able to explain and justify their choice of paradigm and language based on the characteristics of the problem.
Learning skills
The course will provide students with the theoretical and practical tools needed to independently explore new programming languages and paradigms. In particular, they will be equipped to critically and autonomously approach the learning of languages not explicitly covered in the course but belonging to the paradigms studied.
Contents
The course will provide students with a panoramic view of the main programming language paradigms: imperative, logic (declarative) and functional.
Detailed program
- Programming languages paradigms: imperative, logical (declarative) and functional. Notions recall of “run-time”, program execution on an idealized stack architecture. Basic notions about programming environments for the different systems presented. Some historical perspectives.
- The logic programming paradigm. Introduction to the Prolog programming language.
- The functional programming paradigm. Introduction to the (Common) Lisp programming language. Notes on Haskell, Julia and Javascript.
- The imperative programming paradigm. Introduction to the C/C++ programming language.
- Usage of the different paradigms in a variety of contexts: type checking, abstraction, abstract data types, concurrency and event handling.
Prerequisites
Basic concepts of recursive programming, mathematical logic and hardware/software architecture.
Teaching form
The course will be offered as a set of standard lectures during the term. “e-Learning” support will also be provided for the distribution of course material, exercises and project descriptions. Moreover there will be laboratory sessions where the students will learn to program with the programming languages introduced during the course.
As a possible guideline, subject to contingency, the course will be organized as
- 48 hours lectures: traditional lecture in presence.
- 8 3 hours laboratory: traditional and interactive laboratory activities in presence.
Textbook and teaching resource
Reference text: Robert W. Sebesta (12th Edition). Concepts of Programming Languages. Pearson, 2025
- Leon Sterling and Ehud Shapiro, The Art of Prolog Advanced Programming Techniques - 2nd Edition;
- Abelson, Sussman e Sussman, Structure and Interpretation of Computer Programs (SICP);
- Abelson, Sussman, Henz e Wrigstad, Structure and Interpretation of Computer Programs (SICP) - Javascript edition;
- Peter Seibel, Practical Common Lisp (PCL);
- Brian W. Kernigham & Dennis M. Ritchie, C Programming Language (2ⁿᵈ Edition), Prentice Hall, 1988;
- Robert Sedgewick, Algorithms in C, Parts 1-5 (Bundle): Fundamentals, Data Structures, Sorting, Searching, and Graph Algorithms (3rd Edition), Addison Wesley, 2001
- Various online resources for the other programming language presented.
Semester
First semester
Assessment method
The Programming Languages exam requires passing a written test and a programming project. At the discretion of the instructors an oral exam may be also required. The written exam and the project corresponding to the first roll-call are organized into two "partial" tests.
The partial tests are two written exams offered in November (Logic Programming) and in January/February (Functional Programming; Imperative Programming), plus one or two projects, posted towards the end of October, to be electronically handed-in in January/February. The partial tests, as already said, comprise the first roll-call for the course and are not held over for the remaining roll-calls.
From the next roll-call (February/March) onward, the written exam will comprise all the course materiale. The same applies for the projects. The following roll-calls will be in June, July and September (in dates to be announced).
The written exam and the projects must be passed after the same roll-call; the final grade is the weighted average, at the discretion of the instructors, of the partial grades. In particular, a weighted arithmetic average equal to 18 does not guarantee the passing of the exam.
Projects can be done in groups (max 3 people). Whoever works on a project alone or in a pair, may have a bonus.
The final grade is in thirtieths, and expresses a comprehensive evaluation of everything that concurs to the achievement of the stated educational goals. That is, it is the result of a comprehensive evaluation of the tests. E.g., clarity, rigor, judgment abilities, argumentation choices and ability to illustrate them in an efficacious way.
Final note: every exam result will be recorded in the system: grade, withdraw, absent, insufficient, etc.
Office hours
Prof. Marco Antoniotti: TBD or by appointment via email.
Prof.Claudio Ferretti: by appointment via email.
Prof. Fabio Sartori: by appointment via email.
Sustainable Development Goals
Key information
Staff
-
Marco Antoniotti
-
Claudio Ferretti
-
Fabio Sartori