Compilazione in Unix: concetti base

Unix e' un ottimo ambiente per la produzione di programmi. Presenta infatti un numero notevole di strumenti rivolti ai programmatori.

La stessa filosofia di Unix, rispetto a quella di altri sistemi operativi o ambienti, e' rivolta all'apertura ed alla documentazione.

In questo breve documento vengono riportati alcuni concetti di base utili per la programmazione in ambiente Unix.

Anatomia di un programma in linguaggio C

Puo' essere utile ricordare qualche elemento relativo ai programmi in linguaggio C.

La maggior parte dei programmi che operano in ambiente Unix sono scritti in linguaggio C.

Nei casi piu' semplici tutto il programma e' contenuto in un solo file ed anche la compilazione ed il link avvengono in un solo passo. Piu' spesso le fasi di compilazione e link avvengono con diversi passaggi intermedi e sono attivati dal make.

Un programma scritto in linguaggio C e' composto da uno o piu' file sorgenti identificati dal suffisso .c. I file contengono una o piu' funzioni e dichiarazioni di variabili. Una funzione e' sempre presente: la funzione main() che e' quella che viene attivata alla partenza del programma.

All'interno dei file sorgente possono essere presenti richiami alle macro di #include che tipicamente includono file identificati dal suffisso .h. E' buona regola che i file di inclusione non contengano ne' funzioni ne' dichiarazioni di variabili. Sono tipicamente contenute macro, definizioni di costanti e definizioni di tipi di variabili.

La compilazione di un sorgente crea un file oggetto con suffisso .o. In tale file tutte le istruzioni sono state tradotte in linguaggio macchina.

I file oggetto non sono eseguibili. E' necessaria una vase di "collegamento" degli indirizzamenti che viene effettuata dal linker.

Per comodita' piu' moduli oggetto possono essere raccolti in librerie. Esistono due tipi di librerie.

Le librerie statiche, con suffisso .a, vengono linkate direttamente ed il codice inserito direttamente nell'eseguibile.

Le librerie dinamiche, con suffisso .so, vengono verificate in fase di link e vengono caricate solo al momento dell'esecuzione. Tale caratteristica consente la condivisione in memoria dei moduli delle librerie dinamiche da parte di piu' programmi. Inoltre la modifica di un modulo contenuto in una libreria non richiede ricompilazioni ma solo la distribuzione della libreria stessa (si tratta della stessa tecnica utilizzata nelle .DLL dell'aborrito mondo Microsoft).

I moduli oggetto e le librerie sono trattati in maniera leggermente differente dal linker. I moduli oggetto sono inseriti sempre nell'eseguibile mentre i moduli appartenenti ad una libreria sono inseriti solo se richiamati da altri moduli. Pertanto l'ordine utilizzato nel comando di link ha notevole importanza.

Il linking di moduli oggetto e delle librerie genera finalmente l'eseguibile.

Tipicamente su Unix non viene assegnato alcun suffisso ma e' possibile utilizzare qualsiasi nome si ritenga opportuno.

Accesso a DB relazionali

Una tecnica molto diffusa per la programmazione con RDBMS e' l'utilizzo dell'embedding dell'SQL in programmi C. In questo caso i file sorgenti hanno suffissi differenti che dipendono dall'RDBMS (eg. .pc per Oracle). Il precompilatore trasforma tali file in normali .c e quindi effettua i normali passi di compilazione.

Tipicamente la compilazione richiede un numero elevato di librerie e passi. Viene pertanto fornito dal fornitore software un file di make di esempio (per Oracle: $ORACLE_HOME/proc/demo/proc.mk). Tale file di make e' sempre il punto di partenza per la compilazione dei propri applicativi.

Strumenti vari

L'ambiente Unix offre un'ampio numero di strumenti ed utilita' per il programmatore: make, sccs, lint, debugger ... Per maggiori dettagli consultate Compilazione in Unix: gli strumenti e Comandi Unix poco noti.


Testo: Compilazione in Unix: concetti base
Data: 20 Maggio 1997
Versione: 1.2.1
Autore: mail@meo.bogliolo.name