Introduzione ai linguaggi di programmazione
Motivazioni del corso. Terminologia. Cenni storici alla evoluzione dei linguaggi di programmazione. Processo di sviluppo del software. Linguaggi di programmazione e metodi di progettazione del software. Paradigmi di programmazione. Linguaggi di programmazione ed architetture degli elaboratori. Qualità del software supportata dai linguaggi di programmazione. Fattori critici e conflitti nella progettazione di un linguaggio di programmazione. Vincoli relativi alla progettazione di un linguaggio di programmazione.
Sintassi e semantica
Formalizzazione di un linguaggio di programmazione. Sintassi e lessico. Espressioni regolari. Riconoscitori e generatori. Classificazione di Chomsky. Grammatiche BNF ed EBNF. Diagrammi sintattici. Introduzione alla semantica formale. Semantica dinamica: semantica operazionale, semantica denotazionale.
Variabili
Attributi di una variabile. Il concetto di binding e di binding-time. Tempo di vita. Classificazione delle variabili in base al lifetime. Controllo dei tipi. Tipizzazione forte. Compatibilità dei tipi, per nome e per struttura. Scope statico e dinamico. Ambiente di referenziazione.
Espressioni
Espressioni aritmetiche: scelte progettuali. Ordine di valutazione degli operatori e degli operandi. Regole di precedenza e di associatività. Overloading degli operatori. Conversioni di tipo implicite ed esplicite. Espressioni relazionali e booleane.
Programmazione funzionale
Limiti del paradigma imperativo. Funzioni matematiche e di programmazione. Principi di programmazione funzionale: valori, collegamenti, funzioni, forme funzionali. Introduzione ai linguaggi funzionali Scheme ed Haskell.
Programmazione logica
Concetti di programmazione dichiarativa. Logica proposizionale, logica dei predicati, proprietà algebriche, clausole di Horn. Trasformazione di predicati in clausole di Horn. Risoluzione ed unificazione. Introduzione al linguaggio logico Prolog.