La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

1 Laboratorio di Programmazione di Sistema - C Susanna Pelagatti Ricevimento: Me 14.00-16.00, 18.00-19.00

Presentazioni simili


Presentazione sul tema: "1 Laboratorio di Programmazione di Sistema - C Susanna Pelagatti Ricevimento: Me 14.00-16.00, 18.00-19.00"— Transcript della presentazione:

1 1 Laboratorio di Programmazione di Sistema - C Susanna Pelagatti susanna@di.unipi.it Ricevimento: Me 14.00-16.00, 18.00-19.00 http://www.di.unipi.it/~susanna/LPS_03/

2 2 Struttura del corso Lezioni in aula (B) + esercitazioni (aula H) –gli studenti sono divisi in due gruppi (A e B) –la lezione del Lunedì (9-11) è per tutti gli studenti –le esercitazioni del Giovedì sono per gruppi 9-11 per il gruppo A 11-13 per il gruppo B

3 3 Struttura del corso (2) Per partecipare alle esercitazioni è necessario iscriversi nella lista –sul sito web troverete l’assegnazione nomi/gruppi LPS è un corso con obbligo di frequenza –è necessario firmare il foglio di presenza ogni volta –solo gli studenti con almeno l’80% delle presenze possono sostenere l’esame –eccezioni : studenti lavoratori, studenti esentati ufficialmente dalla frequenza

4 4 Struttura del corso (3) Esame –progetto in gruppi di 2/3 persone –discussione individuale del progetto Studenti esentati dalla frequenza –progetto individuale

5 5 Programma di massima Introduzione al linguaggio C (18h) Interazione con la shell (2h) Programmazione di sistema in Unix (20h)

6 6 Libri di Testo Testi di riferimento per C e Unix –Glass, Ables, Unix for programmers and users, Prentice Hall 1999 –Kelley, Pohl C: Didattica e programmazione, Addison Wesley 1996 Testo di esempi ed esercizi –Ruggieri, Scozzari, Sperduti Programmazione di Sistema in Linguaggio C SEU

7 7 Il linguaggio C

8 8 Perché il linguaggio C? Larga diffusione nel software applicativo Standard di fatto per lo sviluppo di software di sistema –Visione a basso livello della memoria –Capacità di manipolare singoli bit

9 9 Perché il linguaggio C? (2) Standard di fatto per lo sviluppo di software di sistema (cont.) –possibilità di incapsulare parti di codice assembler che effettuano compiti impossibili da esprimere in linguaggi ad alto livello es. esecuzione di istruzioni ‘speciali’ (TRAP), manipolazione diretta di registri –Compilazione estremamente efficiente –Occupazione di memoria ridotta

10 10 C : caratteristiche fondamentali Paradigma imperativo –costrutti di controllo simili a Java ( while-do, for, if (..) else, switch ) –tipi base molto simili a Java ( int, double etc…) Ma … NON è un linguaggio ad oggetti –NON supporta la nozione di oggetti, classi o meccanismi di ereditarietà –la principale forma di strutturazione sono le funzioni un programma C è una collezione di funzioni di cui una di nome main le funzioni possono risiedere in uno o più file

11 11 C : caratteristiche fondamentali (2) Memoria e puntatori –in C è possibile conoscere e denotare l’indirizzo della cella di memoria in cui è memorizzata una variabile (il puntatore) es : int a = 50; /* una var intera */ int * b; /* una var puntatore a interi */... b = &a; /* assegna a b l’indirizzo della cella in cui è memorizzata a */

12 12 C : caratteristiche fondamentali (3) Memoria e puntatori –in C è possibile conoscere e denotare l’indirizzo della cella di memoria in cui è memorizzata una variabile (il puntatore) es : int a = 50; int *b; … b = &a; 50 350 a è memorizzata nella cella 350... 450

13 13 C : caratteristiche fondamentali (4) Memoria e puntatori –in C è possibile conoscere e denotare l’indirizzo della cella di memoria in cui è memorizzata una variabile (il puntatore) es : int a = 50; int *b; … b = &a; 50 350 b è memorizzata nella cella 450... 450

