laboratorio di linguaggi marco tarini università dellinsubria facoltà di scienze matematiche,...

47
Laboratorio di Linguaggi Marco Tarini Università dell’Insubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica Anno Accademico 2004/05

Upload: stefania-proietti

Post on 01-May-2015

219 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

Laboratorio di Linguaggi

Marco Tarini

Università dell’Insubria

Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese

Corso di Laurea in Informatica

Anno Accademico 2004/05

Page 2: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Laboratorio di Linguaggi

• docente: Marco Tarini e-mail: [email protected]

• ricevimento: Martedì 14:30 - 17:30o anche su appuntamento

• libro di testo consigliato:Kelley Al, Pohl Ira:"C Didattica e Programmazione" ("A Book on C")quarta edizione - anche la terza va bene

Page 3: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Laboratorio di Linguaggi

• link utile: http://vcg.isti.cnr.it/~tarini/linguaggi/

– guida essensiale di alcuni emementi di C

v = argomanto già trattato

Page 4: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Linguaggio C: cenni storici

• 1972: nasce il C, – by Brian Kernighan & Dennis M.Richie, AT&T Bell Labs– scopo: poter riscrivere in un linguaggio a più alto livello il

codice del sistema operativo UNIX– evoluzione del B

• Anni 80: si sviluppa il C tradizionale

• 1983: comincia la definizione dello standard ANSI C, – (ANSI = American National Standards Institute)

• 1990: nascita ufficiale dello "ANSI C" – (o "ANSI ISO/C")

Page 5: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Caratteristiche del Linguaggio C

• Linguaggio imperativo – con numerosi tipi di dato e strutture di controllo

• "Medio" livello– cioè più basso di Java!– gestione memoria diretta– gestione files diretta– puntatori…

• Focalizzato su efficienza e compattezza di codice• Linguaggio scarno, ma estendibile

– esistono molte librerie per operazioni non definite dal linguaggio…

• Possibile sviluppare progetti modulari– composti da più files sorgente (source files) compilabili

separatamente– molto utile per progetti complessi

Page 6: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Caratteristiche del Linguaggio C

• Il C è un linguaggio tipizzato– cioè: il tipo di ogni espressione è del tutto

noto al momento della compilazione

x = y + z ;

int int

int

Page 7: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Caratteristiche del Linguaggio C

• Il C usa il Binding statico!

int a=5;

void proc(){ printf("%d",a);}

void main(){ int a=10; proc(); }

viene definita la variabile globale intera "a", (che vale 5)

viene definita un altra variabile locale intera "a", (che vale 10)

viene definita la procedura "proc" che…

…scrive il valore di a

viene invocata la procedura "proc"

bindind statico:il programma scrive "5"

se bindind fossedinamico,il programma scriverebbe "10" !

Page 8: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

C e Java a confronto...

• i costrutti sono simili

int x=1, i;

for (i=1; i<=10; i=i+1) { x = x * i;}

int log2=0, x=100;

while (x>1) { x = x / 2; log2++;}

...if (x<0) x=-x;...

è più elegante dell’

l’equivalente

i++

i=i+1

ma

Page 9: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

C e Java a confronto...

• ma scordatevi...– la programmazione ad oggetti (le classi)

• in C niente metodi* !– (* member functions che si applicano all’oggetto che le

chiama)!

• solo funzioni globali• ...se volete pensatele come metodi statici

– macchine astratte (“java runtime environment”)• il C è molto, molto concreto• gestione diretta della macchina• puramente compilato, non compilato-poi-interpretato

– gestione delle eccezioni...

Page 10: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Un programma in C

• Un programma è un’insieme di – funzioni, e– variabili.

• La funzione – funzione speciale, è l’inizio del programma – deve esistere

main

Page 11: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Le variabili

• Dichiarazioni (semplici)

int x , y , z = 5, w;float ratio, ratio_bis ;

opzionalmente, le variabili possono essere inizializzate

qui, il valore iniziale di z è 5

