Introduction : Compilation et Traduction Un compilateur est un programme qui prend comme donnée un programme écrit dans un langage source et le traduit dans un langage appelé le langage objet. C etc. objet (bas niveau spécifique à chaque type de machine).
Les interpréteurs sont des programmes qui traduisent directement le programme source en des commandes exécutables immédiatement : LISP, VB, Shell en UNIX. Les préprocesseurs qui effectuent une transformation simple d'un langage évolué dans un autre (ou une version simplifiée du même langage). Le compilateur C est muni d'un préprocesseur pour l'utilisation des commandes include et define.
Génération du code intermédiaire Gestion Gestion Programme source Analyse lexicale Analyse syntaxique Génération du code intermédiaire Gestion Gestion des tables des erreurs Optimisation du code Génération du code Programme objet
Analyse lexicale : Il s'agit d'analyser le programme source en y repérant les mots-clés, les identificateurs, d'étiquettes etc… Les caractères lus successivement sont regroupés en lexemes ("token") Ex. if (bool = = 1) goto 10 [if] [(] [bool] [= =] [1] [)] [goto] [10]
L'analyseur lexical constitue la table des symboles ou sont rangés les identificateurs des variables ou d'étiquettes avec leur type et éventuellement leur valeur. Une fois analysée : if ([var, 35] eq [const, 25]) goto [label, 2]. Ici les mots soulignés seront les types de lexèmes et les nombres représentent des indices de la table des symboles.
Important : L'analyseur lexical a la structure d'un automate fini. Un automate fini qui reconnaît les identificateurs lettre/chiffre lettre délimiteur
Analyse syntaxique L'analyseur syntaxique prend comme source le résultat de l'analyseur lexical. Son résultat est l'arbre de dérivation du mot d'entrée (dont les lettres sont les lexèmes) relativement à la grammaire du langage de programmation. Il détecte en même temps les erreurs (par ex. non correspondance des parenthèses).
Ex. a * (b + c) Exp Exp * exp a ( exp ) b c Si la grammaire contient les règles : exp exp + exp | ( exp ) | id | exp * exp.
Génération du code intermédiaire Le langage intermédiaire est un langage simple du type du "code à trois adresses". Une instruction typique a la forme A = B op C où A, B, C sont des opérandes et op un opérateur binaire.
Optimisation du code (facultative) On pourra remplacer a := c * (b + d) + d / (b + d) par e := b + d a := c * e + d / e
Génération du code La différence principale entre le langage intermédiaire et l'écriture finale en code machine réside dans l'utilisation des registres dans lesquels sont effectués les calculs et dans l'attribution d'adresses physiques en mémoire.
Gestion des erreurs Elle peut se produire à toutes les étapes de la compilation. Par exemple : · l'analyseur lexical peut rencontrer des identificateurs mal orthographiés. · l'analyseur syntaxique peut détecter une parenthèse manquante. · le générateur de code peut détecter une incompatibilité de types entre les opérandes d'un opérateur. · la procédure de gestion des tables peut rencontrer un identificateur déclaré plusieurs fois avec des valeurs contradictoires.