Phases de traduction
Les programmes C et C++ se composent d'un ou de plusieurs fichiers sources contenant chacun une partie du texte du programme. Un fichier source, ainsi que ses fichiers include, qui sont inclus à l’aide de la #include
directive de préprocesseur, mais qui n’incluent pas les sections du code supprimées par des directives de compilation conditionnelle telles que #if
, est appelée unité de traduction.
Les fichiers sources peuvent être traduits à différents moments. En fait, il est courant de traduire uniquement les fichiers obsolètes. Les unités de traduction traduites peuvent être traitées dans des fichiers objets ou des bibliothèques de codes objet séparés. Ces unités de traduction distinctes et traduites sont ensuite liées pour former un programme exécutable ou une bibliothèque de liens dynamiques (DLL). Pour plus d’informations sur les fichiers qui peuvent être utilisés comme entrée dans l’éditeur de liens, consultez les fichiers d’entrée LINK.
Les unités de traduction peuvent communiquer via :
des appels aux fonctions qui comportent une liaison externe ;
des appels aux fonctions membres de classe qui comportent une liaison externe ;
la modification directe d'objets contenant une liaison externe ;
la modification directe de fichiers ;
Une communication entre processus (pour les applications Microsoft Windows uniquement).
La liste suivante décrit les phases au cours desquelles le compilateur traduit les fichiers :
Mappage de caractères
Les caractères dans le fichier source sont mappés à la représentation source interne. Les séquences de trigraphe sont converties en représentation interne à un caractère au cours de cette phase.
Découpage de ligne
Toutes les lignes se terminant par une barre oblique inverse (\) immédiatement suivie d’un caractère de nouvelle ligne sont jointes à la ligne suivante dans le fichier source, formant des lignes logiques à partir des lignes physiques. Sauf s’il est vide, un fichier source doit se terminer par un caractère de nouvelle ligne qui n’est pas précédé d’une barre oblique inverse.
Segmentation du texte en unités lexicales
Le fichier source est décomposé en jetons de prétraitement et espaces blancs. Chaque commentaire dans le fichier source est remplacé par un espace. Les caractères de saut de ligne sont conservés.
Prétraitement
Les directives de prétraitement sont exécutées et les macros sont développées dans le fichier source. L'instruction #include
appelle la traduction sur le texte inclus, en commençant par les trois étapes de traduction précédentes.
Mappage de jeu de caractères
Toutes les séquences d'échappement et tous les membres du jeu de caractères de source sont convertis en leur équivalent dans le jeu de caractères d'exécution. Pour Microsoft C et C++, le jeu de caractères source et le jeu de caractères d'exécution sont tous deux au format ASCII.
Concaténation de chaînes
Tous les littéraux de chaîne adjacents et étendus sont concaténés. Par exemple, "String " "concatenation"
devient "String concatenation"
.
Traduction
Tous les jetons sont analysés syntaxiquement et sémantiquement ; ils sont convertis en code objet.
Liaison
Toutes les références externes sont résolues pour créer un programme exécutable ou une bibliothèque de liens dynamiques.
Le compilateur génère des avertissements ou des erreurs lors des phases de traduction dans lesquelles il détecte des erreurs de syntaxe.
L'éditeur de liens résout toutes les références externes et crée un programme exécutable ou une DLL en combinant une ou plusieurs unités de traduction traitées séparément avec les bibliothèques standard.