tipo (delle variabili x, y, z, w):int (intero)

tipo (delle variabili ratio e ratio_bis):float (intero)

Page 12: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Le funzioni

int potenza (int b, int e){ int res=1 , i; for (i=1; i<=e; i++) { res = res * b; } return res;}

Page 13: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Le funzioni

int potenza (int b, int e){ int res=1 , i; for (i=1; i<=e; i++) { res = res * b; } return res;}

tipo del risultato: intero(output della funzione)

lista dei parametri formali,ciascuno preceduto dal tipo(input della funzione)

corpo della funzione“cosa fa”un blocco delimitato da {}

comando “return”: restituzione del risultato, e uscita dalla funzioneci deve essere!

variabili locali

• qui, due• visibili solo nel corpo della funzione.

• dichiarate all’inizio!

nome (identificatore) della funzione: “potenza”

Page 14: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Le procedure

void saluta_n_volte (int n){ int i; for (i=1; i<=n; i++) { printf("ciao "); }}

• Sono funzioni... ...solo, non restituiscono nessun valore

tipo del risultato: “void” (nessuno)

nota: niete comando “return” nel corpo.(ma si può usare “return”, senza valore, per uscire dalla funzione)

Page 15: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Chiamare le funzioni

int potenza (int b, int e){ int res=1 , i; for (i=1; i<=e; i++) { res = res * b; }; return res;}

int main(){ int base=10, milione; milione = potenza( base, 6); ...}

Page 16: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Errori comuni di C...

• le variabili locali si possono definire solo all’inizio di una funzione!

{ int x=1; for (int i=1; i<=10; i=i+1) { x = x * i; };}

{ int x=1, i; for (i=1; i<=10; i=i+1) { x = x * i; }}

{ int x=2, z, k=5; z = x+k; int h=4, w; w = w+h; }

{ int x=2, z,w, k=5, h=4; z = x+k; w = w+h; }

NO

SI

Page 17: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Errori comuni di C...

• Vietato annidare funzioni!– le funzioni in C sono tutte allo stesso livello

int funzione_uno (int b, int e){ int x, y;

int funzione_due( int a) { ... } ...}

–(ma, è vero, si può fare ad esempio in Pascal)

funzione annidata(nested function)

male, male...(non compilerà)

Page 18: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Passaggio di parametri

• Sempre per copia– mai per riferimento !– esempio...

void raddoppia (int x){ x = x*2;}

int main(){ int incassi = 5; raddoppia( incassi ); ...};

–...di errore–nota: compila perfettamente!

Page 19: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Commenti

• Usare /* e */ per delimitare i commenti

int main(){ /* commento ansi C */ int x=10,y; while (x<6) { ... }; /* commento ansi C lungo due righe */ y = x / 2;

// tentativo di commento}

commento stile C++

facile che non vada bene per il vs compilatore C

non ANSI !non va bene a me

Page 20: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Commento sui Commenti

• Usetali ! /* funzione potenza:dati due numeri interi B e Erestituisce B alla E */int potenza (int b, int e){ int res=1 , i; for (i=1; i<=e; i++) { res = res * b; }; return res;}

int main(){ int base=10, milione; /* modo scemo di calcolare un milione */ milione = potenza( base, 6); /*resto del codice ... */};

Page 21: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Strumento: Dev-CPP

cioè software “libero”, non “gratis”

(lo sapevate, vero?)

• un Ambiente Integrato di Sviluppo per C (e C++)

• Web: http://www.bloodshed.net/dev/devcpp.html,• Free Software (GNU General Public License).• L’installatore è scaricabile da:

http://prdownloads.sourceforge.net/dev-cpp/devcpp4990setup.exe

Page 22: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Come Usare Dev-CPP

• Installare, eseguire• File → New → Project…

Page 23: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Come Usare Dev-CPP

• Installare, eseguire• File → New → Project…• Selezionare:

1) "Console

Application"

2) "C Project"

3) Immette un nome

per il progetto

