Linguaggi e Compilatori I e II 2011/2012

(LC1=Linguaggi di Programmazione laurea triennale, LC2=Linguaggi e Compilatori laurea magistrale)
pagina aggiornata il 21-01-2012

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]

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 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 II, in particolare, illustrerà i modelli d'esecuzione dei linguaggi funzionale 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

    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 su Materiale Didattico (non la riporto qui per non dare feedback ai robot cerca e-mail)

    L'esame di Linguaggi e compilatori 1 si compone di:

    L'esame di Linguaggi e compilatori 2 si compone di:

    Progetto:
    Il progetto si svolge a gruppi e, dal momento della consegna del testo, entro il tempo stabilito sopra si richiede di: Per poter rititrare il testo dell'elaborato, preferibilmente il prima possibile e comunque almeno 7gg prima del ritiro:NEW
    1. tutti i membri di un gruppo devono iscriversi (mediante il sito S3) all'appello del progetto
    2. uno dei membri deve inviarmi via mail
      • gli indirizzi e-mail di tutti i membri
      • i numeri di matricola e i nominativi di tutti i membri
      • per ciascun membro, il tipo di esame da sostenere (LC1,2 da 9CFU oppure LC da 12CFU, LP1/2 da 6CFU, Comp da 6CFU)
      • una proposta di appuntamento per il ritiro a cui, preferibilmente ma non necessariamente, tutti i membri si presenteranno per leggere e chiarire il testo, dopodiché scatterà il tempo d'inizio e, di conseguenza, il tempo massimo di consegna.
        Tale proposta non può essere a meno di 7gg dal momento di invio.
    Scritto:
    La prova scritta richiede di: Le prove vanno redatte secondo le seguenti modalità (pena la non validità della prova): Iscrizioni Necessarie!!! Si ricorda che sia per potersi presentare alle prova scritta è necessaria l'iscrizione elettronica (mediante il sito S3) all'appello dello scritto. Mi riserverò la facoltà di non ammettere i non iscritti.
    Orale (se necessario) e Registrazione Voto Esame:
    La prova orale consiste nella discussione di alcuni degli argomenti trattati a lezione e/o dello svolgimento di esercizi.
    Per poter sostenere la prova orale o registrare il voto dell'esame (se la prova orale non fosse necessaria e non si intendesse sostenerla), è necessario aver superato una prova scritta e/o un progetto da meno di un anno.
    Se durante la prova scritta non fosse stata fissata una data per l'orale basta accordarsi via mail.
    Nel caso la prova orale non venga superata o si decida di non accettare il voto, lo scritto rimane valido al fine di sostenere un secondo esame orale.
    Faccio presente che non eseguo la procedura di verbalizzazione dei voti accettati settimanalmente, ma principalmente quando ho completato dei "blocchi", quindi qualora ci fossero urgenze siete pregati di comunicarlo via email.

    N.B. Ogni volta che si consegna per la correzione una prova scritta o un progetto si cancella il voto precedente corrispondente.

    Sia alla prova scritta, quanto quella orale, è ammesso l'uso di qualsiasi materiale didattico (libri, appunti,..., soluzioni di vecchi compiti) purché cartaceo.

    Vecchi corsi

    In base agli esami già sostenuti o da fare individuate in tabella cosa fare. Notare che per

    Comp LP1 LP2  
    da fare da fare da fare svolgere i due esami da 9CFU (poi registrerò i 3 esami da 6CFU preservando la media)
    da fare fatto da fare svolgere un esame di LC2 (con un gruppo) e poi una progetto integrativo (anche individuale)
    oppure aggiungere un progetto più cospicuo e registrare anche un laboratorio avanzato
    da fare fatto fatto svolgere un progetto di Compilatori e relativo orale (come AA2009-10 e AA2010-11)
    fatto fatto da fare svolgere un esame di LC2 + un mini progetto aggiuntivo e registrare LP2+laboratorio avanzato
    oppure svolgere un esame di LC2 ottenendo un aumento del 25% del voto del progetto (come compensazione del lavoro extra)
    oppure svolgere un esame orale sul solo programma di LP2 su appuntamento
       (se ci fosse un cospicuo numero di studenti interessati posso valutare di fare un appello scritto come gli scorsi anni)
    fatto da fare da fare per ogni LPi,
      svolgere un esame di LCi + un mini progetto aggiuntivo e registrare LPi+laboratorio avanzato
      oppure svolgere un esame di LCi ottenendo un aumento del 25% del voto del progetto (come compensazione del lavoro extra)
      oppure svolgere un esame orale sul solo programma di LPi su appuntamento
         (se ci fosse un cospicuo numero di studenti interessati posso valutare di fare un appello scritto come gli scorsi anni)

    NEWvista la sufficiente richiesta sto organizzando un appello scritto straordinario di LP1 6CFU con le vecchie modalità. Per decidere la data ho organizzato un poll su Doodle, andateci quanto prima ed inserite le vostre preferenze, usando il campo 'no' solo quando davvero impossibile (usando '(yes)' in alternativa).

    Testi degli esami passati

    Potete inoltre scaricare in formato elettronico (parte dei) testi dei compiti passati:

    Esami di Linguaggi 1

    1. testo del compito del 27/01/2011 su Materiale Didattico
    2. testo del compito del 22/02/2010 su Materiale Didattico
    3. testo del compito del 01/02/2010 su Materiale Didattico
    4. testo del compito del 07/09/2009
    5. testo del compito del 17/07/2009
    6. testo del compito del 01/07/2009
    7. testo del compito del 26/02/2009
    8. testo del compito del 02/02/2009
    9. testo del compito del 17/09/2008
    10. testo del compito del 11/07/2008
    11. testo del compito del 10/04/2008
    12. testo del compito del 20/12/2007
    13. testo del compito del 05/12/2007
    14. testo del compito del 17/09/2007
    15. testo del compito del 13/07/2007
    16. testo del compito del 13/04/2007
    17. testo del compito del 23/03/2007
    18. testo del compito del 12/01/2007
    19. testo del compito del 18/12/2006
    20. testo esercizio P-Code Pascal del 02/12/2004
    21. testo esercizio P-Code Pascal del 08/09/2004
    22. testo esercizio P-Code Pascal del 06/07/2004
    23. testo esercizio P-Code Pascal del 23/06/2004

    Esami di Linguaggi 2

    1. testo del compito del 15/06/2010 su Materiale Didattico
    2. testo del compito del 22/02/2010 su Materiale Didattico
    3. testo del compito del 07/09/2009
    4. testo del compito del 17/07/2009
    5. testo del compito del 01/07/2009
    6. testo del compito del 17/06/2009
    7. testo del compito del 17/09/2008
    8. testo del compito del 11/07/2008 (con soluzione WAM)
    9. testo del compito del 10/04/2008
    10. testo del compito del 28/03/2008 (con soluzione WAM)
    11. testo del compito del 17/09/2007
    12. testo del compito del 03/09/2007
    13. testo del compito del 13/07/2007
    14. testo del compito del 13/04/2007 (con soluzione WAM)
    15. testo del compito del 23/03/2007 (con soluzione WAM)

    Valid XHTML 1.0 Transitional