Linguaggi di Programmazione I e II 2009/2010

pagina aggiornata il 16-06-2010

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

Finalità del corso

I corsi di Linguaggi 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 1

Linguaggi 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

L'esame di Linguaggi 1 o 2 si compone di una prova scritta ed (eventualmente) di una prova orale (soprattutto per discriminare le situazioni "di confine" o, in ogni caso, "sospette" e/o dare la possibilità di alzare il voto rispetto allo scritto).

Iscrizioni Necessarie!!!
Si ricorda che sia per potersi presentare alle prova scritta che a quella orale è necessaria l'iscrizione elettronica (mediante il sito S3). Mi riserverò la facoltà di non ammettere allo scritto i non iscritti.
Prova Scritta:
La prova scritta richiede di:
  • svolgere degli esercizi analoghi a quelli presentati nelle esercitazioni e a quelli dati per casa (inclusi quelli qui)
  • rispondere ad alcune domande sugli argomenti trattati nelle lezioni.
Ogni volta che si consegna per la correzione una prova scritta si cancella il voto precedente.
Le prove vanno redatte secondo le seguenti modalità (pena la non validità della prova):
  • entrambe i fogli con il testo devono essere consegnati con scritte le proprie generalità, scritte nell'apposito spazio e non dove capita!
  • la soluzione della parte relativa a P-CODE o WAM deve essere fisicamente separata dalle altre soluzioni!
  • le soluzioni devono essere motivate/giustificate in modo preferibilmente sintetico ma comunque necessariamente completo (in particolare quanto presente nelle bozze delle soluzioni messe on-line sicuramente non basta)
  • riguardo agli esercizi di programmazione
    • non sono ammessi short-cuts del tipo "idem come sopra" (la necessità di simili artifici tra l'altro dovrebbe suggerire che forse la soluzione è fatta male)
    • i tipi delle funzioni vanno scritti vicino alle funzioni a cui si riferiscono
    • bisogna rispettare il case (maiuscolo/minuscolo) previsto dalle sintassi dei rispettivi linguaggi e quindi non è ammesso scrivere in stampatello tutto maiuscolo o minuscolo (che non permetterebbe di distinguere il case)
    • non è ammesso mescolare le sintassi dei vari linguaggi
Prova Orale (se necessaria) e Registrazione Voto Esame:
La prova orale consiste nella discussione di alcuni degli argomenti trattati a lezione.
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 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.
La registrazione viene eseguita on-line quindi qualora (potendo) si volesse registrare il voto proposto ricevuto via Sindy basta accettarlo, da Sindy stesso, e a quel punto verrà automaticamente registrato.

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

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 22/02/2010 su Materiale Diddattico
  2. testo del compito del 01/02/2010 su Materiale Diddattico
  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 26/02/2009
  7. testo del compito del 02/02/2009
  8. testo del compito del 17/09/2008
  9. testo del compito del 11/07/2008
  10. testo del compito del 10/04/2008
  11. testo del compito del 20/12/2007
  12. testo del compito del 05/12/2007
  13. testo del compito del 17/09/2007
  14. testo del compito del 13/07/2007
  15. testo del compito del 13/04/2007
  16. testo del compito del 23/03/2007
  17. testo del compito del 12/01/2007
  18. testo del compito del 18/12/2006
  19. testo esercizio P-Code Pascal del 02/12/2004
  20. testo esercizio P-Code Pascal del 08/09/2004
  21. testo esercizio P-Code Pascal del 06/07/2004
  22. testo esercizio P-Code Pascal del 23/06/2004

Esami di Linguaggi 2

  1. testo del compito del 15/06/2010 su Materiale DiddatticoNEW
  2. testo del compito del 22/02/2010 su Materiale Diddattico
  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)