4) ok!

Page 24: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Come Usare Dev-CPP

• Immettere il path per un maggiorordine, meglio

creare una directory

per il nuovo progetto.

NOTA: a ricevimentose avete domandesu un progettopotete portarmiuna copiadella directorycreata(per esempio in un floppy)

Page 25: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Come Usare Dev-CPP

• Abbiamo un nuovo "progetto"

premere questo piccolo "+"

Page 26: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Come Usare Dev-CPP

• Abbiamo un nuovo "progetto"

unico filedel progetto

(per ora):"main.c"

codice dentro

"main.cpp"

Page 27: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Come Usare Dev-CPP

• Abbiamo un nuovo "progetto"questa piccola [*] significa che "main.c" non è ancora stato

salvato...

…salviamolopremendo su questa icona(ci verrà chistoche nome di file

usare. Confermare pure il default)

Page 28: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Come Usare Dev-CPP

• Abbiamo un nuovo "progetto"

Page 29: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Come Usare Dev-CPP

• Abbiamo un nuovo "progetto": compiliamolo– "Execute → Complile"

oppure premeresu questa icona

…oppure Ctrl-F9

Page 30: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Come Usare Dev-CPP

• Abbiamo un nuovo "progetto": compiliamolo

nessun errore!

nessun "warining"!

Page 31: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Come Usare Dev-CPP

• Ora eseguiamo il progetto– "Execute → Run"

oppure premeresu questa icona

…oppure Ctrl-F10

Page 32: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Come Usare Dev-CPP

• Ora eseguiamo il progetto– Risultato dell'esecuzione

Page 33: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Come Usare Dev-CPP

• In seguito, per ritornare sullo stesso progetto…– "Execute → Open Project or File…"

…e selezionare il file ".dev"col nome corrispondente

Page 34: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Cosa fa il programma di prova?

• non molto…

#include <stdio.h>#include <stdlib.h>

int main(int argc, char *argv[]){ system("PAUSE"); return 0; }

“press any key to continue”utile per permettere di visualizzare l’output del programma prima che la finestra si chiuda

dichiaria che verranno usate due librerie standard: “standard Input Output” e “Standard Library”

Page 35: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Cosa fa il programma di prova?

#include <stdio.h>#include <stdlib.h>

int main(int argc, char *argv[]){

printf("Ciao Mondo!\n");

system("PAUSE"); return 0; }

aggiungiamo

• ricompliamo & rieseguiamo – abbiamo ottenuto il nostro primo programma “hello

world”

Page 36: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Cosa è successo esattamente quando abbiamo "complilato" il progetto?

Source File

"main.c"preprocessor

fileprecomp.

compilerobject

file"main.o"

• Solo operazioni sintattiche:– risoluzioni delle “macro”– inclusioni di files di “header”– codici alternativi

• per esempio, per le varie piattaforme

• La compilazione vera e propria

in C ancora in C (quasi) linguaggio macchia

Page 37: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Cosa è successo esattamente quando abbiamo "complilato" il progetto?

Source File 1

"main.c"

Source File 2

"pippo.c"

Source File 3

“pluto.c"

pre- process.

fileprecomp.

1 compiler

objectfile

"main.o"

pre- process.

fileprecomp.

2 compiler

objectfile

"pippo.o"

pre- process.

fileprecomp.

3 compiler

objectfile

“pluto.o"

eseguibilefinale

"prova.exe" linker

libreria A

libreria B

Page 38: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Preprocessore

• Sostituzioni delle macro (costanti simboliche)– puramente sintattiche!

#define LIMIT 10

int main(){ ... if (x < LIMIT) { ... ... } else { ... ... } ...}

• # = istruzione per il preprocessore:

• ≪d'ora in poi, quando scrivo LIMIT, fai finta che abbia scritto 10≫

Page 39: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Preprocessore

• Sostituzioni delle macro (costanti simboliche)– puramente sintattiche!

#define LIMIT 10

