PRATIQUE ALGO/METHODES 
Expliquez-moi... le fonctionnement d'un compilateur
 
C'est l'outil indispensable pour la bonne compréhension d'un programme par le processeur de l'ordinateur. Quels sont ses principes ? (13/09/2005)
  Forum

Réagissez dans les forums de JDN Développeurs

C'est une évidence, les ordinateurs ne comprennent pas le code source tel quel : il leur est impossible de déduire directement de la syntaxe d'un langage les instructions processeurs que l'on souhaite voir accomplir.

Cette traduction est prise en charge par un compilateur (ou un interpréteur), spécifique à chaque langage, et capable de rendre les mots compréhensibles pour l'homme en ordres compréhensibles pour la machine.

Notons que la différence entre langage compilé et langage interprété est aujourd'hui assez ténue, la plupart disposant d'une version des deux sortes. Précisons simplement qu'un programme interprété doit être recompilé à chaque lancement, tandis qu'un programme compilé l'est une bonne fois pour toutes.

Pour aller au plus basique, le compilateur prend le code source, le compile en langage assembleur, puis convertit ce code assembleur en langage machine.

Ceci se fait le plus souvent en plusieurs passages, les meilleurs compilateurs pouvant aller jusqu'à optimiser le code s'il en reconnaît certains aspects. En effet, entre chaque passage, le source prend une forme différente, sur laquelle peuvent s'appliquer une série d'analyse et d'optimisation - au détriment de la vitesse de compilation.

Notez que chaque compilateur est différent (même pour un seul langage), aussi nos descriptions ne correspondront pas forcément à toutes les situations.

La compilation depuis code source vers assembleur se fait déjà en plusieurs étapes. Pour commencer, le code est vérifié et nettoyé de tous ses commentaires.

Ceci fait, le code est très largement simplifié : par exemple, toutes les boucles for() ou while() sont converties en autant de goto() que nécessaire.

Une analyse est ensuite accomplie sur ce source simplifié : le compilateur est capable de reconnaître certains morceaux, et de déterminer s'il s'agit de doublons, s'il peut en agréger certains... Une forme d'optimisation peut donc s'opérer.

Le compilateur transforme ensuite ce code simplifié en assembleur, en lui appliquant une série des motifs connus. Le programme est ainsi reconstruit morceau par morceau. L'objectif est de retrouver le motif correspondant à un bloc le plus rapidement possible, et que ce motif soit le plus approprié/optimisé pour ce type de bloc.

Les parties d'analyse sont autrement plus compliquées qu'il n'y paraît dans notre explication : celles-ci peuvent être lexicales, syntaxiques ou sémantiques. Il s'agit réellement de comprendre le langage, tout comme un érudit étudierait une langue écrite.

Historiquement, le premier compilateur a été écrit en assembleur par Grace Hopper, sur le système Univac. Dans la question de l'oeuf et de la poule, c'est le compilateur qui est apparu avant le langage, celui-ci ayant été créé "à la main" dans un langage machine.
 
Xavier Borderie, JDN Développeurs
 
 
Accueil | Haut de page