elenco    
        corso    

Laboratorio di linguaggi di sistema A

Codice: AA536Crediti: 3Semestre: 1Sigla: LLS 
 
Settore disciplinare: INF/01 - Informatica

Docente

Vincenzo Gervasi   gervasi@di.unipi.it  Stanza 305  Tel. 0502212773

Prerequisiti

Lo studente dovrà avere familiarità con i concetti base della programmazione, come impartiti dai corsi del primo anno. E' utile anche una conoscenza generale dell'architettura dei calcolatori (concetti di CPU, memoria, stack).

Obiettivi di apprendimento

Dopo aver seguito con successo il corso, lo studente sarà in grado di scrivere programmi in linguaggi di basso livello (quali il C) e di gestire nativamente le principali risorse della macchina, avrà un modello mentale del funzionamento di una catena di tool di build (make, preprocessore, compilatore, linker, loader) e dell'esecuzione di un programma compilato. Le conoscenze acquisite nel corso consentiranno di affrontare i corsi di laboratorio più avanzati, con particolare riferimento al corso di LCS.
Conoscenze. Lo studente avrà una conoscenza di medio livello sul funzionamento del compilatore C e dei tool collegati (preprocessore, linker); una conoscenza di buon livello sul linguaggio C e sulle librerie standard, entrambe con riferimento alla versione standard ANSI.
Capacità. Lo studente sarà in grado di scrivere programmi efficienti in C che usino la libreria standard; di gestire correttamente risorse limitate (file, memoria, ecc.); di effettuare il debug, con mezzi di base, di programmi contenenti errori; di progettare la scomposizione in moduli di un'applicazione di media complessità; di controllare un ambiente di build tradizionale (editor/compilatore+make) o avanzato (ambiente di sviluppo integrato).
Comportamenti. Non applicabile.

Descrizione

Il corso presenta il linguaggio di programmazione di sistema C, con particolari approfondimenti nelle aree in cui maggiormente si discosta dai linguaggi di alto livello come Java; oltre due terzi del tempo del corso è dedicato in laboratorio alla scrittura di programmi che esercitano una grande quantità di costrutti e funzioni di libreria per la soluzione un numero rilevante (~50) di problemi di vario tipo.

English Description

The course presents the system-level programming language C, with a particular emphasis on those features which take it apart from high-level programmi languages like Java. More than 2/3 of the time budget is devoted to laboratory work. During these laboratory sessions, a large number of problems (~50) are proposed, and students have an opportunity to apply a huge variety of language constructs and library functions in solving them.

Programma

1. Introduzione e organizzazione del corso, modalità di esame. Linguaggio C: origine, filosofia, ambiti di applicazione, struttura di compilazione (preprocessore, compilatore e linker). Direttive del preprocessore: #define, #include, #if/#else/#endif; varianti #ifdef. Struttura lessicale di un programma C; file sorgente, header locali e di sistema, compilazione separata. Il programma HelloWorld.c. Il programma Echo.c.

2. Tipi di dato semplici del C; dimensioni tipiche dei tipi; qualificatori unsigned, signed e const; uniformità dei tipi integral; conversioni intero-carattere; convenzioni sui booleani. Dichiarazioni di dati semplici; dichiarazioni con inizializzazione; puntatori (operatori * e &) e struttura di memoria. Primi cenni su stringhe, array e aritmetica dei puntatori.

3. Ancora sui puntatori. Aritmetica dei puntatori. Tipi di dato complessi: array, struct, union. Equivalenza fra array e puntatori const. Layout in memoria dei tipi complessi. Esempi di uso di struct e union. Regole di visibilità: ordinamento delle funzioni, prototipi, uso dei file .h per le dichiarazioni di prototipi; qualificatori di visibilità extern e static e loro uso nella compilazione separata. Classi di memorizzazione: concetti di dichiarazione, definizione e inizializzazione; memorizzazione di variabili locali, globali e parametri; qualificatori di memorizzazione auto, extern, static e register.

4. Usi avanzati dei puntatori: passaggio di parametri per riferimento, puntatori a funzione, uso di campi di tipo "puntatore a funzione" per simulare chiamate di metodo con le struct. Gestione a livello di singolo bit della memoria: uso e limitazioni dei bitfield; uso di maschere e operatori logico/aritmetici (&, |, ~, >> e <<).

5. Concetto di libreria, ruolo dei file .a e .h corrispondenti nella compilazione. Libreria stdio.h, prima parte: funzioni per l'I/O a caratteri e a righe (getchar(), putchar(), gets(), puts()); rischi connessi all'uso di gets(); funzioni per l'I/O formattato (printf(), scanf() e specifiche di formato); I/O formattato su stringhe (sprintf(), sscanf()).

6. Funzioni di libreria per l'I/O su file. Il tipo FILE * e i file standard stdin, stdout e stderr. Funzioni fopen() e fclose(); letture e scritture a caratteri (fgetc(), fputc()), a linee (fgets(), fputs()), formattata (fprintf(), fscanf()) e binaria (fread(), fwrite). Funzioni di posizionamento: fseek(), ftell(), rewind(). Bufferizzazione della libreria di IO standard: setbuf(), setbuffer() e setvbuf(); condizioni di svuotamento del buffer e funzione fflush().

7. Altre funzioni di libreria (da string.h). Funzioni su blocchi di memoria: memcpy(), memmove(), memset(), memcmp(), memchr(). Funzioni su stringhe: strcpy(), strcat(), strcmp(), strlen(); rischi legati a overflow dei buffer. Funzioni su stringhe a lunghezza nota: strncpy(), strncat(), strncmp(), strnlen(); rischi legati a stringhe non terminate da \0. Funzioni per l'allocazione di stringhe: strdup(). Funzioni di ricerca: strchr(), strrchr(), strspn(), strcspn(), strpbrk(), strstr(). Funzioni di tokenizzazione: strtok(), strtok_r(); esempi di uso di strtok() e rischi legati all non-rientranza. Funzioni per la decodifica dei codici di errore: strerror(). Funzioni di classificazione (da ctype.h): macro iscategoria(), funzioni tolower() e toupper(). Funzioni di gestione della memoria (da stdlib.h): malloc(), calloc(), realloc() e free(). Importanza del rilascio ordinato delle risorse.

8. Ancora funzioni di libreria. Funzioni di conversione: atof(), atoi(), atol(); conversione di date: asctime(), ctime(), localtime(), mktime(); rappresentazioni del tempo: struct tm e numero di secondi dall'epoch; conversione di date in formato libero: strftime() e strptime(). Funzioni per i numeri casuali: rand() e srand(); cenni sui limiti di tali funzioni e sulle possibili alternative. Funzioni di utilità sugli array: qsort() e bsearch(); uso dei puntatori a funzione e compatibilità degli ordinamenti. Funzioni di

Ore lezione: 10Ore esercitazione: 10Ore laboratorio: 20  

Bibliografia

Il testo di riferimento è disponibile sia in lingua italiana e che in lingua inglese: Poiché il corso è basato sullo standard ANSI per il C, qualunque altro testo sufficientemente approfondito sul linguaggio è altrettanto adeguato.

Modalità di esame

Lo studente dovrà svolgere individualmente un progetto assegnato dal docente; in caso di valutazione sufficiente del progetto, lo studente sosterrà una discussione orale che verterà sul progetto stesso (con correzione completa dell'elaborato) e sul linguaggio C in generale. L'originalità dell'elaborato potrà essere valutata chiedendo allo studente di scrivere un piccolo programma o una funzione in C durante la discussione.

Ulteriore pagina web del corso: http://circe.di.unipi.it/~gervasi/LLS08


home


email