14 14 C : caratteristiche fondamentali (5) Memoria e puntatori –in C è possibile conoscere e denotare l’indirizzo della cella di memoria in cui è memorizzata una variabile (il puntatore) es : int a = 50; int *b; … b = &a; 50 350 Dopo questo assegnamento in b è memorizzato l’indirizzo di a 350 450

15 15 C : caratteristiche fondamentali (6) Memoria e puntatori –è possibile conoscere e/o modificare il contenuto di una variabile manipolando direttemente il suo puntatore (operatore di dereferenziazione ‘ * ’) es : int a = 50; int *b = &a; … *b = *b + 4; 54 350 Dopo questo assegnamento in a è memorizzato il valore 50 + 4 350 450

16 16 C : un primo programma Il più semplice programma C è costituito da –una singola funzione ( main ) –memorizzata in un singolo file

17 17 C : un primo programma (2) /* Programma che calcola il massimo fra tre numeri inseriti da tastiera */ #include #define N 4 int main (void){ int i, tmp, max=0; printf(“Inserisci %d interi positivi\n”,N); for (i = 0; i < N; i++) { scanf(“ %d”, &tmp); max = (max < tmp)? max : tmp ; } printf(“Il massimo è %d \n”,max); return 0; }

18 18 C : un primo programma (3) /* Programma che calcola il massimo fra tre numeri inseriti da tastiera */ #include #define N 4 int main (void){ int i, tmp, max=0; printf(“Inserisci %d interi positivi\n”,N); for (i = 0; i < N; i++) { scanf(“ %d”, &tmp); max = (max < tmp)? max : tmp ; } printf(“Il massimo è %d \n”,max); return 0; } Commenti

19 19 Commenti I commenti possono essere inseriti con –/* qua un commento anche su più linee */ –// commento su singola linea

20 20 C : un primo programma (4) #include #define N 3 int main (void){ int i, tmp, max=0; printf(“Inserisci %d interi positivi\n”,N); for (i = 0; i < N; i++) { scanf(“ %d”, &tmp); max = (max > tmp)? max : tmp ; } printf(“Il massimo è %d \n”,max); return 0; } Inclusione delle informazioni necessarie per utilizzare le funzioni nelle librerie standard di I/O del C

21 21 C : un primo programma (5) #include #define N 3 int main (void){ int i, tmp, max=0; printf(“Inserisci %d interi positivi\n”,N); for (i = 0; i < N; i++) { scanf(“ %d”, &tmp); max = (max > tmp)? max : tmp ; } printf(“Il massimo è %d \n”,max); return 0; } Inclusione delle informazioni necessarie per utilizzare le funzioni nelle librerie standard di I/O del C Funzioni per leggere da tastiera, visualizzare dati

22 22 C : un primo programma (6) #include #define N 3 int main (void){ int i, tmp, max=0; printf(“Inserisci %d interi positivi\n”,N); for (i = 0; i < N; i++) { scanf(“%d”, &tmp); max = (max > tmp)? max : tmp ; } printf(“Il massimo è %d \n”,max); return 0; } Definizione di MACRO (costante simbolica) - N è il nome simbolico per la sequenza di caratteri “3” - Ogni occorrenza di N viene sostituita da “3” prima di iniziare la compilazione

23 23 C : un primo programma (7) #include #define N 3 int main (void){ int i, tmp, max=0; printf(“Inserisci %d interi positivi\n”,N); for (i = 0; i < N; i++) { scanf(“%d”, &tmp); max = (max > tmp)? max : tmp ; } printf(“Il massimo è %d \n”,max); return 0; } Intestazione della funzione, fornisce : - il tipo del valore prodotto dalla funzione ( int ) - descrizione degli argomenti (in questo caso nessuno ( void ))

24 24 C : un primo programma (8) #include #define N 3 int main (void){ int i, tmp, max=0; printf(“Inserisci %d interi positivi\n”,N); for (i = 0; i < N; i++) { scanf(“%d”, &tmp); max = (max > tmp)? max : tmp ; } printf(“Il massimo è %d \n”,max); return 0; } Dichiarazione di variabili locali alla funzione (il loro spazio di memoria viene allocato all’inizio della esecuzione della funzione e deallocato alla fine)

