Précompilation et Compilation
Parler de la compilateur C constitue un abus de langage. Il s'agit en fait d'un outil qui enchaîne trois étapes :
-
La précompilation
-
La compilation
-
L'édition des liens
Par exemple sous UNIX la compilation est lancé par la commande « cc toto.c ». Où cc est le nom du compilateur.
Le programme source toto.c ne peut pas être exécuté de manière immédiate par l'ordinateur tel qu'il se présente à nos yeux. Il faut le traduire en langage machine (ou langage binaire), c'est à dire des instructions élémentaires que le microprocesseur peut exécuter. Pour rendre le texte exploitable par la machine, on utilise un programme destiné à le traduire : le compilateur C.
La pré-compilation modifie le texte du fichier source en interprétant les directives destinées du préprocesseur. Le préprocesseur est un programme qui va traiter des directives qui lui sont destinés. Les directives de pré-compilation commencent par le symbole #. Elles sont facilement repérables. Le C ne possède pas la possibilité d'écrire un texte sur l'écran : on doit donc inclure une bibliothèque qui intègre ces fonctions manquantes. La directive #include <stdio.h> réalise ainsi l'inclusion des définitions précises des fonctions standards d'entrées/sorties. Ces définitions se trouvent dans le fichier stdio.h. «stdio.h» signifie standard input/output et l'extension «.h» indique un fichier «header», simplement c'est le fichier d'entête qui donne la définition de certaines fonctions.
A ce stade, la précompilation est terminé nous obtenons un fichier dans lequel des directives ont été appliquées. Le compilateur proprement dit est un programme qui va vérifier la syntaxe et la concordance des types du fichier généré par le pré-compilateur. Si le programme source ne comporte pas d'erreur de syntaxe il va générer un fichier composé d'instructions machines.
Le résultat de la compilation est un fichier appelé module objet, vous avez obtenu un nouveau fichier toto.o à partir du fichier source toto.c. Bien que formé d'instructions machine, il n'est pas exécutable. En effet, la précompilation a permis de donner la définition de la fonction printf. La compilation a préparé son usage mais n'a pas ajouté les séquences d'instructions machine qui la réalise. L'ensemble des instructions de toutes les fonctions définies dans stdio.h (la bibliothèque proprement dite) se trouve ailleurs dans un autre module objet déjà compilé. Il reste à les lier avec notre fichier objet pour pouvoir les utiliser. Le programme compilé est prêt à utiliser la fonction printf mais il ne la possède pas.