Breve descrizione

 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. Inoltre, all'interno del corso si analizzerà il ruolo dei sistemi di tipi e come i controlli a tempo di compilazione e/o di esecuzione impattino sulla qualità del codice e sui tempi di esecuzione. Infine, per favorire e allenare la capacità degli studenti a ragionare sui concetti in astratto, senza dover sempre ricorrere a un linguaggio di programmazione di riferimento, nella presentazione degli argomenti si prediligerà un approccio model-first, andando a introdurre le peculiarità dei vari paradigmi, quando possibile, prima sui modelli formali e poi sugli specifici linguaggi di programmazione. Tra i linguaggi che saranno trattati in modo più o meno approfondito nel corso (in ordine di prevalenza, alcuni solo per piccoli esempi): OCaml, Java, JavaScript, Python, C++ e altri.

Docente

Chiara Bodei

Orario delle lezioni

L'orario delle lezioni è 

  • Lunedì 9:00-11:00                 FIB D3            
  •  Mercoledì 16:00-18:00         FIB D5            
  • Giovedì 4:00-16:00                FIB D5

Ulteriori dettagli sono disponibili qui

Materiale didattico

Il corso non prevede un testo di riferimento. Le slide e le dispense utilizzate saranno messe a disposizione in questa stessa pagina durante lo svolgimento del corso. Le lezioni saranno registrate, e le registrazioni saranno raggiungibili seguendo il link riportato qui sotto.

Libri di testo consigliati (per approfondimenti)

  • Peter Sestoft, Programming Language Concepts
  • Maurizio Gabrielli e Simone Martini, Linguaggi di programmazione
  •  Real World OCaml ( https://dev.realworldocaml.org/ )

Software utile

Per la parte del corso relativa alla programmazione funzionale si utilizzeranno dei Jupiter Notebook in linguaggio OCaml. Qui sotto sono disponibili i link a tali notebook su github e il link ad un container Docker contenente l'intero ambiente di esecuzione.

Esame

L'esame consisterà in una prova scritta e una prova orale. Non sono previste prove in itinere. Maggiori dettagli saranno forniti durante lo svolgimento del corso.

Programma

Paradigma di programmazione funzionale

  • λ-calcolo
  • Linguaggio OCaml (nucleo funzionale)
  • Formalizzazione di un linguaggio funzionale
  • Implementazione in OCaml di un interprete del linguaggio funzionale
  • Sistemi di tipi nei linguaggi funzionali

Paradigma di programmazione object-oriented

  • Astrazione dei dati e gli oggetti
  • Modularità, incapsulamento, ereditarietà, principio di sostituzione, 
  • Linguaggi class-based vs object-based 
  • Formalizzazione di linguaggi object-oriented
  • Sistemi di tipi nei linguaggi object-oriented
  • Tecniche di implementazione di linguaggi class-based (ad es. Java Virtual Machine)
  • Garbage collection

Paradigma di programmazione concorrente

  • Concetti di base: esecuzione non sequenziale
  • Formalizzazione di un modello di concorrenza
  • Costrutti di programmazione concorrente nei linguaggi moderni