Author: Christian.Queinnec@lip6.fr

## Étapes de compilation

L'obtention d'un exécutable passe par les étapes de traduction et d'assemblage décrites par la figure 7.1.

> | Programme source |
> prétraite | ¯ |
> | Programme source |
> compile | ¯ |
> | Programme assembleur |
> assemble | ¯ |
> | Instructions machine |
> relie | ¯ |
> | Code exécutable |

> Figure 7.1 : Schéma pour la production d'un exécutable

Le prétraitement remplace des parties de texte par d'autres textes grâce à un système de macros. La compilation traduit le programme source en instructions assembleur. L'assemblage effectue la traduction vers des instructions machines. Enfin l'édition de liens permet d'ajouter la bibliothèque d'exécution, contenant principalement la gestion mémoire, et de faire la jonction avec le système d'exploitation pour les primitives.

### Les compilateurs d'Objective CAML

Nous donnons figure 7.2 le détail des phases de génération de code des compilateurs d'Objective CAML. On appelle langage intermédiaire (LI) la représentation interne au compilateur de la suite d'instructions à engendrer.

> | Suite de caractères |
> analyse lexicale | ¯ |
> | Suite de lexèmes |
> analyse syntaxique | ¯ |
> | Arbre de syntaxe |
> analyse sémantique | ¯ |
> | Arbre de syntaxe décoré |
> génération de code intermédiaire | ¯ |
> | Suite d'instructions du LI |
> optimisation du code intermédiaire | ¯ |
> | Suite d'instructions du LI |
> génération du code cible | ¯ |
> | Programme assembleur |

> Figure 7.2 : Étapes d'un compilateur

L'analyse lexicale transforme la suite de caractères en une suite d'unités lexicales (lexèmes). Les lexèmes correspondent principalement aux entiers, nombres flottants, caractères, chaînes de caractères et identificateurs. Le message `Illegal character` provient de cette analyse.
L'analyse syntaxique construit un arbre de syntaxe en vérifiant que la suite de lexèmes est correcte par rapport à la grammaire du langage. Les messages `Syntax error` indiquent que la phrase analysée ne respecte pas la grammaire du langage.
L'analyse sémantique, qui parcourt l'arbre de syntaxe, s'intéresse à un autre aspect de la correction du programme. En Objective CAML cette analyse consiste principalement en l'inférence de types qui, si elle réussit, produit le type le plus général d'une expression ou d'une déclaration. Les messages d'erreurs de typage proviennent de cette passe. De même les indications qu'un membre d'une séquence n'est pas du type unit sont déterminées à ce moment là. D'autres indications sont données par cette phase, comme l'analyse des filtrages (filtrages non exhaustifs, partie de filtrage non utilisée).
La génération et l'optimisation du code intermédiaire n'engendrent pas de message d'erreur ou d'avertissement. Ces phases de manipulation d'une structure intermédiaire permettent de factoriser le développement des différents compilateurs d'Objective CAML.
La génération du programme cible est l'étape finale du processus de compilation. Elle diffère selon les compilateurs.

### Description du compilateur de code-octet

La machine virtuelle d'Objective CAML s'appelle la Zinc (pour << Zinc Is Not Caml >>). Elle est due à Xavier Leroy et est décrite dans ([Ler90]). Son nom a été choisi pour marquer sa différence d'avec les premières implantations du langage Caml reposant sur la machine virtuelle CAM (pour Categorical Abstract Machine, voir [CCM87]).
Nous donnons figure 7.3 la description des trois éléments permettant l'utilisation du compilateur de code-octet. La première partie de cette figure comprend l'interprète de la machine Zinc lié à la bibliothèque d'exécution. La deuxième partie correspond au compilateur Objective CAML qui produit du code-octet pour la machine Zinc. La troisième partie contient l'ensemble des bibliothèques venant avec le compilateur. Elles seront décrites au chapitre 8.

> Figure 7.3 : Machine virtuelle

La notation graphique utilisée pour décrire les composants de la figure 7.3 et leur agencement est standard dans le monde de la compilation. Une boîte simple représente un fichier écrit dans le langage indiqué dans la boîte. Une boîte double représente l'interprétation d'un langage par un programme écrit dans un autre. Une boîte triple indique qu'un langage source est compilé vers un langage cible en utilisant un compilateur écrit dans un troisième langage. La figure 7.4 donne la légende de chacune des boîtes.

> Figure 7.4 : Notation graphique pour les interprètes et les compilateurs

La légende de la figure 7.3 est la suivante :

- BC : code-octet de la Zinc ;
- C : code C ;
- .o : code objet, dépendant de l'architecture ;
- µ : micro-processeur ;
- OC (v1 ou v2) : code Objective CAML.

### Remarque

Le compilateur Objective CAML est écrit pour sa plus grande partie en Objective CAML. La deuxième partie de la figure 7.3 montre comment passer d'une version v1 du compilateur vers une version v2.