Anno Accademico 2018/2019
Docente: Flavio Lombardi
Programma Provvisorio:
Il corso di Linguaggi di Programmazione ha come obiettivo quello di presentare i principali concetti della teoria dei linguaggi formali e la loro applicazione alla classificazione dei linguaggi di programmazione. Introdurre le principali tecniche per l'analisi sintattica dei linguaggi di programmazione. Imparare a riconoscere la struttura di un linguaggio di programmazione e le tecniche per implementarne la macchina astratta. Conoscere il paradigma orientato agli oggetti ed un altro paradigma non imperativo.
Programma Definitivo del Corso A.A. 2018/2019
1. Macchine astratte, compilatori e interpreti
◦ Macchine astratte: concetto di astrazione, linguaggio formale, linguaggio macchina. Macchina astratta e macchina hardware. Formalizzazione dei concetti di interprete e compilatore. Modalita` di implementazione: hardware, firmware, software. Macchina RAM. Microprogrammazione, prestazioni e sicurezza.
◦ Implementazioni di un linguaggio formale: schema interpretativo puro e schema compilativo puro. Macchina intermedia. Implementazione di tipo interpreta- tivo e di tipo compilativo della macchina intermedia. Gerarchie di macchine astratte.
2. Linguaggi di programmazione
◦ Linguaggi procedurali o imperativi, linguaggi funzionali, linguaggi dichiarativi o logici, linguaggi strutturati, cenni ad altri tipi di linguaggi.
◦ Definizione di linguaggio formale. Grammatiche libere da contesto (Chomsky), derivazione di stringhe. Definizione di linguaggio generato. Alberi di derivazione. Grammatiche ambigue. Gestione delle ambiguita`, metodi di disambiguazione. Vincoli sintattici contestuali. Descrizione delle fasi di compilazione: analisi lessicale, sintattica, semantica. Grammatiche regolari.
◦ Ambiente, associazione di un oggetto a un nome, blocchi di codice: visibilita`, operazioni sull’ambiente, operazioni sugli oggetti denotabili. Tempo di vita di associazioni e oggetti. Regole di visibilita`: definizione di scope statico. Scope statico dei nomi: proprieta` di indipendenza dalla posizione e indipendenza dai nomi locali. Definizione di scope dinamico. Confronto fra scope statico e scope dinamico.
3. Programmazione ad oggetti
◦ Principi fondamentali, concetto di classe e di oggetto. Richiami e definizioni formali di tipo di dato, sistema di tipi di un linguaggio di programmazione, sicurezza di un sistema di tipi.
◦ Controllo statico e dinamico dei tipi. Astrazione sui dati: interfaccia, implementazione, occultamento dell’informazione, controllo dell’accessibilita`.
◦ Introduzione al paradigma orientato agli oggetti: caratteri essenziali (incapsulamento, occultamento dell’informazione, ereditarieta`, sottotipi, selezione dinamica delle operazioni). Classi e oggetti, principi di organizzazione, es- tendibilita`, riuso del codice. Terminologia. Definizione di classe, costruttori, membri di classe e d’istanza. Riferimento implicito ”this” e allocazione.
◦ Overloading. Polimorfismo universale parametrico implicito ed esplicito. Polimorfismo di sottotipo e relazione con i generici. Utilizzo di un linguaggio di
◦ Fragilità nella gerarchia delle classi.
Modelli di implementazione dell’ereditariet`a multipla. Polimorfismo di sottotipi. Equivalenza per nome ed equivalenza strutturale di tipi.
◦ Ridefinizione di metodi (overriding) e mascheramento di campi (shadowing) nelle sottoclassi, astrazione ed ereditarieta`. Relazione con i sottotipi, supertipo immediato, erditarieta` singola e multipla. Problemi legati all’ereditariet`a di classi: ereditarieta` a diamante, conflitto di nomi (name clash), rimedi imple- mentativi, implicazioni sulla gerarchia di sottotipi. Ereditarieta` e astrazione: clausola ”abstract” e derivazione di classi astratte, clausola ”implements”, im- plementazione ed estensione di interfacce.
◦ Selezione dinamica dei metodi: differenza fra tipo del riferimento e tipo dell’oggetto. Late binding. Implementazione dell’ereditarieta` singola con tipi statici usando i record e della copia dei riferimenti agli oggetti.
◦ Gestione del controllo mediante eccezioni. Definizione di eccezione. Esempi. Propagazione delle eccezioni e catena dinamica. Cenno al record di attivazione per le procedure. Cenno all’implementazione delle eccezioni.
4. OOP in Java
◦ Variabili di classe, d’istanza, locali e loro allocazione in memoria. I costruttori. Incapsulamento e modificatori di accessibilità. Relazione di sottotipo e supertipo, clausola ”extends”, derivazione di classi, concetto di ereditarieta`, gerarchia di tipi, compatibilita` e polimorfismo. Compatibilita` verso il basso (downcasting).
◦ Convenzioni sull’uso dei nomi. Tecniche di occultamento dell’informazione. Il metodo speciale ”main” e punti d’ingesso della JVM. Caricamento di package e appartenenza di una classe ad un package. Modificatori di accesso. Sintassi ed esempi di implementazione delle eccezioni in Java. Metodi anonimi: le lambda-espressioni in Java.
◦ Documentazione del codice in Java: caratteristiche di javadoc, tag, generazione della documentazione.
5. Altri Linguaggi, classificazione, vantaggi, limitazioni, utilizzi.
◦ Rust, imperativo, funzionale, sicuro ed affidabile
◦ Scala funzionale
◦ Python e la sperimentazione, utilizzi come linguaggio di scripting ed interattivo. Jupyter Notebook.
Argomenti (Programma Indicativo del Corso)
[-] Macchine Astratte. Interpreti e Compilatori.
[-] Costrutti dei linguaggi.
[-] Programmazione Object Oriented.
[-] Programmazione Funzionale.
Valutazione
La valutazione prevede una prova scritta sugli argomenti del corso più la implementazione di un progetto software e della relativa documentazione concordato con il docente
Final Syllabus:
Objectives
Topics
Evaluation
TESTI
[1] Maurizio Gabbrielli, Simone Martini, Linguaggi di programmazione - Principi e para- digmi, 2/ed. McGraw-Hill, (2011).
[2] Dean Wampler, Alex Payne, Programming Scala: Scalability = Functional Programming
+ Objects, 2 edizione. O’Reilly Media, (2014).
[3] David Parsons, Foundational Java Key Elements and Practical Programming. Springer- Verlag, (2012).
Bibliografia supplementare
[4] Kip R Irvine, Assembly Language for X86 Processors. Pearson, (2015).
[5] Bruce Tate, Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Program- ming Languages Pragmatic Bookshelf . (2010).
[6] Daniel P. Friedman, Mitchell Wand, Essentials of Programming Languages. MIT Press, (2008).
Modalita` d’esame
- valutazione in itinere (“esoneri”) SI
- esame finale scritto SI orale NO
- altre prove di valutazione del profitto NO
L’esame consiste di due parti: un esame scritto e della discussione di una progetto di programmazione assegnato per gruppi e da implementare in uno dei linguaggi Rust, Java, Scala, Python.
Le due prove di esonero sostituiscono la prova scritta. Il voto finale si compone al 33% del voto del primo esonero, al 33% del voto del secondo esonero, ed al 34% dal voto del progetto di programmazione.
Nel caso di prova scritta complessiva (no esoneri) questa vale per il 66% del voto complessivo.
2018-09-27