int main(){ ... if (x < LIMIT) { ... ... } else { ... ... } ...}

preprocessor

int main(){ ... if (x < 10) { ... ... } else { ... ... } ...}

Page 40: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Preprocessore

• Sostituzioni delle macro (costanti simboliche)– puramente sintattiche!

#define LIMIT x

int main(){ ... if (LIMIT < 10) { ... ... } else { ... ... } ...}

preprocessor

int main(){ ... if (x < 10) { ... ... } else { ... ... } ...}

Page 41: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Preprocessore

• Costrutti condizionali– statici, fatti prima del compilatore!

#define DEBUG 1

int fattoriale(int a){ int res=1;#if DEBUG printf("valore di a:%d \n",a);#endif while (a>1) { res*= (a--); } return res;}

preprocessor

int fattoriale(int a){ int res=1;

printf("valore di a:%d \n",a); while (a>1) { res*= (a--); } return res;}

Page 42: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Preprocessore

• Costrutti condizionali– statici, fatti prima del compilatore!

#define DEBUG 0

int fattoriale(int a){ int res=1;#if DEBUG printf("valore di a:%d \n",a);#endif while (a>1) { res*= (a--); } return res;}

preprocessor

int fattoriale(int a){ int res=1;

while (a>1) { res*= (a--); } return res;}

Page 43: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Preprocessore

• Costrutti condizionali statici– perchè é una tale furbata?

#define DEBUG 0

int fattoriale(int a){ int res=1;#if DEBUG printf("valore di a:%d \n",a);#endif while (a>1) { res*= (a--); } return res;}

int DEBUG = 0;

int fattoriale(int a){ int res=1; if (DEBUG) { printf("valore di a:%d \n",a); } while (a>1) { res*= (a--); } return res;}

VS.

la guardia viene controllata solo durante la compilazionerisultato: programma efficiente!

la guardia viene controllata solo durante ogni esecuzione!risultato: programma inefficiente!

Page 44: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Preprocessore

• Costrutti condizionali statici– due forme sintattiche equivalenti

#define DEBUG 1

int fattoriale(int a){ int res=1;#if DEBUG printf("valore di a:%d \n",a);#endif while (a>1) { res*= (a--); } return res;}

#define DEBUG

int fattoriale(int a){ int res=1;#ifdef DEBUG printf("valore di a:%d \n",a);#endif while (a>1) { res*= (a--); } return res;}

–si possono anche usare#ifndef DEBUG #undef DEBUG #if defined (DEBUG)

Page 45: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Preprocessore

• Costrutti condizionali statici– altro tipico uso:

• specializzazione del codice per architetture specifiche

– (remember: niente macchine virtuali in C)...#if defined (HP9000) || defined(SUN) /* codice funzionante SOLO per le sun o per le HP9000 */ ...#else /* codice buono per le altre architettutre */ ...#endif...

questo tipo di flags (SUN, HP9000...) sono definite nell’ambiente.

Il compilatore lo sa.

Non vanno specificate a mano nel codice

Page 46: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

L’ultima fatica del Preprocessore

preprocessor

const int LIRE_PER_EURO = 1955;

int da_euri_a_lire (int euri){ return euri * LIRE_PER_EURO;}

Inclusione file di header

file “cambi.h“const int LIRE_PER_EURO = 1955;

file “main.c“

#include "cambi.h"

int da_euri_a_lire (int euri){ return euri * LIRE_PER_EURO;}

Page 47: Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

L’ultima fatica del Preprocessore

preprocessor

const int LIRE_PER_EURO = 1955;

pernacchia :P prrrrrr $£!@&&

int da_euri_a_lire (int euri){ return euri * LIRE_PER_EURO;}

Inclusione file di header file “cambi.h“

const int LIRE_PER_EURO = 1955;

pernacchia :P prrrrrr $£!@&&

file “main.c“

#include "cambi.h"

int da_euri_a_lire (int euri){ return euri * LIRE_PER_EURO;}

pura, meccanica, manipolazione sintattica !