Vous êtes sur la page 1sur 8

Compilation (3èmeLMD –S5-) Chap1 

: Introduction aux compilateurs

Chapitre I : Introduction aux compilateurs

I.1 Définitions:
a) Traducteur: est un programme traduisant un programme écrit dans un langage L1 (langage source) en
un programme équivalent écrit en un langage L2 (langage cible).

Programme en langage source (L1) Programme en langage cible (L2)


entrée Traducteur sortie

b) Compilateur : est un traducteur dont le langage source est un langage de haut niveau et langage cible
est le langage machine.

Gestion des erreurs


Programme en langage à haut niveau Programme en langage machine

Compilateur

Remarque: Avant la phase finale (Code machine), un langage intermédiaire est produit et mis dans un
Fichier Code, ce dernier est fichier multi-plateforme (qui pourra être utilisé dans n’importe quelle
machine). Exemple: compilateur java, qui crée un fichier code compilé par le programme JVM (Java
Virtual Machine).

c) Préprocesseur (Précompilateur)
Si L1 et L2 sont des langages de haut niveau, le traducteur est appelé un préprocesseur.

d) Interpréteur: est un traducteur ligne par ligne (instruction/instruction) d’un programme écrit dans un
langage de haut niveau. Exemples: BASIC , LISP , PHP… sont des langages interprétés.

Université de Tébessa 2014 – 2015 1 M. ZEBDI A.


Compilation (3èmeLMD –S5-) Chap1 : Introduction aux compilateurs

I.2 Structure d'un compilateur :


a) Schéma général d'un compilateur :

Programme source ( Langage Source)

Analyse lexicale

A
na Analyse syntaxique
ly
se

Analyse sémantique

Gestion de la Gestion des


Génération du code erreurs
Table des
intermédiaire
symboles

Optimisation du code
intermédiaire Sy
nt

se
Génération du code
machine

Programme en code
machine ( Langage cible)
(exécutable)

Université de Tébessa 2014 – 2015 2 M. ZEBDI A.


Compilation (3èmeLMD –S5-) Chap1 : Introduction aux compilateurs

b) L’étape de l’analyse : découpée en trois phases, à savoir :


b.1) Analyse lexicale (lexicographique ou analyse linéaire) :
Cette phase initiale du compilateur consiste à :
1- Lire le programme source en entrée (considéré comme un fichier texte), caractère par caractère.
2- Éliminer les caractères superflus (commentaires, espaces, ...).
3- Organiser le programme source en Unités Lexicales (Tokens) regroupées dans un tableau
appelé : Table des symboles.

Exemple : A partir de la ligne d’un programme source en PASCAL


for i :=1 to vmax do a :=a+i;
On peut dégager la suite de tokens suivante (avec leurs types) :
for : mot clé a: identificateur
i: identificateur := : affectation
:= : affectation a: identificateur
1: entier +: opérateur
to : mot clé arithmétique
vmax : identificateur i: identificateur
do : mot clé ;: séparateur
et que l’on peut construire la table des symboles suivante :
Numéro de Token Type de token Type de variable . . . . . . .. . .
symbole
… ….
10 for Mot clé
11 to Mot clé
12 do Mot clé
… ..... .....
… …. .....
50 ; Séparateur
… …. .....
100 := Affectation
… …. .…
110 + Opération Arithmétique
…. …. .…
…. …. .…
1000 i Identificateur
1001 a Identificateur
1002 vmax Identificateur
…. …... .…
…. ….. .…
5001 1 Nombre Entier
…. …. .…

Ensuite, l’énoncé précédent peut s’exprimer ainsi :


10, 1000, 100, 5001, 11, 1002, 12, 1001, 100, 1001, 101,1000, 50
for i := 1 to vmax do a := a + i ;
Université de Tébessa 2014 – 2015 3 M. ZEBDI A.
Compilation (3èmeLMD –S5-) Chap1 : Introduction aux compilateurs

C’est-à-dire comme une suite de références à la table des symboles.

NB  : Outils théoriques utilisés: expressions régulières et automates à états finis.

b.2) Analyse syntaxique (grammaticale ou hiérarchique) :


Lors de l’analyse syntaxique, on vérifie que l’ordre des tokens correspond à l’ordre définit pour le
langage. On dit que l’on vérifie la syntaxe du langage à partir de la définition de sa grammaire. Cette
phase produit une représentation sous forme d’arbre de la suite des tokens obtenus lors de la phase
précédente.
Par exemple, l’arbre suivant représente la structure de la phrase précédente:
for i :=1 to vmax do a := a+i

L’arbre syntaxique obtenu après l’analyse syntaxique

.NB : Outils théoriques utilisés: grammaires et automates à pile

b.3) Analyse sémantique (analyse contextuelle):


A ce stade d’analyse, certaines propriétés relatives à la signification des phrases du programme source
sont à vérifier. L’objectif majeur de cette phase est la Vérification des Types. Des contrôles de
cohérence sémantique liés directement à cet objectif doivent être établit :

 Déclaration des identificateurs.


 Compatibilités des opérandes avec les opérations.
 Conversion de type.
 Compatibilités des arguments des fonctions.
 ….
A la fin de cette phase, le compilateur renvoie un compte rendu des erreurs (lexicales, syntaxique et
sémantiques), avant de passer à l’étape de « Synthèse ».
Université de Tébessa 2014 – 2015 4 M. ZEBDI A.
Compilation (3èmeLMD –S5-) Chap1 : Introduction aux compilateurs

Si on prend, par exemple, le contrôle de la « conversion de type » avec la phrase suivante :


aire:=base*hauteur/2

