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.
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.
- Lettura da più canali tramite
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.