Il corso di Paradigmi di Programmazione ha lo scopo di formare la capacità di apprendere facilmente nuovi linguaggi di programmazione. Per raggiungere tale obiettivo il corso fornirà agli studenti conoscenze approfondite sui principali paradigmi di programmazione (imperativo, funzionale, object-oriented e concorrente) illustrandone le caratteristiche principali sia a livello di costrutti di programmazione, sia a livello di supporto a tempo di esecuzione.I vari paradigmi verranno presentati seguendo un approccio formale e semantico, introducendo ciascun paradigma per mezzo di calcoli e linguaggi fondazionali, che verranno poi utilizzati per capire e analizzare alcuni linguaggi di programmazione allo stato dell'arte (e.g. OCaml, Haskell, Java, JavaScript). All'analisi semantica e teorica dei linguaggi di programmazione verrà affiancato lo studio delle loro implementazioni. Infine, particolare attenzione verrà data allo studio dei sistemi di tipo e delle semantiche statiche, enfatizzando il ruolo centrale ricoperto da queste ultime nel garantire il corretto funzionamento di programmi.