La conversion du nombre entier 2 en nombre réel 2.0 doit être effectuée (correction automatique), c’est le
cas de plusieurs compilateurs, ou énoncée comme erreur sémantique.

Un autre exemple ( en C) : int i ; float x ; i = x ;

0.

NB  : Outils théoriques utilisés: schéma de traduction dirigée par la syntaxe.


Université de Tébessa 2014 – 2015 5 M. ZEBDI A.
Compilation (3èmeLMD –S5-) Chap1 : Introduction aux compilateurs

c) L’étape de synthèse :
c.1) Génération du code intermédiaire :

A l'issue de l'étape d'analyse certains compilateurs construisent explicitement une représentation


intermédiaire du programme source. Cette représentation est considérée comme un programme destiné à
une machine abstraite (virtuelle) (comme le Java Virtual Machine). Donc, c'est un code multi plateformes
qui doit avoir deux propriétés importantes:
 Facile à produire.
 Facile à traduire en langage cible.
Comme exemples de formes intermédiaires, on peut citer:
 Code à 3-adresses.
 Quadruplets (exemple: Byte Code Java).
 Notation polonaise.
 Arbre abstrait & DAG.
Exemple du code intermédiaire en utilisant la forme du code à 3-adresses:
temp1 = EntierVersRéel(2)
temp2 = hauteur / temp1
temp3 = base * temp2
aire = temp3

c.2) Optimisation du code intermédiaire:


Cette phase tente d'améliorer le code intermédiaire, de façon que le code machine résultant s'exécute plus
rapidement. Donc, il faut:
 Minimiser le nombre d'instructions.
 Occuper un minimum d'espace mémoire.
C'est-à-dire utiliser le minimum de ressources (processeur, mémoire)
Exemple:
temp1 := hauteur / 2.0
aire := base * temp1

c.2) Génération du code machine (Programme en langage cible):


La phase finale d'un compilateur est la production du code cible, qui consiste, normalement, en du code
machine exécutable (translatable) ou en du code en langage d'assemblage.
A ce stade, On sélectionne des emplacements mémoire pour chacune des variables utilisées dans le
programme. Puis les instructions intermédiaires sont traduites en une suite d'instructions machines qui
effectuent les mêmes tâches, (le problème crucial de ce processus est l'assignation des variables aux
registres).

Université de Tébessa 2014 – 2015 6 M. ZEBDI A.


Compilation (3èmeLMD –S5-) Chap1 : Introduction aux compilateurs

Exemple1:
MOV hauteur, R1 0001 01 00 00001000 *
DIV #2.0, R1 0101 01 10 00000010
MOV base, R2 0001 10 00 00000100 *
MUL R1, R2 0100 10 01 00000001
MOV R2, aire 0010 10 00 00000000 *

Exemple2:
var_a A0000 ; les adresses des variables
var_i A0001
var_vmax A0002
... ; le code du programme
mov var_i,1
loop:
mov A0, (var_i) ; comparaison i >= vmax
jge A0, (var_vmax), finFor ; si vrai aller en finFor
mov A0, (var_a) ; calcul de a+i
add A0, A0, (var_i)
mov var_a,A0 ; a := a+i
mov A0, (var_i) ; on incrémente i
add A0, A0, 1
mov var_i, 1
jmp loop ; et on continue la boucle
finFor:
...
N.B:
• Table des symboles :
1. Information concernant le type et l'emplacement mémoire des identificateurs.
2. Initialisée par l'analyseur lexical, complétée et utilisée par les autres phases.
• Gestion des erreurs :
1. Erreurs lexicales (symboles ou mots n'appartenant pas au langage source).
2. Erreurs syntaxiques (règles grammaticales non respectées).
3. Erreurs sémantiques (incohérence de types ).
Diverses modes de récupérations d'erreurs possibles, selon la finalité du compilateur :
1. Arrêt à la première erreur ;
2. Resynchronisation sur la prochaine construction correcte ;
3. Tentatives de correction.

Université de Tébessa 2014 – 2015 7 M. ZEBDI A.


Compilation (3èmeLMD –S5-) Chap1 : Introduction aux compilateurs

I.3 Les outils d’aide à la construction des compilateurs :


Leur rôle est de fournir des programmes en langages évolués (C par exemple), comportant les
parties sources d’un compilateur. Comme outils efficaces d'aide à la réalisation de compilateurs on peut
citer :
• Constructeurs d'analyseurs lexicaux (exemple : LEX ou FLEX) ;
• Constructeurs d'analyseurs syntaxiques (exemple : YACC) ;
• Traducteurs dirigés par la syntaxe (exemple : YACC) ;
• Générateurs de code automatiques ;

a) Constructeur d'analyseur lexical :


Il produit un programme d’analyse lexicale à partir d’une spécification des « Expressions
Régulières » définissant les mots du langage à compiler. Le résultat de ce constructeur est, donc, un
« Automate d’Etats Finis ».

Constructeur d'analyseur lexical A.E.F


Expressions Régulières du Langage Source Reconnaissant les mots du langage source
(Lex ou Flex )

b) Constructeur d'analyseur syntaxique :


A partir d’une spécification d’une grammaire non contextuelle (de Type 2), On définit la syntaxe
du langage à compiler. Le résultat de ce constructeur est un programme d’analyse syntaxique (Automate à
Pile). Exemple : le YACC (Yet Another Compiler Compiler) produit un analyseur LALR.

Constructeur d'analyseur syntaxique Analyseur syntaxique


Grammaire non contextuelle
(Yacc ) (A.P)

Université de Tébessa 2014 – 2015 8 M. ZEBDI A.