Dalla A alla Z passando per C - Robotica
Dalla A alla Z passando per C - Robotica
Dalla A alla Z passando per C - Robotica
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
3.2 Il compilatore<br />
Il compilatore è un programma che accetta in input un file sorgente e restituisce in uscita<br />
l’equivalente programma in codice macchina, generando il cosiddetto file oggetto.<br />
Il compilatore prende il codice C, lo fa elaborare tipograficamente dal preprocessore e lo traduce<br />
in codice assembler, lo passa quindi all’assemblatore <strong>per</strong> ottenere dei file oggetto, contenenti<br />
codice macchina.<br />
Il compilatore legge il codice sorgente una volta sola, quindi in certi casi occorre dichiarare<br />
una variabile o una funzione, oltre a definirla. Per esempio, se una funzione ne chiama un’altra<br />
definita più avanti nello stesso file sorgente, occorre dichiarare in anticipo tale funzione. Le<br />
dichiarazioni delle funzioni di libreria vengono raccolte in file header, intestazioni, che vengono<br />
inclusi all’inizio di ogni sorgente C.<br />
3.3 Il linker e file oggetto<br />
Un file oggetto contiene codice e dati unitamente ad elenchi di simboli non definiti. Un simbolo,<br />
a questo livello, è solo un nome a cui deve essere associato un indirizzo di memoria. Il nome è<br />
associato a variabili, funzioni, ecc. La risoluzione finale dei simboli non definiti viene effettuata<br />
da un programma chiamato linker il cui file eseguibile è ld.<br />
Un ruolo importante è svolto dal linker quando un programma è costituito da più file sorgente.<br />
In tal caso, il compilatore genera un file oggetto <strong>per</strong> ciascun file sorgente, ed è quindi compito<br />
del linker la generazione del programma complessivo composto dai diversi file oggetto. In questa<br />
fase il linker si preoccupa di verificare che tutti i simboli utilizzati nei diversi file siano stati<br />
correttamente definiti e/o inclusi.<br />
Alcuni errori di compilazione, quindi, vengono riportati dal linker e non dal compilatore vero<br />
e proprio. Per esempio, quando il sorgente C contiene un nome di funzione digitato erroneamente<br />
il linker riporta un errore di undefined symbol. A seconda di quanta informazione simbolica è<br />
presente nei file oggetto, il messaggio di errore può riferirsi ad una riga specifica di uno specifico<br />
file sorgente o mancare di riferimenti precisi al codice sorgente.<br />
3.4 Il loader<br />
Il loader è un componente del sistema o<strong>per</strong>ativo che si occupa del caricamento in memoria dei<br />
programmi eseguibili. Il loader prepara l’eseguibile <strong>per</strong> l’esecuzione e successivamente ne inizia<br />
l’esecuzione stessa. Il codice o<strong>per</strong>ativo del loader viene generalmente caricato in memoria all’avvio<br />
del sistema o<strong>per</strong>ativo, in attesa di essere utilizzato <strong>per</strong> l’esecuzione di un programma.<br />
Tutti i sistemi o<strong>per</strong>ativi che supportano il caricamento di programmi eseguibili hanno un<br />
loader. Ci sono <strong>per</strong>ò sistemi, come <strong>per</strong> esempio i sistemi embedded, nei quali il loader non è<br />
presente. In tali sistemi viene eseguito sempre un solo programma, e non è quindi necessario un<br />
meccanismo <strong>per</strong> il caricamento di programmi diversi.<br />
In ambiente Unix il loader svolge le seguenti funzioni, ogni qualvolta un programma deve<br />
essere eseguito:<br />
1. effettua la validazione del programma (controllo dei <strong>per</strong>messi, requisiti di memoria, ecc.)<br />
2. copia il programma dal disco <strong>alla</strong> memoria centrale<br />
3. copia il contenuto della linea di comando sullo stack, in modo che il programma possa<br />
eventualmente accedervi<br />
32