Programmazione
Introduzione
Il corso di programmazione è un corso di 12 crediti finalizzato all'insegnamento della programmazione. Trattandosi di un corso di base, non richiede alcuna conoscenza specifica pregressa; obiettivo del corso è formare gli studenti alla programmazione in senso tradizionale, mediante l'uso di un linguaggio imperativo; il linguaggio insegnato nel corso sarà Go.
Il corso si compone di due moduli, svolti in parallelo: teoria e laboratorio. Questa pagina descrive solo il modulo di programmazione (teoria), che viene svolto da tre docenti in parallelo, mentre il laboratorio di programmazione è tenuto da sei diversi docenti in parallelo. Per informazioni/chiarimenti, dopo avere letto alcune indicazioni di base potete scrivere al docente (Sebastiano Vigna).
Orario
Gli studenti sono divisi in turni di laboratorio sulla base del corso di laurea e delle prime lettere del cognome. La divisione, l'orario e aule delle lezioni di teoria e dei laboratori sono disponibili qui.
Telegram
Per comunicazioni urgenti verrà utilizzato un canale Telegram.
Libri di testo consigliati
I testo consigliati per il corso sono:
- Ivo Balbaert: The Way to Go: A Thorough Introduction to the Go Programming Language.
- Ivo Balbaert: Programmare in Go.
- Alan A. Donovan, Brian W. Kernighan: The Go Programming Language, Addison-Wesley.
Per la prima parte si farà riferimento a
- [FAP] "Dispense per la prima parte del corso di Fondamenti di Architetture e Programmazione" di Paolo Boldi.
Letture avanzate
- Peter Norvig. Teach Yourself Programming in Ten Years. [Peter Norvig è stato Director of Research a Google.]
- Edsger W. Dijkstra. Why numbering should start at zero (EWD831), 1982.
- Brian W. Kernighan e Bob Pike. Programmazione nella pratica. Addison-Wesley, 1999. ISBN 8871920724. Versione inglese: The Practice of Programming. Addison-Wesley, 1999. ISBN 020161586X. [Uno splendido volumetto su come si programma in generale.]
- La vera storia di UTF-8.
- Andreas Zeller. Why Programs Fail: A Guide to Systematic Debugging. Morgan Kaufmann, 2006. ISBN 1558608664. [Molto avanzato—tratta solo di testing e debugging.]
- Henry S. Warren, Jr. Hacker's Delight (second edition). Addison-Wesley [La bibbia della manipolazione dei bit.]
- Donald E. Knuth. The Art of Computer Programming, Volume 4, Fascicle 1. Addison-Wesley, 2009. [Il capitolo "Bitwise Tricks & Techniques" contiene tutto lo scibile sulla manipolazione dei bit in forma molto densa.]
- HAKMEM. [Il celebre rapporto interno del MIT contenente tecniche avanzate di programmazione (1972), e in particolare la sezione “Programming Hacks” a pagina 72, che è disponibile anche in una versione C più leggibile. Se riuscite a capire come funziona 175 (“Gosper's trick”) i bit non hanno più segreti per voi.]
Visualizzazione interattiva
Conferenze e podcast
- Go Time, un podcast sul Go (in inglese).
- Una conferenza dell'ACM Learning Center sulla programmazione concorrente in Go (in inglese).
Esempi
- Generazione di una smazzata aleatoria; versione alternativa con switch.
- Programma che emette su standard output il fiocco di neve di Koch, disegnato ricorsivamente, come immagine PNG..
- Un motore di ricerca sui documenti, uno per riga, forniti da standard input (potete utilizzare questa lista di proverbi tramite redirezione); la parola chiave di ricerca è l'unico argomento sulla riga di comando.
- Web server che serve il fiocco di neve di Koch, disegnato ricorsivamente.
- Un'implementazione dell'integrazione Monte–Carlo che utilizza argomenti di tipo funzionale.
- Un'enumerazione dei numeri di Fibonacci ottenuta tramite chiusura.
- L'insieme dei sorgenti dell'esempio con le espressioni regolari.
- Mastermind, e soprattutto Mastermind giocato dal computer.
Esempi di programmazione concorrente (fuori programma)
- Somma di due metà di una fetta tramite goroutine concorrenti.
- Lettura di un canale fino alla chiusura tramite
range
; il numero di interi immesso nel canale va specificato come argomento sulla riga di comando. - Lettura non bloccante da un canale.
- Lettura da più canali tramite
select
contando i messaggi; il numero di interi emesso dalle due goroutine concorrenti va specificato come argomento sulla riga di comando. - Lettura da più canali tramite
select
fino a che i canali non sono chiusi; il numero di interi emesso dalle due goroutine concorrenti va specificato come argomento sulla riga di comando. - Passaggio tramite canale di una chiusura lessicale.
- Esempio di utilizzo di un semaforo per la mutua esclusione.
Contenuti del corso
Il programma di massima del corso è il seguente (TWG=The Way to Go):
- Introduzione al corso. Architettura del calcolatore. Che cos'è l'informatica. Linguaggi di programmazione (macchina, assembly, alto livello). Il calcolatore come macchina programmabile.
- La macchina di von Neumann. Informazione (bit, byte,...). Caricamento in RAM del programma, fetch-decode-execute. Architettura della CPU: ALU e CU. Un esempio di CPU con relativo linguaggio assembly.
- Ciclo di vita del software. Strumenti per la programmazione. Storia di go. Il primo programma in go [TWG4]. Il go tool. Compilazione. Esecuzione. Formattazione. Documentazione. [TWG3]
- Discussione degli aspetti lessicali e sintattici. Commenti [TWG4]. Struttura generale di un programma go: programma, pacchetti, sorgenti. La libreria standard. [TWG4]
- Variabili: nome, tipo, valore, visibilità (scope). Tipi. Classificazione dei tipi (tipi di base, tipi composti, interfacce). Dichiarazione, assegnamenti e assegnamenti multipli, short-assignment. [TWG4]
- I/O di base: fmt.Println, fmt.Print, fmt.Scan. Tipi di base numerici (int, float64). Espressioni numeriche. Conversioni. Variabili inutilizzate e blank variable. [TWG4]
- Selezione binaria (if). Il tipo bool e gli operatori booleani. Esercizi. [TWG5]
- Ancora sull'if: variabili locali all'if (locali ai blocchi; locali al costrutto). Esempi.
- Il ciclo (for): versione unaria, ternaria, zeraria. Esercizi. [TWG5]
- I caratteri (ASCII, Unicode, UTF-8). Tipo rune. Tipo string: differenze fra raw e UTF-8. Funzione len. Quarta forma del ciclo for (range). [TWG4]
- Funzioni: parametri, segnatura argomenti. Passaggio per valore. Valori restituiti. Valori restituiti con nome. [TWG6]
- Esercizi con i cicli semplici e funzioni. Istruzioni break e continue. [TWG5]
- Esercizi con i cicli annidati.
- Rappresentazione dell'informazione. Notazione posizionale. Rappresentazione degli interi negativi. Range di rappresentazione, overflow. Tipi interi a lunghezza fissa. Cenni alla rappresentazione dei reali: virgola fissa e mobile (standard IEEE 754). Cenni al tipo complex. [Dispense, TWG4, TWG5]
- Selezione multiaria (switch). [TWG5]
- Esercizi. Pacchetto strconv e pacchetto strings. [TWG]
- Puntatori: operatori * e &. La funzione new. [TWG4]
- Type: alias e definizioni. Struct. Esercizi con puntatori e struct.
- Array e slice. Inizializzatori. Applicazione dei for range. Funzione append. [TWG7]
- Esercizi. Subslicing. fmt.Printf. Argomenti da riga di comando.
- Generazione numeri pseudocasuali. Pacchetto math. Esercizi.
- Mappe. Applicazione dei for range. Conversione di string a []rune. Esercizi. [TWG8]
- Ricorsione. Stack di esecuzione. [TWG6]
- Esercizi sulla ricorsione.
- Metodi. Interfacce (cenni). Esempi: Stringer, Reader, Writer. [TWG10, TWG11 (cenni)]
- Grafica con il pacchetto github.com/holizz/terrapin. Esempio semplice. Frattali e curva di Koch. Un motore di ricerca.
- Tipi funzione e chiusure (cenni). Esempi dalle librerie (ordinamento, shuffling, ricerca in stringhe). L'esempio dell'integrazione numerica (metodo Monte–Carlo). [TWG6]
- Ordinamento e ricerca tramite funzioni di libreria. I/O di base. [TWG6, TWG12, TWG13]
- I/O avanzato. File,
panic
,defer
erecover
. [TWG6, TWG12, TWG13] - Pacchetti e struttura. Visibilità. Documentare un pacchetto.
- Esercitazione: lettura di un file di testo con formato prestabilito, espressioni regolari, gestione degli errori di I/O e di parsing.
- Testing unitario e funzionale. (E2E) [TWG13]
- Il linguaggio C. Il gcc. Differenze sintattiche: punto-e-virgola, parentesi nelle strutture di controllo, dichiarazioni di variabili, tipi e funzioni. Differenze nelle strutture di controllo del flusso (switch, while, do-while). Uso di istruzioni semplici nelle strutture di controllo. Inclusione vs. importazione.
- Assenza di stringhe, slice, mappe. Uso dei char[] per le stringhe. Tipi elementari e dipendenza dal compilatore; uso di tipi specifici (stdint.h, bool.h). Cast impliciti. Definizione di macro. Funzioni di libreria. Parametri da riga di comando.
- Puntatori, aritmetica dei puntatori. Gestione della memoria: malloc, free.
- Goroutine e canali.
Modalità d'esame
Le modalità d'esame qui indicate sono da ritenersi al momento provvisorie.
- Struttura degli appelli. Ogni appello prevede:
- Una prova di programmazione individuale in laboratorio; la prova contiene un esercizio di filtro: gli studenti che non superano il filtro non saranno ulteriormente valutati; la data della prova è la data ufficiale dell'appello sul SIFA.
- Una prova orale in cui lo studente scrive e discute un breve frammento di codice su
repl.it
, che poi fa da spunto per domande ulteriori sul programma. Gli orali avvengono qualche giorno dopo la prova di laboratorio, per dare tempo ai docenti di correggere gli elaborati.
- Le varie parti da cui l'esame è composto vanno necessariamente sostenute nello stesso appello, e in particolare chi pur avendone la possibilità decide di non presentarsi all'orale dovrà sostenere nuovamente l'esame.
- Iscrizione agli appelli: gli studenti che vogliano sostenere l'esame a un dato appello devono iscriversi al SIFA (tramite il @SIFA online, o recandosi presso gli appositi chioschi). Fate attenzione a iscrivervi all'edizione corretta per il vostro cognome.
Ricevimento studenti
Il docente riceve nel suo studio di via Celoria 18 (quinto piano, stanza 5014) su appuntamento. Un appuntamento può essere fissato a lezione, oppure inviando un'email al docente e attendendo una risposta di conferma.