Laboratorio di Linguaggi lezione II Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica Anno Accademico 2007/08
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 / 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 ricevimento: Mercoledì 11: :00 o 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
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 / U n i v e r s i t à d e l l I n s u b r i a Laboratorio di Linguaggi Pagina del corso: – (oppure: google for "Marco Tarini" => "Teaching" => "Linguaggi-07")
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 / U n i v e r s i t à d e l l I n s u b r i a Laboratorio di Linguaggi piccola guida pratica di C –guida essensiale di alcuni emementi di C v = argomanto già trattato
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 / U n i v e r s i t à d e l l I n s u b r i a Prima di andare avanti in questi lucidi le reserved words sono in blu! –non si possono usare per gli identificatori –ma, ricordiamoci, il C è case sensitive " " non si è un nome lecito per una nuova var, ma " " si. int potenza (int b, int e) { int res=1, i; for (i=1; i<=e; i++) { res = res * b; } return res; } int Int
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 / 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!
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 / 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 !
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 / 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 E restituisce (B elevato 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... */ }
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 / U n i v e r s i t à d e l l I n s u b r i a Un programma completo il famigerato "hello world" #include int main(int argc, char *argv[]) { printf("Ciao Mondo!\n"); return 0; } printf = scrivi sullo STANDARD OUTPUT (esempio di funzione che NON fa parte del core del lingauggio, è definito in stdio.h) dichiaria che verranno usate due librerie standard: standard Input Output e Standard Library
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 / U n i v e r s i t à d e l l I n s u b r i a Compilazione (build) file main.c #include int main(int argc, char *argv[]) { printf("Ciao Mondo!\n"); return 0; } sorgente ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? COMPILAZIONE main.exe binario C:\> main.exe C:\> Ciao Mondo! C:\> ESECUZIONE
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 / 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" precompilatore file precomp. compiler object file "main.o" Solo operazioni sintattiche: –inclusioni di files di header –risoluzioni delle macro –codici alternativi per esempio, per le varie piattaforme La compilazione vera e propria in Cancora in C (quasi) linguaggio macchia
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 / U n i v e r s i t à d e l l I n s u b r i a Cosa fa il precompilatore 1/3 precompilator 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; }
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 / U n i v e r s i t à d e l l I n s u b r i a Cosa fa il precompilatore 1/3 precompilator 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 !
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 / U n i v e r s i t à d e l l I n s u b r i a Cosa fa il precompilatore 2/3 Sostituzioni delle macro (costanti simboliche) –puramente sintattiche! #define LIMIT 10 int main() {... if (x < LIMIT) {... } else {... }... } # = istruzione per il preprocessore: >
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 / U n i v e r s i t à d e l l I n s u b r i a Cosa fa il precompilatore 2/3 Sostituzioni delle macro (costanti simboliche) –puramente sintattiche! #define LIMIT 10 int main() {... if (x < LIMIT) {... } else {... }... } precompilator int main() {... if (x < 10) {... } else {... }... }
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 / U n i v e r s i t à d e l l I n s u b r i a Cosa fa il precompilatore 2/3 Sostituzioni delle macro (costanti simboliche) –puramente sintattiche! #define LIMIT x int main() {... if (LIMIT < 10) {... } else {... }... } precompilator int main() {... if (x < 10) {... } else {... }... }
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 / U n i v e r s i t à d e l l I n s u b r i a Cosa fa il precompilatore 3/3 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; } precompilator int fattoriale(int a) { int res=1; printf("valore di a:%d \n",a); while (a>1) { res*= (a--); } return res; }
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 / U n i v e r s i t à d e l l I n s u b r i a Cosa fa il precompilatore 3/3 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; } precompilator int fattoriale(int a) { int res=1; while (a>1) { res*= (a--); } return res; }
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 / U n i v e r s i t à d e l l I n s u b r i a Cosa fa il precompilatore 3/3 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 compilazione risultato: programma efficiente! la guardia viene controllata durante ogni esecuzione! risultato: programma inefficiente!
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 / U n i v e r s i t à d e l l I n s u b r i a Cosa fa il precompilatore 3/3 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)
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 / U n i v e r s i t à d e l l I n s u b r i a Cosa fa il precompilatore 3/3 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, HP ) sono definite nellambiente. Il compilatore lo sa. Non vanno specificate a mano nel codice
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 / U n i v e r s i t à d e l l I n s u b r i a Compilazione (build): 1 files sorgente solo? Source File "main.c" precompiler file precomp. compiler object file "main.o" in Cancora in C (quasi) linguaggio macchia
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 / U n i v e r s i t à d e l l I n s u b r i a Compilazione (build): più files file main.c [ codice in C ] file main.h [ altro codice ] COMPILAZIONE (BUILD) sorgenti main.exe binario
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 / U n i v e r s i t à d e l l I n s u b r i a Compilazione (build): più files file main.c [ codice in C ] file main.h [ altro codice ] file zap.c [ altro codice ] COMPILAZIONE (BUILD) sorgenti main.exe binario file pippo.c [ altro codice ] Progetto con più file sorgenti !
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 / U n i v e r s i t à d e l l I n s u b r i a Building a project Source File 1 "main.c" Source File 2 "pippo.c" Source File 3 pluto.c" compiler object file "main.o" compiler object file "pippo.o" compiler object file pluto.o" eseguibile finale "prova.exe" linker Header File 1 caio.h" pre- compil. file precomp. 1 pre- compil. file precomp. 2 pre- compil. file precomp. 3
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 / U n i v e r s i t à d e l l I n s u b r i a Il ruolo delle librerie Source File 1 "main.c" Source File 2 "pippo.c" Source File 3 pluto.c" pre- compil. file precomp. 1 compiler object file "main.o" pre- compil. file precomp. 2 compiler object file "pippo.o" pre- compil. file precomp. 3 compiler object file pluto.o" eseguibile finale "prova.exe" linker libreria A stdlib.a libreria B Header File 1 caio.h" Header Lib File 1 stdlib.h"
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 / U n i v e r s i t à d e l l I n s u b r i a Risassumendo Compilazione (build) (TRE FASI) 1.Precompliazione (di ogni file sorgente ".c") (utilizzando anche i file headers ".h") 2.Compilazione (vera e propria) (per ogni file sorgente ".c" risultante) 3.Linking (di tutti i ".o" risultanti insieme) (utilizzando anche i file di libreria)