1 Compilazione separata. 2 Finora abbiamo trattato solo programmi C contenuti in un unico file define/include variabili globali typedef main def F1 …

Slides:



Advertisements
Presentazioni simili
Programmazione ad oggetti
Advertisements

Compilazione di Programmi C/C++
Una applicazione complessa non può essere sviluppata in un unico file: sarebbe ingestibile! Deve necessariamente essere strutturata su più file sorgente.
Dalla scrittura all’esecuzione
Procedure e funzioni A. Ferrari.
I linguaggi di programmazione
Analizzatori Sintattici con Cup Giuseppe Morelli.
1 Semantica Operazionale di un frammento di Java: lo stato.
1 Classi di memorizzazione. 2 Definiscono le regole di visibilità delle variabili e delle funzioni quando il programma è diviso su più file Stabiliscono.
Sistemi Operativi - C Susanna Pelagatti
SC che operano su processi
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
Differenze tra C e C++ Commenti: Adesso puoi inserire dei commenti tra // e la fine della linea. Usare le librerie C: In C++ puoi anche chiamare una funzione.
DLL: Dynamic Linking Library
Programmazione Procedurale in Linguaggio C++
Indirizzi delle variabili A ogni variabile sono associati tre concetti fondamentali: il valore memorizzato; il tipo dati di appartenenza; lindirizzo. Il.
FUNZIONI DI BIBLIOTECA
Caratteri e stringhe di caratteri
Argomenti dalla linea dei comandi Gli argomenti possono essere passati a qualsiasi funzione di un programma, compresa la main(), direttamente dalla linea.
Funzioni definite dall’utente
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di Programmazione a.a.2009/2010 Prof.ssa Chiara Petrioli Corso.
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
Laboratorio di Linguaggi lezione VIII Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea.
Laboratorio di Linguaggi P R I M O C O M P I T I N O Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese.
Installazione pacchetti sotto Linux. Linux: Installare le applicazioni Adesso che abbiamo configurato Linux vogliamo imparare a installare qualche programma.
Approfondimento delle classi
Unità Didattica 2 I Linguaggi di Programmazione
memoria gestita staticamente:
Le classi Definizione di classe Attributi e metodi di una classe Costruttori e distruttori Private e public Funzioni friend Il puntatore this.
Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio.
Le funzioni.
Espressioni condizionali
Fondamenti di Informatica Laurea in Ingegneria Civile e Ingegneria per lambiente e il territorio Ambienti di programmazione Stefano Cagnoni e Monica Mordonini.
Programmazione modulare nel linguaggio C
Algoritmi e Programmazione Avanzata
Per costruire unapplicazione occorre compilare il file (o i file se più duno) che contengono il testo del programma (file sorgente) Il risultato sono uno.
Architettura degli Elaboratori II (canale P-Z) Linguaggi e moduli
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
INTERFACCIAMENTO ASSEMBLY - C++
Laboratorio di Linguaggi lezione VII: variabili Globali e Locali Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali.
2000 Prentice Hall, Inc. All rights reserved. Capitolo 5 (Deitel) Le funzioni Indice degli argomenti Introduzione Moduli nei programmi C 5.3.
1 Esempio di ADT e make Operazioni bit a bit su piu’ file.
Calcolatori Elettronici Assemblatore, Linker e Loader
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
1 Esercitazione Sistemi distribuiti: sistemi che risisedono su più calcolatori interconnessi da una rete di comunicazione Algoritmi distribuiti: programmi.
Elettronica Digitale (II Parte) 10-11_5 1 ELETTRONICA DIGITALE II (5) 6/12 Il processo di assemblaggio.
Variabili Numeriche –Interi (byte, short, int, long): complemento a 2 –A virgola mobile (float, double): IEEE 745 Alfanumeriche –Carattere (char): Unicode.
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Parte 3 Lo stato: variabili, espressioni ed assegnazioni
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 11 Ottobre 2014.
Tag FRAMESET. I frame sono un particolare tipo di struttura HTML, che consente di suddividere la finestra del browser in diversi riquadri distinti. Un'insieme.
Fondamenti di Informatica II Ingegneria Informatica (A-I) Prof. M.T. PAZIENZA a.a – 3° ciclo.
Sottoprogrammi e funzioni
1 SC che operano su processi Getpid, fork, exec, wait, waitpid, exit, dup, dup2.
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
1 Chiamate di sistema Introduzione Errori : perror() Chiamate che lavorano su file.
Compilazione separata
Il linguaggio C Puntatori e dintorni.
Il linguaggio C Un primo programma C : un primo programma (2) /* Programma che calcola il massimo fra tre numeri inseriti da tastiera */ #include #define.
Lezione X Laboratorio di Programmazione. Struttura di un programma Definizione classe e specifica (parziale) classe.hclasse.cpp main.cpp Specifica metodi.
Concetti Fondamentali sulla Programmazione
Linguaggio C: Le basi Stefano Cagnoni e Monica Mordonini
1 1. Introduzione alla gestione della memoria 2. Swapping 3. Memoria virtuale 4. Implementazione 5. Algoritmi di sostituzione Gestione della Memoria.
FI - Algoritmi e Programmazione 1 Variabili Consentono di aumentare notevolmente la potenza espressiva. Una variabile è caratterizzata da:  Un nome 
1 Laboratorio di Programmazione di Sistema - C Susanna Pelagatti Ricevimento: Me ,
Cos’è un sistema operativo ?
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Librerie… Marco D. Santambrogio – Ver. aggiornata al 20 Luglio 2015.
Il C `e un linguaggio di programmazione di uso generale, originariamente sviluppato per la scrittura del sistema operativo Unix, ed oggi disponibile su.
Parsing ricorsivo discendente Il parsing ricorsivo discendente (recursive descent parsing) è un metodo di tipo top-down che può essere facilmente codificato.
Transcript della presentazione:

1 Compilazione separata

2 Finora abbiamo trattato solo programmi C contenuti in un unico file define/include variabili globali typedef main def F1 … def FN prototipi F1..FN Struttura tipica di un sorgente C

3 Compilazione separata (2) Scopi di suddividere il codice sorgente C su più file –per raggruppare un insieme di funzioni congruenti (e solo quelle) in un unico file –per incapsulare un insieme di funzioni esportando solo quelle che vogliamo fare utilizzare agli altri (pubbliche) –per compilare una volta per tutte un insieme di funzioni e metterlo a disposizione di altri in una libreria es. le librerie standard viste finora ….

4 Compilazione separata (2.1) Problemi da risolvere : –(1) come si possono utilizzare funzioni definite in altri file ? Vogliamo che il compilatore continui a fare i controlli di tipo etc … –(2) come posso compilare una volta per tutte le funzioni definite in un file separato ? non voglio doverle ricompilare ogni volta che le uso in un altro file (come avviene per printf(), scanf() ) voglio che il codice assembler risultante possa essere facilmente ‘specializzato’ per generare l’eseguibile finale

5 Compilazione separata (3) Tipicamente : define/include variabili globali typedef main def F1 … def Fk prototipi F1..Fk glob.h prototipi Fk+1..FN main.c fun_toK.c def Fk+1 … def FN fun_toK.h fun_toN.c fun_1toN.h

6 define/include variabili globali typedef #include “glob.h ” #include “fun_toK.h” #include “fun_toN.h” …... ass F1 … ass Fk prototipi F1..Fk glob.h prototipi Fk+1..FN main.c fun_toK.o ass Fk+1 … ass FN fun_toK.h fun_toN.o fun_1toN.h

7 Compilazione separata (4) Per utilizzare delle funzioni definite in file diversi basta –(1) specificare il prototipo (dichiarazione) prima dell’uso tipicamente includendo un file che lo contiene –(2) avere a disposizione una versione precompilata delle funzioni stesse (il modulo oggetto relativo al file che le contiene) Perché questo basta ?

8 Compilazione separata (5) Perché basta ? –Il prototipo della funzione permette al compilatore di fare i controlli di tipo ogni funzione di cui non è noto il prototipo viene considerata void -> int questo genera errori strani ma non fa fallire la compilazione (provate a non includere stdio.h….) –Dal modulo oggetto si può generare correttamente l’eseguibile finale del programma che utilizza le funzioni definite separatamente senza ricompilarle da capo (cioè dal sorgente complessivo)

9 define/include variabili globali typedef prototipi F1..Fk glob.h prototipi Fk+1..FN main.c fun_toK.o fun_toK.h fun_toN.o fun_1toN.h Modulo oggetto 1,k Modulo oggetto k+1,N #include “glob.h ” #include “fun_toK.h” #include “fun_toN.h” …...

10 Compilazione separata Seconda parte

11 Compilazione separata (5.1) Partiamo da più file di testo : define/include variabili globali typedef main def F1 … def Fk prototipi F1..Fk glob.h prototipi Fk+1..FN main.c fun_toK.c def Fk+1 … def FN fun_toK.h fun_toN.c fun_1toN.h

12 Compilazione separata (5.2) Vogliamo ottenere un unico eseguibile –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)

13 Compilazione separata (5.3) –L’eseguibile contiene tutte le informazioni per creare la configurazione iniziale dello spazio di indirizzamento (loading) Text I-Data segment Stack Area vuota BSS-segment Text segment I-Data segment Ampiezza BSS Altre info Magic number File a.out Data FRAME per la funzione main

14 Compilazione separata (6.0) preproc compil assembler linker file1.c file2.c file2.o file1.o eseguibile Opzioni del gcc permettono di fermarsi in corrispondenza dei vari passi -E -S file2.s -c modulo oggetto a.out

15 Compilazione separata (6) Come si crea il modulo oggetto? –gcc -c file.c produce un file file.o che contiene il modulo oggetto di file.c –Il formato dell’oggetto dipende dal sistema operativo –Che informazioni contiene l’oggetto ? L’assemblato del sorgente testo e dati (si assume di partire dall’indirizzo 0) La tabella di rilocazione La tabella dei simboli (esportati ed esterni)

16 Compilazione separata (7) Tabella di rilocazione – identifica le parti del testo che riferiscono indirizzi assoluti di memoria es. JMP assoluti, riferimenti assoluti all’area dati globali (LOAD, STORE…) –questi indirizzi devono essere rilocati nell’eseguibile finale a seconda della posizione della prima istruzione del testo ( offset ) –all’indirizzo contenuto nell’istruzione ad ogni indirizzo rilocabile va aggiunto offset

17 main.o fun_toK.o fun_toN.o datiN Testo N Dati N datiN Testomain Datimain datiN Testo N Dati N datiN Testo k Dati k TabRiloc,TabSimbol Ind inizio Situazione iniziale eseguibile ? ? TabRiloc,TabSimbol

18 Compilazione separata (8) Tabella di rilocazione (cont.) –il codice pre-compilato è formato da testo e dati binari –l’assemblatore assume che l’indirizzo iniziale sia 0 X 0 Tabella di rilocazione X ind

19 main.o fun_toK.o fun_toN.o datiN Testo N Dati N datiN Testomain Datimain datiN Testo N Dati N datiN Testo k Dati k Tr,ts Ind inizio Testo N Testo k Datimain Dati k Dati N Ind inizio Testomain

20 Compilazione separata (9) Tabella di rilocazione (cont.) –ad ogni indirizzo rilocabile va aggiunto offset, l’indirizzo iniziale nell’eseguibile finale offset X + offset ind ind + offset

21 Compilazione separata (10) Tabella dei simboli – identifica i simboli che il compilatore non è riuscito a ‘risolvere’, cioè quelli di cui non sa ancora il valore perché tale valore dipende dal resto dell’eseguibile finale –ci sono due tipi di simboli... definiti nel file ma usabili altrove (esportati) –es: i nomi delle funzioni definite nel file, i nomi delle variabili globali usati nel file ma definiti altrove (esterni) –es: le funzioni usate nel file ma definite altrove (es. printf())

22 Compilazione separata (11) Tabella dei simboli (cont.) – per i simboli esportati, la tabella contiene nome, indirizzo locale –per i simboli esterni contiene nome indirizzo della/e istruzioni che le riferiscono

23 Compilazione separata (12) Il linker si occupa di risolvere i simboli. –Analizza tutte le tabelle dei simboli. –Per ogni simbolo non risolto (esterno) cerca in tutte le altre tabelle dei simboli esportati degli oggetti da collegare (linkare) assieme nelle librerie standard nelle librerie esplicitamente collegate (opzione -l )

24 Compilazione separata (12.1) Il linker si occupa di risolvere i simboli (cont.) –Se il linker trova il simbolo esterno eventualmente ricopia il codice della funzione (linking statico) nell’eseguibile usa l’indirizzo del simbolo per generare la CALL giusta o il giusto riferimento ai dati –Se non lo trova da errore... Provate a non linkare le librerie matematiche...

25 Compilazione separata (13) preproc compil assembler linker file1.c file2.c file2.o file1.o eseguibile Opzioni del gcc permettono di fermarsi in corrispondenza dei vari passi -E -S file2.s -c

26 Esempio: percolation... Come costruire l’eseguibile (1): $gcc -Wall -pedantic -c dmat2.c --crea dmat2.o r.h dmat2.o percolation-sol.c dmat2.h dmat2.c

27 Esempio: percolation … (2) r.h percolation-sol.o dmat2.o percolation-sol.c dmat2.h dmat2.c Come costruire l’eseguibile (2): $gcc -Wall -pedantic -c percolation-sol.c --crea percolation-sol.o

28 Esempio: percolation … (3) r.h percolation-sol.o exe dmat2.o percolation-sol.c dmat2.h dmat2.c Come costruire l’eseguibile (3): $gcc dmat2.o percolation-sol.o -o exe --crea l’eseguibile ‘exe’

29 Esempio: percolation … (4) $gcc -Wall -pedantic -c dmat2.c --crea dmat2.o $gcc -Wall -pedantic -c percolation- sol.c --crea percolation-sol.o $gcc dmat2.o percolation-sol.o -o exe --crea l’eseguibile ‘exe’ se modifico dmat2.c devo rieseguire (1) e (3) se modifico dmat2.h devo rifare tutto

30 Esempio: percolation … (5) $gcc -M dmat2.c --fa vedere le dipendenze da tutti i file anche dagli header standard delle librerie dmat2.o : dmat2.c /usr/include/stdio.h \ /usr/include/sys/types.h \ … … … … … perche’ questo strano formato ? –per usarlo con il make ….

31 Come visualizzare i moduli oggetto –Comando nm options file.o fornisce tutti i simboli definiti in file.o $nm -g dmat2.o fornisce solo i simboli esportati –Comandi objdump e readelf permettoni di leggere le varie sezioni dell’eseguibile $objdump -d dmat2.o fornisce il testo disassemblato -r tabelle di rilocazione -t symbol table –Vedere anche info binutils da emacs

32 Makefile Il file dependency system di Unix (serve ad automatizzare il corretto aggiornamento di più file che hanno delle dipendenze)

33 makefile: idea di fondo (1) Permette di esprimere dipendenze fra file –es. f.o dipende da f.c e da t.h ed r.h in terminologia make : –f.o è detto target –f.c, t.h, r.h sono una dependency list

34 makefile: idea di fondo (2) (2) Permette di esprimere cosa deve fare il sistema per aggiornare il target se uno dei file nella dependency list è stato modificato –es. se qualcuno ha modificato f.c, t.h o r.h, per aggiornare f.o semplicemente ricompilare f.c usando il comando gcc -Wall -pedantic -c f.c In terminologia make : –la regola di aggiornamento di uno o più target viene detta make rule

35 makefile: idea di fondo (2) (3) L’idea fodamentale è: –descrivere tutte le azioni che devono essere compiute per mantenere il sistema consistente come make rule in un file (Makefile) –usare il comando make per fare in modo che tutte le regole descritte nel Makefile vengano applicate automaticamente dal sistema

36 Formato delle ‘make rule’ Formato più semplice f.o : f.c t.h r.h gcc -Wall -pedantic -c f.c Target list : Command 1 Dependency list Command N … Command list

37 Formato delle ‘make rule’ (2) ATTENZIONE!!! f.o : f.c t.h r.h gcc -Wall -pedantic -c f.c Target list : Command 1 Dependency list Command N … Qua deve esserci un TAB

38 Formato delle ‘make rule’ (3) Esempio con più regole exe: f.o r.o gcc f.o r.o -o exe f.o: f.c t.h r.h gcc -Wall -pedantic -c f.c r.o: r.h r.c gcc -Wall -pedantic -c r.c Fra due regole deve esserci almeno una LINEA VUOTA Il file deve terminare con un NEWLINE

39 Il/I target della prima regola trovata sono la radice dell’albero exe Formato delle ‘make rule’ (4) L’ordine delle regole è importante! –Il make si costruisce l’albero delle dipendenze a partire dalla prima regola del makefile

40 Ogni nodo nella dependency list della radice viene appeso come figlio r.o exe f.o Formato delle ‘make rule’ (5) L’ordine delle regole è importante! –Il make si costruisce l’albero delle dipendenze a partire dalla prima regola del makefile

41 Si considerano le regole che hanno f.o e r.o come target f.c t.h r.h r.c r.o exe f.o Formato delle ‘make rule’ (6) L’ordine delle regole è importante! –Poi si visitano le foglie e si aggiungono le dipendenze allo stesso modo

42 Albero delle dipendenze complessivo f.c t.h r.h r.c r.o exe f.o Formato delle ‘make rule’ (7) L’ordine delle regole è importante! –La generazione dell’albero termina quando non ci sono più regole che hanno come target una foglia

43 Se t1 > t2, si esegue la command list della regola che ha come target il padre f.c t.h r.h r.c r.o exe f.o Come viene usato l’albero... Visita bottom up –Per ogni nodo X si controlla che il tempo dell’ultima modifica del padre sia successivo al tempo dell’ultima modifica di X t1 t2 gcc -Wall -pedantic -c f.c

44 f.c t.h r.h r.c r.o exe f.o Come viene usato l’albero … (2) Visita bottom up –Se il file corrispondente ad un nodo X non esiste (es. è stato rimosso)... Si esegue comunque la regola che ha come target X t1 t2 gcc -Wall -pedantic -c f.c

45 Come si esegue il make... Se il file delle regole si chiama ‘Makefile’ –basta eseguire $ make altrimenti …. $ make -f nomefile gcc -Wall -pedantic -c f.c $ –stampa dei comandi eseguiti per aggiustare i tempi sull’albero delle dipendenze –-n per stampare solo i comandi (senza eseguirli)

46 Come si esegue il make … (2) È possibile specificare una radice dell’albero diversa dal target nella prima regola del file –dobbiamo passare il nome del target come parametro al make. Es. $ make f.o f.c t.h r.h f.o Crea solo questo sottoalbero

47 Variabili... È possibile usare delle variabili per semplificare la scrittura del makefile –stringhe di testo definite una volta ed usate in più punti # nomi oggetti objects = r.o f.o # regole exe: $(objects) gcc $(objects) -o exe

48 Variabili (2) Inoltre ci sono delle variabili predefinite che permettono di comunicare al make le nostre preferenze, ad esempio : –quale compilatore C utilizzare per la compilazione CC = gcc –le opzioni di compilazione preferite CFLAGS = -Wall -pedantic a che serve poterlo fare ?

49 Regole implicite... Le regole che abbiamo visto finora sono più estese del necessario –Il make conosce già delle regole generali di dipendenza fra file, basate sulle estensioni dei nomi –es : nel caso del C, sa già che per aggiornare un XX.o è necessario ricompilare il corrispondente XX.c usando $CC e $CFLAGS –quindi una regole della forma XXX.o: XXX.c t.h r.h gcc -Wall -pedantic -c XXX.c

50 Regole implicite … (2) –È equivalente a XXX.o: XXX.c t.h r.h $(CC) $(CFLAGS) XXX.c –e sfruttando le regole implicite del make può essere riscritta come XXX.o: t.h r.h

51 Regole implicite … (3) Riscriviamo il nostro esempio con le regole implicite e le variabili : CC = gcc CFLAGS = -Wall -pedantic objects = f.o r.o exe: f.o r.o $(CC) $(CFLAGS) $(objects) -o exe f.o: t.h r.h r.o: r.h

52 Regole implicite … (4) Il makefile di percolation : exe = percolation prefix = percolation-sol CC = gcc CFLAGS = -Wall -pedantic objects = dmat2.o $(prefix).o $(exe): $(objects) $(CC) $(CFLAGS) $(objects) -o $(exe) $(prefix).o: dmat2.h dmat2.o: dmat2.h

53 Phony targets... È possibile specificare target che non sono file e che hanno come scopo solo l’esecuzione di una sequenza di azioni clean: rm $(exe) $(objects) *~ core –siccome la regola non crea nessun file chiamato ‘clean’, il comando rm verrà eseguita ogni volta che invoco $make clean ‘clean’ è un target fittizio (phony) inserito per provocare l’esecuzione del comando in ogni caso

54 Phony targets … (2) Questo stile di programmazione è tipico ma ha qualche controindicazione : –se casualmente nella directory viene creato un file chiamato ‘clean’ il gioco non funziona più siccome la dependency list è vuota è sempre aggiornato! –È inefficiente! Il make cerca prima in tutte le regole implicite per cercare di risolvere una cosa che è messa apposta per non essere risolta

55 Phony targets … (3) Soluzione : –prendere l’abitudine di dichiarare esplicitamente i target falsi.PHONY : clean clean: -rm $(exe) $(objects) *~ core ‘-rm’ significa che l’esecuzione del make può continuare anche in caso di errori nell’esecuzione del comando rm (es. uno dei file specificati non c’è)

56 Documentazione su make Make può fare molte altre cose per una descrizione introduttiva Glass –pp 329 e seguenti per una descrizione davvero dettagliata info di emacs –ESC-X info –cercare (CTRL-S) "make"