25 25 C : un primo programma (9) #include #define N 3 int main (void){ int i, tmp, max=0; printf(“Inserisci %d interi positivi\n”,N); for (i = 0; i < N; i++) { scanf(“%d”, &tmp); max = (max > tmp)? max : tmp ; } printf(“Il massimo è %d \n”,max); return 0; } Invocazione della funzione di libreria che scrive su video

26 26 C : un primo programma (10) #include #define N 3 int main (void){ int i, tmp, max=0; printf(“Inserisci %d interi positivi\n”,N); for (i = 0; i < N; i++) { scanf(“%d”, &tmp); max = (max > tmp)? max : tmp ; } printf(“Il massimo è %d \n”,max); return 0; } Stringa di formattazione Placeholder (segnaposto) per un valore intero (%d)

27 27 C : un primo programma (11) #include #define N 3 int main (void){ int i, tmp, max=0; printf(“Inserisci %d interi positivi\n”,N); for (i = 0; i < N; i++) { scanf(“%d”, &tmp); max = (max > tmp)? max : tmp ; } printf(“Il massimo è %d \n”,max); return 0; } Il segnaposto viene rimpiazzato con il valore dei parametri (in ordine)

28 28 C : un primo programma (12) #include #define N 3 int main (void){ int i, tmp, max=0; printf(“Inserisci %d interi positivi\n”,N); for (i = 0; i < N; i++) { scanf(“%d”, &tmp); max = (max > tmp)? max : tmp ; } printf(“Il massimo è %d \n”,max); return 0; } Invocazione della funzione di libreria che legge da tastiera

29 29 C : un primo programma (13) #include #define N 3 int main (void){ int i, tmp, max=0; printf(“Inserisci %d interi positivi\n”,N); for (i = 0; i < N; i++) { scanf(“%d”, &tmp); max = (max > tmp)? max : tmp ; } printf(“Il massimo è %d \n”,max); return 0; } Indirizzo ( & ) della variabile ( tmp ) in cui deve essere inserito il valore intero ( %d ) letto da tastiera.

30 30 C : un primo programma (14) #include #define N 3 int main (void){ int i, tmp, max=0; printf(“Inserisci %d interi positivi\n”,N); for (i = 0; i < N; i++) { scanf(“%d”, &tmp); max = (max > tmp)? max : tmp ; } printf(“Il massimo è %d \n”,max); return 0; } Espressione condizionale

31 31 C : un primo programma (15) #include #define N 3 int main (void){ int i, tmp, max=0; printf(“Inserisci %d interi positivi\n”,N); for (i = 0; i < N; i++) { scanf(“%d”, &tmp); max = (max > tmp)? max : tmp ; } printf(“Il massimo è %d \n”,max); return 0; } Comando return : termina l’esecuzione della funzione e restituisce il valore delle espressione specificata Per convenzione se tutto è andato bene il main restituisce 0.

32 32 Come si esegue un programma C? Prima di essere eseguito dal processore il programma deve essere –1. pre-processato –2. compilato –3. collegato (linking) –4. caricato in memoria (loading) Vediamo come funzionano le fasi 1,2,4 –il linking verrà discusso più avanti

33 33 Pre-processing e compilazione Il programma deve essere editato e salvato in un file con estensione ‘.c’ –es. posso salvare il programma esempio nel file prova.c Non c’è alcun rapporto fra il nome del file ed il nome delle funzioni in esso contenute (!= Java)

34 34 Pre-processing e compilazione (2) Il compilatore può essere invocato con il comando gcc -Wall -pedantic -g prova.c -o nomees –-Wall -pedantic opzioni che aumentano il numero di controlli e di messaggi di ‘avvertimento’ visualizzati –-g opzione che include anche le informazioni necessarie al debugger –prova.c nome del file da compilare/preprocessare –-o nomees opzione che permette di decidere il nome del file eseguibile ( nomees ). Altrimenti il file eseguibile si chiama di default a.out

