3 janv. 2014

Les phases de compilation en C et en C++

La première étape consiste à écrire le code source en langage C ou C++ (fichiers .c et .h en C et .cpp et
.hpp en C++). Ensuite on lance une compilation, par exemple avec gcc (en C) ou g++ (en C++). La
compilation (au sens vague du terme) se déroule en trois grandes phases.
1) La précompilation (préprocesseur)
Le compilateur commence par appliquer chaque instruction passée au préprocesseur (toutes les lignes
qui commencent par un #, dont les #define). Ces instructions sont en fait très simples car elles ne
consistent en gros qu'à recopier ou supprimer des sections de codes sans chercher à les compiler. C'est
de la substitution de texte, ni plus ni moins.
C'est notamment à ce moment là que les #define présents dans un fichier source (.c ou .cpp) ou dans un
header (.h ou .hpp) sont remplacés par du code C/C++. À l'issue de cette étape, il n'y a donc plus, pour le
compilateur, d'instructions commençant par un #.
2) La compilation
Ensuite, le compilateur compile chaque fichier source (.c et .cpp), c'est-à-dire qu'il crée un fichier binaire
(.o) par fichier source, excepté pour le fichier contenant la fonction main. Cette phase constitue la
compilation proprement dite.
Ces deux premières étapes sont assurées par cc lorsqu'on utilise gcc/g++. Enfin le compilateur passe au
fichier contenant le main.

3) Le linkage
Enfin, le compilateur agrège chaque fichier .o avec les éventuels fichiers binaires des librairies qui sont
utilisées (fichiers .a et .so sous linux, fichiers .dll et .lib sous windows).
- Une librairie dynamique (.dll et .so) n'est pas recopiée dans l'exécutable final (ce qui signifie que le
programme est plus petit et bénéficiera des mises à jour de ladite librairie). En contrepartie, la librairie doit
être présente sur le système sur lequel tourne le programme.

- Une librairie statique (.a) est recopiée dans l'exécutable final ce qui fait que celui-ci est complètement
indépendant des librairies installées du le système sur lequel il sera recopié. En contrepartie, l'exécutable
est plus gros, il ne bénéficie pas des mises à jour de cette librairie etc...
Le linker vérifie en particulier que chaque fonction appelée dans le programme n'est pas seulement
déclarée (ceci est fait lors de la compilation) mais aussi implémentée (chose qu'il n'avait pas vérifié à ce
stade). Il vérifie aussi qu'une fonction n'est pas implémentée dans plusieurs fichiers .o.
Cette phase, appelée aussi édition de lien, constitue la phase finale pour obtenir un exécutable (noté .exe
sous windows, en général pas d'extension sous linux).
Cette étape est assurée par ld lorsqu'on utilise gcc/g++. La première étape consiste à écrire le code source en langage C ou C++ (fichiers .c et .h en C et .cpp et
.hpp en C++). Ensuite on lance une compilation, par exemple avec gcc (en C) ou g++ (en C++). La
compilation (au sens vague du terme) se déroule en trois grandes phases.
1) La précompilation (préprocesseur)
Le compilateur commence par appliquer chaque instruction passée au préprocesseur (toutes les lignes
qui commencent par un #, dont les #define). Ces instructions sont en fait très simples car elles ne
consistent en gros qu'à recopier ou supprimer des sections de codes sans chercher à les compiler. C'est
de la substitution de texte, ni plus ni moins.
C'est notamment à ce moment là que les #define présents dans un fichier source (.c ou .cpp) ou dans un
header (.h ou .hpp) sont remplacés par du code C/C++. À l'issue de cette étape, il n'y a donc plus, pour le
compilateur, d'instructions commençant par un #.
2) La compilation
Ensuite, le compilateur compile chaque fichier source (.c et .cpp), c'est-à-dire qu'il crée un fichier binaire
(.o) par fichier source, excepté pour le fichier contenant la fonction main. Cette phase constitue la
compilation proprement dite.
Ces deux premières étapes sont assurées par cc lorsqu'on utilise gcc/g++. Enfin le compilateur passe au
fichier contenant le main.

3) Le linkage
Enfin, le compilateur agrège chaque fichier .o avec les éventuels fichiers binaires des librairies qui sont
utilisées (fichiers .a et .so sous linux, fichiers .dll et .lib sous windows).
- Une librairie dynamique (.dll et .so) n'est pas recopiée dans l'exécutable final (ce qui signifie que le
programme est plus petit et bénéficiera des mises à jour de ladite librairie). En contrepartie, la librairie doit
être présente sur le système sur lequel tourne le programme.

- Une librairie statique (.a) est recopiée dans l'exécutable final ce qui fait que celui-ci est complètement
indépendant des librairies installées du le système sur lequel il sera recopié. En contrepartie, l'exécutable
est plus gros, il ne bénéficie pas des mises à jour de cette librairie etc...
Le linker vérifie en particulier que chaque fonction appelée dans le programme n'est pas seulement
déclarée (ceci est fait lors de la compilation) mais aussi implémentée (chose qu'il n'avait pas vérifié à ce
stade). Il vérifie aussi qu'une fonction n'est pas implémentée dans plusieurs fichiers .o.
Cette phase, appelée aussi édition de lien, constitue la phase finale pour obtenir un exécutable (noté .exe
sous windows, en général pas d'extension sous linux).
Cette étape est assurée par ld lorsqu'on utilise gcc/g++.

Aucun commentaire:

Featured Posts

  • Commandes Linux: Les commandes de gestion de l'espace mémoire30/12/2013 - 0 Comments
  • How to check systeminfo on Windows XP, 7 and 8 (no software)09/09/2013 - 0 Comments
  • Partager les fichiers et les dossiers31/12/2013 - 0 Comments
  • How to delete a Blogger blog in Old Interface28/03/2012 - 0 Comments
  • How search engines determine your rank01/03/2012 - 0 Comments
  • blogger