Fasi di conversione
I programmi in C e C++ sono costituiti da uno o più file di origine, ciascuno contenente parte del testo del programma. Un file di origine, insieme ai relativi file di inclusione, file inclusi usando la #include
direttiva del preprocessore, ma non include sezioni di codice rimosse da direttive di compilazione condizionale, ad #if
esempio , è detta unità di conversione.
I file di origine possono essere tradotti in momenti diversi. In effetti, è comune tradurre solo i file non aggiornati. Le unità di conversione convertite possono essere elaborate in distinti file oggetto o in librerie di codice oggetto. Tali distinte unità di conversione convertite vengono, in seguito, collegate, in modo da formare un programma eseguibile o una libreria di collegamento dinamico (DLL). Per altre informazioni sui file che possono essere usati come input per il linker, vedere LINK input files .for more information about files that can be used as input to the linker, see LINK input files.
Le unità di conversione possono comunicare utilizzando:
Chiamate alle funzioni con collegamento esterno.
Chiamate alle funzioni membri di classe che hanno un collegamento esterno.
Modifica diretta degli oggetti che hanno un collegamento esterno.
Modifica diretta dei file.
Comunicazione interprocesso (solo con le applicazioni basate su Microsoft Windows).
Nell'elenco seguente vengono descritti i passaggi ai quali il compilatore si attiene per converte i file:
Mapping dei caratteri
I caratteri presenti nel file di origine vengono mappati alla rappresentazione interna di origine. Durante questa fase, le sequenze di trigramma vengono convertite in una rappresentazione interna a un solo carattere.
Splicing linea
Tutte le righe che terminano in una barra rovesciata (\) immediatamente seguite da un carattere di nuova riga vengono unite con la riga successiva nel file di origine, formando linee logiche dalle righe fisiche. A meno che non sia vuoto, un file di origine deve terminare con un carattere di nuova riga non preceduto da una barra rovesciata.
Tokenizzazione
Il file di origine viene suddiviso in spazi vuoti e token di pre-elaborazione. I commenti presenti nel file di origine vengono sostituiti ognuno con uno spazio. I caratteri di nuova riga vengono mantenuti.
Preelaborazione
Le direttive di pre-elaborazione vengono eseguite e le macro vengono espanse nel file di origine. L'istruzione #include
richiama la conversione a partire dai precedenti tre passaggi di conversione in ogni testo incluso.
Mapping dei set di caratteri
Tutti i membri del set di caratteri e le sequenze di escape vengono convertite negli relativi equivalenti del set di caratteri di esecuzione. Per Microsoft C e C++, i set di caratteri di esecuzione e di origine sono entrambi ASCII.
Concatenazione di stringhe
Tutti i valori letterali stringa adiacenti e a caratteri "wide" vengono concatenati. Ad esempio, "String " "concatenation"
diventa "String concatenation"
.
Traduzione
Tutti i token vengono analizzati sintatticamente e semanticamente; gli stessi token vengono poi convertiti in codice oggetto.
Collegamento
Tutti i riferimenti esterni vengono risolti per creare un programma eseguibile o una libreria di collegamento dinamico.
Il compilatore genera avvisi o errori durante le fasi di conversione in cui rileva errori di sintassi.
Il linker risolve tutti i riferimenti esterni e crea un programma eseguibile o una DLL, combinando una o più unità di conversione elaborate separatamente con le librerie standard.