|
|
|
|
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. |
|
|
|
|
|