- le préprocesseur est responsable d'analyser les directives (tout ce qui commence par le
caractère #) et de les exécuter (essentiellement des opérations d'édition de texte: copie de
texte, remplacement de certains mots, etc.)
- le compilateur est responsable de la traduction de votre programme C en assembleur (voir la
section suivante)
- l'éditeur de liens est responsable de résoudre les liens vers les fonctions appartenant à des
librairies externes (soit la librairie du langage C, ou encore d'autres librairies disponibles sur la
plateforme utilisée)
- le chargeur d’exécutable est responsable du chargement en mémoire centrale et de l’exécution
de votre programme
1.2 Le compilateur C
Un ordinateur ne sait pas exécuter un programme écrit en C (ni d'ailleurs en C++, en Java, en
Fortran, ou n'importe quel langage dit de haut niveau): le seul langage qu'il «connaisse» est un
langage de bas niveau appelé assembleur. L'assembleur (qui varie selon le type de processeur
utilisé) est un langage très simple qui permet d'écrire des instructions comme: transférer le
contenu de telle adresse mémoire dans un registre, additionner le contenu de deux registres, etc.
Le rôle d'un compilateur est de traduire le code écrit dans un langage de haut niveau (dans notre
cas, le C) en assembleur.
Le compilateur est donc un programme de traduction, mais aussi d'analyse du code. Voici les
principales phases effectuées lors d'une compilation:
- l'analyse lexicale permet de valider le vocabulaire utilisée dans le programme
- l’analyse syntaxique permet de vérifier si le code correspond bien à la grammaire du langage
- l’analyse sémantique permet de valider l’utilisation des variables et des fonctions
- la génération du code intermédiaire permet au compilateur une préparation pour les différentes
phases d’optimisation
- les phases d’optimisation permettent de réduire le code grâce à différentes techniques
- finalement, la génération du code intermédiaire en assembleur permet de produire un fichier
exécutable (extension de fichier « .exe » sur Windows, « .out » sur Linux, etc.)
1.3 Structure générale d’un programme en C
Les directives #include
Les directives #define (si nécessaire)
Les déclarations globales (si nécessaire)
Les fonctions (déclarations et définitions si nécessaire)
La fonction principale main()
En C, une fonction se compose d'un en-tête et d'un bloc. Un bloc est composé de déclarations,
d'instructions ou d'autres blocs. On ne peut pas définir une fonction dans un bloc.