Indice
Premesse Fondamentali
Per poter dialogare con la macchina (elaboratore elettronico) e fargli eseguire una serie di azioni definite, descritte dalle istruzioni, è necessario utilizzare specifici linguaggi di programmazione ad alto livello. Tuttavia una volta terminato di redigere i files sorgenti il nostro PC non sarà ancora in grado di comprendere quelle istruzioni, in quanto l’unica “lingua” a esso chiara è la sequenza binaria composta da 0 e 1. Per cui come è possibile tradurre istruzioni ad alto livello, comprensibili per lo più all’essere umano, in istruzioni a basso livello, comprensibili alla macchina? Esistono degli specifici software in grado di operare in tal senso, cioè di tradurre qualcosa di incomprensibile per la CPU (Central Processing Unit) in alcunché ad essa “familiare”, denominati compilatori.
Processo di Compilazione
Il processo di compilazione in seguito descritto interessa i sorgenti scritti con il linguaggio di programmazione C. Una volta che il programmatore ha terminato la stesura del file sorgente, inserendo in questo tutte le istruzioni che dovranno essere eseguite dal microprocessore all’atto dell’esecuzione del programma, sarà necessario, come esplicitato precedentemente, tradurre le istruzioni in un linguaggio comprensibile alla CPU. Vi è quindi la necessità che venga avviata la fase di compilazione, nel caso dei linguaggi compilati che ricordiamo differire da quelli interpretati, attraverso l’apposito comando “gcc” che deve essere lanciato da terminale, nel caso di distro Linux (o console, nel caso di Windows) o sfruttando gli appositi “button” presenti nei vari IDE (Integrated Developement Envirorment) che consentono la realizzazione del programma. In seguito a quest’azione se ne verificheranno a cascata delle altre che a partire dal sorgente del programma producono il suo file eseguibile, quello contenente realmente i codici binari completi interpretabili dal microprocessore. Di seguito descritto il processo di compilazione: lanciata la compilazione, il file sorgente (con estensione .c) verrà letto almeno tre volte prima di poter essere tradotto in linguaggio Assembly (simile a quello della macchina ma non ancora comprensibile a essa) e nel mentre avverrà la cosiddetta precompilazione per mano del preprocessore. In particolare, quest’ultimo è un software che si occupa di effettuare la risoluzione di tutte quelle direttive, define e similari che sono sostanzialmente precedute, nel codice sorgente, dal simbolo del cancelletto (#). Ad esempio, quando si definisce una costante con valore, il precompilatore si occuperà di sostituire il nome di quella costante con il valore a essa associato, in tutte le occorrenze del sorgente. In seguito alla fase di precompilazione si genera un sorgente, sempre in linguaggio C, con estensione “.i”: questa è detta tale in quanto antecede quella della compilazione vera e propria e attuata nel caso di sorgenti “.c” al fine di rendere l’operazione più veloce, in quanto essi vengono letti più volte dal compilatore. A tal punto il compilatore si occuperà di effettuare la traduzione da linguaggio di programmazione C a linguaggio di programmazione Assembly, generando di conseguenza un file, detto sorgente assembler, con estensione “.s”, al cui interno sono presenti delle istruzioni mnemoniche. Conclusa la precedente azione, un altro software, denominato Assembler, si occupa di tradurre le istruzioni presenti nel sorgente con estensione “.s” in codici binari, cioè sequenze di bit costituite da 0 e 1, generando un file oggetto (object file) con estensione “.o”, nel caso di sistemi operativi Linux-like oppure “.obj”, nel caso di Windows. Interviene, in seguito, un ulteriore software, detto linker, che include nel file oggetto le routine esterne, contenute in altri file già compilati, sempre con estensione “.o” o “.obj”, che corrispondono di fatto alle librerie del C. In particolare, tale software “fonde” il file oggetto con il codice di tutte le funzioni esterne presenti in esso, prelevandole dalle librerie di sistema o da quelle appositamente create dal programmatore (per intesa i file con estensione “.h” tipici del C), generando il fatidico file eseguibile, con estensione “.out”, nel caso di distro Linux o “.exe”, nel caso di Windows. Esso contiene il codice binario completo, in merito al programma realizzato, che quindi potrà essere compreso e successivamente eseguito da parte della CPU, grazie all’intermediazione del sistema operativo.
Lascia un commento