Docente
|
PEDICINI MARCO
(programma)
1. Macchine astratte, compilatori e interpreti
- Macchine astratte: concetto di astrazione, linguaggio formale, linguaggio mac- china. Macchina astratta e macchina hardware. Formalizzazione dei concetti di interprete e compilatore. Modalit`a di implementazione: hardware, firmware, software. Macchina RAM.
- Implementazioni di un linguaggio formale: schema interpretativo puro e schema compilativo puro. Macchina intermedia. Implementazione di tipo interpretativo 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 (Chom- sky), derivazione di stringhe. Definizione di linguaggio generato. Alberi di derivazione. Grammatiche ambigue. Gestione delle ambiguit`a, metodi di disambiguazione. Vincoli sintattici contestuali. Descrizione delle fasi di compilazione: analisi lessicale, sintattica, semantica. Grammatiche regolari. Esem- pio di compilazione.
- Ambiente, associazione di un oggetto a un nome, blocchi di codice: visibilit`a, operazioni sull’ambiente, operazioni sugli oggetti denotabili. Tempo di vita di associazioni e oggetti. Regole di visibilit`a: definizione di scope statico. Scope statico dei nomi: propriet`a 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, imple- mentazione, occultamento dell’informazione, controllo dell’accessibilit`a.
- Introduzione al paradigma orientato agli oggetti: caratteri essenziali (incap- sulamento, occultamento dell’informazione, ereditariet`a, sottotipi, selezione dinamica delle operazioni). Classi e oggetti, principi di organizzazione, es- tendibilit`a, 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. Poli- morfismo di sottotipo e relazione con i generici. Utilizzo di un linguaggio di diagrammazione di classe: cenni ad UML.
- Fragilit`a nella gerarchia delle classi. Implementazione dell’ereditariet`a mul- tipla mediante vtable. Modelli di implementazione dell’ereditariet`a multipla: implementazione mediante vtable con replicazione e con condivisione. Polimor- fismo di sottotipi. Equivalenza per nome ed equivalenza strutturale di tipi.
- Ridefinizione di metodi (overriding) e mascheramento di campi (shadowing) nelle sottoclassi, astrazione ed ereditariet`a. Relazione con i sottotipi, supertipo immediato, erditariet`a singola e multipla. Problemi legati all’ereditariet`a di classi: ereditariet`a a diamante, conflitto di nomi (name clash), rimedi imple- mentativi, implicazioni sulla gerarchia di sottotipi. Ereditariet`a 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’og- getto. Late binding. Implementazione dell’ereditariet`a singola con tipi statici usando i record e della copia dei riferimenti agli oggetti.
- Gestione del controllo mediante eccezioni. Definizione di eccezione. Propaga- zione 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 costrut- tori. Incapsulamento e modificatori di accessibilit`a. Relazione di sottotipo e supertipo, clausola ”extends”, derivazione di classi, concetto di ereditariet`a, gerarchia di tipi, compatibilit`a e polimorfismo. Compatibilit`a verso il basso (down-casting).
- 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.
(testi)
[1] Maurizio Gabbrielli, Simone Martini, Linguaggi di programmazione - Principi e paradigmi 2/ed, McGraw-Hill (2011) [2] Dean Wampler, Alex Payne, Programming Scala: Scalability = Functional Programming + Objects, O'Reilly Media; 2 edizione (2014) [3] David Parsons, Foundational Java Key Elements and Practical Programming, Springer-Verlag, (2012)
|