Linguaggi e Compilatori I e II 2016/2017

(LC1=Linguaggi di Programmazione laurea triennale, LC2=Linguaggi e Compilatori laurea magistrale)

pagina aggiornata il 23-09-2016 Valid XHTML 1.0 Transitional

VERSIONE PRELIMINARE

There are two ways of constructing a software design: one way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.

[C. A. R. Hoare]

 

Nota sui contatti via email: vi prego di non mandare email doppie/triple a tutti gli indirizzi email a mia disposizione, son tutti alias e le email arrivano nella stessa casella. Fate invece attenzione a non mandare email al Prof. Gianni Comini. Potete recuperare l'email "master" dal cercapersone o nel sito di eLearning (non la riporto qui per non dare feedback ai robot cerca e-mail)

Indice

  • Finalità del corso
  • Programma
  • Bibliografia
  • Esercizi di programmazione
  • Modalità d'Esame
  • Implementazioni Free
  • Finalità del corso

    I corsi di Linguaggi e Compilatori I e II, intendono fornire una conoscenza delle caratteristiche dei vari paradigmi di programmazione, cercando il più possibile di evitare di concentrarsi su uno specifico linguaggio, andando bensì a presentare i principi che guidano la progettazione, realizzazione e implementazione dei moderni linguaggi di programmazione. Con solida conoscenza delle caratteristiche “universali” si potranno così in futuro imparare nuovi linguaggi in pochissimo tempo.

    A questa visione generale si giunge attraverso la descrizione dei principali paradigmi di programmazione:

    Questi paradigmi, oltre a essere esaminati nei loro aspetti pragmatici più immediati, sono analizzati e confrontati sulla base dei principi generali, in modo tale da permettere una comprensione critica della maggior parte dei linguaggi di uso comune. In questo modo si intende sviluppare uno spirito critico che permetta di arrivare ad una programmazione consapevole in cui saper scegliere il paradigma più adatto a seconda del problema da risolvere e sapere quali costrutti di un linguaggio usare, e (soprattutto) a quale costo.

    I due corsi inoltre intendono fornire una conoscenza relativamente approfondita (soprattutto dell'aspetto programmativo) dei paradigmi di programmazione dichiarativa (funzionale, logico e logico-funzionale) che, grazie alla loro espressività, si prestano naturalmente quale base di sviluppo di software corretto. Si mostrerà come caratteristiche quali high-order e non-determinismo possano essere sfruttate per scrivere codice compatto, elegante e flessibile (riutilizzabile).

    Il corso di Linguaggi e compilatori I, in particolare, tratterà innanzitutto i concetti generali, fornendo una conoscenza “language independent” delle caratteristiche di tutti i paradigmi. Si vedranno poi il paradigma imperativo e i meccanismi di supporto a “run-time” dei linguaggi imperativi. Dopodiché si illustreranno le caratteristiche del paradigma funzionale (specialmente l'high-order programming).

    Il corso di Linguaggi e compilatori II, in particolare, illustrerà i modelli d'esecuzione dei linguaggi funzionali e poi completerà la presentazione dei paradigmi dichiarativi: logico e logico-funzionale (specialmente il non-deterministic high-order programming).

    Programma

    Linguaggi e Compilatori 1

    Linguaggi e Compilatori 2

    Bibliografia (Libri e Testi di consultazione)

    Esercizi di Programmazione

    Per chi volesse esercitarsi a programmare in uno dei paradigmi visti a lezione ho scritto alcuni esercizi a difficoltà (più o meno) crescente. Vi consiglio fortemente di non scriverli solo su carta ma provare ad eseguirli (ci sono ottime implementazioni freeware disponibili sia di Prolog che di Haskell). Quando poi siete ragionevolmente sicuri di aver fatto un programma funzionante secondo la specifica (che implica averlo provato a calcolatore), se volete avere i miei commenti su quanto avete fatto (e, se siete a buon punto, avere le mie soluzioni) mandatemi via mail quanto avete fatto oppure (anche meglio) portatemi tutto a ricevimento. Didatticamente reputo controproducente mettervi on-line le mie soluzioni perché altrimenti restereste influenzati dalla mia soluzione prima di metabolizzarne una vostra. Inoltre vi sconsiglio di fare tutti gli esercizi e mandarmi tutto in blocco alla fine: meglio fare 2/3 esercizi e poi, prima di affrontare quelli più complessi, verificare quanto appreso per poi trarre profitto dall'esperienza fatta nell'affrontare i nuovi esercizi ed evitare di ripetere gli stessi errori.

    Implementazioni free

      Mac OS X Linux Windows
    Haskell

    ghc (anche via macports, fink)

    hugs (anche via macports, fink)

    ghc

    hugs

    ghc

    hugs

    Prolog

    gprolog (anche via macports, fink)

    swi-prolog (anche via macports, fink)

    yap (anche via macports, fink)

    gprolog

    swi-prolog

    yap

    gprolog

    swi-prolog

    yap

    Curry

    AquaCurry (con integrato MCC)

    PAKCS (serve anche swi-prolog o sicstus)

    MCC

    PAKCS (serve anche swi-prolog o sicstus)

    MCC

    PAKCS (serve anche swi-prolog o sicstus)

    Modalità d'esame corsi attuali

    Si veda nel sito di eLearning.

    Modalità d'esame corsi anni accademici precedenti

    Con le stesse modalità che erano previste quando si é seguito il corso

    Testi degli esami passati

    Potete inoltre scaricare in formato elettronico (parte dei) testi dei compiti passati nel sito di eLearning.