18.08.2013 Views

Dalla A alla Z passando per C - Robotica

Dalla A alla Z passando per C - Robotica

Dalla A alla Z passando per C - Robotica

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!