35 35 Pre-processing e compilazione (3) Preprocessing –#include –#include “file” queste linee vengono rimpiazzate dal contenuto dei file specificati ( viene cercato tra gli header standard, su Linux /usr/include; “file” viene cercato a partire dalla directory corrente ) –#define nome testo rimpiazza ogni occorrenza di nome con il testo specificato è possibile specificare del testo parametrico

36 36 Pre-processing e compilazione (4) Compilazione –trasforma il file preprocessato (senza più #include o #define ) in un file eseguibile che contiene alcune informazioni di carattere generale rappresentazione binaria di (parte dei) dati del programma (variabili globali) codice assembler eseguibile dal processore target (testo) –per capire come avviene questa traduzione, dobbiamo specificare come un programma vede la memoria durante la sua esecuzione (spazio di indirizzamento) –un programma in esecuzione viene comunemente detto processo

37 37 Spazio di indirizzamento Text Data Stack Area vuota Traduzione in assembler delle funzioni che compongono il programma 0 2 32 - 1 Variabili globali a tutte le funzioni Pila di FRAME, uno per ogni chiamata di funzione da cui non abbiamo ancora fatto ritorno

38 38 Spazio di indirizzamento (2) Text Data Stack Area vuota 0 2 32 - 1 Contenuti tipici di un FRAME : - variabili locali della funzione - indirizzo di ritorno (indirizzo dell’istruzione successiva a quella che ha effettuato la chiamata alla funzione) - copia dei parametri di chiamata Direzione di crescita dello stack

39 39 Spazio di indirizzamento (3) Spazio di indirizzamento Text Data Stack Area vuota 0 2 32 - 1 All’inizio dell’esecuzione lo Stack contiene solo il FRAME per la funzione main Successivamente : * ogni volta che viene chiamata una nuova funzione viene inserito un nuovo frame nello stack * ogni volta che una funzione termina ( es. return 0 ) viene eliminato il frame in cima dello stack e l’esecuzione viene continuata a partire dall’indirizzo di ritorno

40 40 Spazio di indirizzamento (4) Text Data Stack Area vuota 0 2 32 - 1 Direzione di crescita dello heap Spazio di memoria dedicato ai dati globali a tutte le funzioni. Diviso in statico per i dati la cui dimensione è nota a tempo di compilazione e dinamico (heap) heap

41 41 Compilazione : un esempio int main (void){ int i, tmp, max=0; printf(“Inserisci %d interi positivi\n”,N); for (i = 0; i < N; i++) { scanf(“%d”, &tmp); max = (max < tmp)? max : tmp ; } printf(“Il massimo è %d \n”,max); return 0; } Ogni variabile corrisponde ad una o più parole/celle di memoria &i &max &tmp 32 bit

42 42 Compilazione : un esempio (2) int main (void){ int i, tmp, max=0; printf(“Inserisci %d interi positivi\n”,N); for (i = 0; i < N; i++) { scanf(“%d”, &tmp); max = (max < tmp)? max : tmp ; } printf(“Il massimo è %d \n”,max); return 0; } Ogni statement viene tradotto in - istruzioni assembler che lavorano sulle celle rilevanti - CALL di altre funzioni (es. printf) &i &max &tmp

43 43 Formato del file eseguibile La compilazione produce un file eseguibile (es. a.out ) Il formato di un eseguibile dipende dal sistema operativo In Linux un eseguibile ha il formato ELF (Executable and Linking Format)

44 44 Formato del file eseguibile (2) –Formato di un eseguibile ELF Text segment I-Data segment Ampiezza BSS Altre info Magic number File a.out Variabili globali inizializzate Ampiezza area di memoria occupata dalle variabili globali NON inizializzate Numero che contraddistingue il file come eseguibile Codice del programma (assemblato)

45 45 Formato del file eseguibile (3) –L’eseguibile contiene tutte le informazioni per creare la configurazione iniziale dello spazio di indirizzamento (loading) Text I-Data segment Stack Area vuota 0 2 32 - 1 BSS-segment Text segment I-Data segment Ampiezza BSS Altre info Magic number File a.out Data FRAME per la funzione main


Scaricare ppt "1 Laboratorio di Programmazione di Sistema - C Susanna Pelagatti Ricevimento: Me 14.00-16.00, 18.00-19.00"

Presentazioni simili


Annunci Google