Vous êtes sur la page 1sur 9

MINISTERE DE LENSEIGNEMENT SUPERIEUR

ET DE LA RECHERCHE SCIENTIFIQUE
BADJI MOKHTAR-ANNABA UNIVERSITY
UNIVERSITE BADJI MOKHTAR-ANNABA
FACULTE DES SCIENCES DE LINGENIORAT
DEPARTEMENT DINFORMATIQUE

COMPILATION
3me Anne Licence en Informatique

SUPPORT DE COURS REALISE PAR


PR SOUICI-MESLATI LABIBA

souici_labiba@yahoo.fr

2012-2013

Compilation, L3 Informatique , Pr Souici-Meslati L., Universit dAnnaba, 2012/2013

SYLLABUS (DESCRIPTIF OFFICIEL)


Domaine: Mathmatique et Informatique
Filire: Informatique
Spcialit: Licence Informatique (L3)
Semestre: 1, Anne 2012-2013
Unit denseignement: UEI13
Matire: COMPILATION
Nombre de Crdits: 6
Volume horaire hebdomadaire total : 6h00
Cours : 3h
TD : 1h30
TP : 1h30
Evaluation
Examen final : 50%
TD : 25% (50% : prsence et participation et 50% : micro interrogation)
TP : 25% (50% : prsence et participation et 50% : valuations sur machine)

Objectifs
1.
2.
3.
4.

Comprhension du cheminement d'un programme (texte) source vers un programme (code).


Etude des tapes du processus de compilation dun langage volu.
Etude de mthodes et techniques utilises en analyse lexicale, syntaxique et smantique.
Familiarisation, en TP, avec des outils de gnration danalyseurs lexicaux et syntaxiques (LEX et YACC).

Contenu
1 Introduction la compilation

Les diffrentes tapes de la compilation

Compilation, interprtation, traduction


2 Analyse Lexicale

Expressions rgulires

Grammaires

Automates dtats finis

Un exemple de gnrateur danalyseurs lexicaux : LEX


3 Analyse Syntaxique

Dfinitions : grammaire syntaxique, rcursivit gauche, factorisation dune grammaire, grammaire -libre

Calcul des ensembles des dbuts et suivants

Mthodes danalyse descendante : la descente rcursive, LL(1)

Mthodes danalyse ascendante : SLR(1), LR(1), LALR(1) (mthode des items)

Un exemple de gnrateur danalyseurs syntaxiques : YACC


4 Traduction dirige par la syntaxe (Analyse smantique)
5 Formes intermdiaires

Forme postfixe

Quadrupls

Tripls directs et indirects

Arbre abstrait
6 Allocation - Substitution Organisation des donnes lexcution

Rfrences Bibliographiques
Ouvrages existants au niveau de la bibliothque de luniversit, la rfrence 1 est vivement recommande
1. Aho A., Sethi R., Ullman J., "Compilateurs : Principes, techniques et outils", Inter-ditions, 1991 et Dunod,
2000
2. Drias H., "Compilation: Cours et exercices", OPU, 1993
3. Wilhem R., Maurer D., "Les compilateurs: Thorie, construction, gnration", Masson, 1994

Compilation, L3 Informatique , Pr Souici-Meslati L., Universit dAnnaba, 2012/2013

CHAPITRE 1 : INTRODUCTION AUX COMPILATEURS

1.1 Dfinition
Un compilateur est un programme qui a comme entre un code source crit en langage de haut niveau
(langage volu) est produit comme sortie un code cible en langage de bas niveau (langage dassemblage ou
langage machine).
La traduction ne peut tre effectu que si le code source est correct car, sil y a des erreurs, le rle du
compilateur se limitera produire en sortie des messages derreurs (voir figure 1.1).

Code Source

Compilateur

Code Cible

Messages derreurs
Figure 1.1. Rle du compilateur
Un compilateur est donc un traducteur de langage volu quon ne doit pas confondre avec un interprteur qui
est un autre type de traducteur. En effet, au lieu de produire un programme cible comme dans le cas dun
compilateur, un interprteur excute lui-mme au fur et mesure les oprations spcifies par le programme
source. Il analyse une instruction aprs lautre puis lexcute immdiatement. A linverse dun compilateur, il
travaille simultanment sur le programme et sur les donnes. Linterprteur doit tre prsent sur le systme
chaque fois que le programme est excut, ce qui nest pas le cas avec un compilateur. Gnralement, les
interprteurs sont assez petits, mais le programme est plus lent quavec un langage compil. Un autre
inconvnient des interprteurs est quon ne peut pas cacher le code, et donc garder des secrets de fabrication :
toute personne ayant accs au programme peut le consulter et le modifier comme elle le veut. Par contre, les
langages interprts sont souvent plus simples utiliser et tolrent plus derreurs de codage que les langages
compils. Des exemples de langages interprts sont : BASIC, scheme, CaML, Tcl, LISP, Perl, Prolog
Il existe des langages qui sont mi-chemin de linterprtation et de la compilation. On les appelle langages Pcode ou langages intermdiaires. Le code source est traduit (compil) dans une forme binaire compacte (du
pseudo-code ou p-code) qui nest pas encore du code machine. Lorsquon excute le programme, ce P-code est
interprt. Par exemple en Java, le programme source est compil pour obtenir un fichier (.class) byte code
qui sera interprt par une machine virtuelle. Un autre langage p-code : Python.
Les interprteurs de p-code peuvent tre relativement petits et rapides, si bien que le p-code peut sexcuter
presque aussi rapidement que du binaire compil. En outre les langages p-code peuvent garder la flexibilit et
la puissance des langages interprts.

Compilation, L3 Informatique , Pr Souici-Meslati L., Universit dAnnaba, 2012/2013

1.2 Structure gnrale dun compilateur


Un compilateur est gnralement compos de modules correspondant aux phases logiques de lopration de
compilation (voir figure 1.2).

Compilateur
Code
Source

Units lexicales
Analyseur Syntaxique
Arbre Syntaxique

Gestionnaire des
erreurs

Analyseur Lexical

Messages
derreurs

Analyseur Smantique

Gnrateur de Code
Intermdiaire
Code Intermdiaire
Optimiseur de Code
Code Intermdiaire
Optimis

Gestionnaire de la
Table des Symboles

Arbre Syntaxique
Dcor

Gnrateur de Code
Code
Cible

Figure 1.2. Phases et modules de compilation


Chacun des modules de la figure 1.2 (except les modules gestionnaires de table de symboles et derreurs),
reprsente une phase logique qui reoit en entre une reprsentation de code source et la transforme en une
autre forme de reprsentation.
La structure reprsente par la figure 1.2 est purement conceptuelle. Elle correspond lorganisation logique
dun compilateur. En pratique, plusieurs phases peuvent tre regroupes en une seule passe qui reoit en
entre une certaine reprsentation et donne en sortie une autre.
Par exemple, les phases danalyses lexicale, syntaxique, smantique et la gnration du code intermdiaire
peuvent correspondre seule passe dans laquelle lanalyseur syntaxique est le module matre qui appelle,
chaque fois, lanalyseur lexical pour obtenir une unit lexicale, puis dterminer graduellement la structure
syntaxique du code et enfin appelle le gnrateur de code qui effectue lanalyse smantique et produit une
partie du code intermdiaire.

1.2.1 Lanalyseur lexical


Connu aussi sous lappellation Scanner, lanalyseur lexical a pour rle principal la lecture du texte du code
source (suite de caractres) puis la formation des units lexicales (appeles aussi entits lexicales, lexmes,
jetons, tokens ou encore atomes lexicaux).
Exemple
Considrons lexpression daffectation a := b + 2 * c ;
Les units lexicales qui apparaissent dans cette expression sont :

Compilation, L3 Informatique , Pr Souici-Meslati L., Universit dAnnaba, 2012/2013

Unit lexicale

Sa nature

Identificateur de variable

:=

Symbole daffectation

Identificateur de variable

Oprateur daddition

Valeur entire

Oprateur de multiplication

Identificateur de variable

Sparateur

Lanalyseur a aussi comme rle llimination des informations inutiles pour lobtention du code cible, le stockage
des identificateurs dans la table des symboles et la transmission dune entre lanalyseur syntaxique.
Concernant les informations inutiles, il sagit gnralement du caractre espace et des commentaires.

1.2.2 Lanalyseur syntaxique


Lanalyseur syntaxique (appel Parser en anglais) a pour rle principal la vrification de la syntaxe du code en
regroupant les units lexicales suivant des structures grammaticales qui permettent de construire une
reprsentation syntaxique du code source. Cette dernire a souvent une structure en arbre. Notons que durant
cette phase, des informations, telles que le type des identificateurs, sont enregistres dans la table des
symboles
Exemple
La reprsentation sous forme darbre syntaxique de lexpression a := b + 2 * c ; est donne par la figure
1.3. Dans cette structure darbre, les nuds reprsentent des oprateurs et les feuilles de larbre reprsentent
les valeurs et les variables sur lesquelles seffectuent les oprations. La figure donne aussi le parcours qui est
fait sur cet arbre lors de lvaluation. Dautre parcours peuvent tre envisags pour raliser diffrentes tches,
cependant ces parcours ont lieu dans les phases ultrieures de la compilation.

:=
a

:=
+

a
*

+
b

Arbre syntaxique

:=
a
Valeur
de 2*c

1re tape : valuation


de 2*c

Valeur de
b+ 2*c

2me tape : valuation


de b+ (2*c)

3me tape : affectation du


rsultat a

Figure 1.3. Arbre syntaxique et parcours dvaluation

1.2.3 Lanalyseur smantique


Il comme rle principal le contrle du code source, pour dtecter ventuellement lexistence derreurs
smantiques, et la collecte des informations destines la production du code intermdiaire. Un des
constituants importants de la phase danalyse smantique est le contrle du type qui consiste vrifier si les
oprandes de chaque oprateur sont conformes aux spcifications du langage utilis pour le code source.
Exemple
Dans lanalyse smantique de a := b + 2 * c ; , il faut vrifier que, si a est de type entier, alors b et c le
sont aussi, sinon il faut signaler une erreur.

Compilation, L3 Informatique , Pr Souici-Meslati L., Universit dAnnaba, 2012/2013

Si on suppose que a, b et c sont de type rel, alors pendant lvaluation de lexpression, lanalyse smantique
aura comme tche dinsrer une opration de conversion de type pour transformer la valeur entire 2 en valeur
relle 2.0. Cela peut tre effectu sur larbre syntaxique comme le montre la figure 1.4 (arbre syntaxique
dcor).

:=
a

+
b
Conversion
entier-rel

*
c

2
Figure 1.4. Enrichissement de larbre syntaxique lors de la phase danalyse smantique

1.2.4 Le gnrateur de code intermdiaire


Certains compilateurs construisent explicitement une reprsentation intermdiaire du code source sous forme
dun code intermdiaire qui nest pas directement excutable par une machine spcifique. Cest plutt un code
gnr pour une machine abstraite (virtuelle), qui a la double caractristique dtre, la fois, facile produire,
partir de larbre syntaxique, et facile convertir pour une machine relle donne.
Exemple
Nous avons suppos que la machine abstraite est une machine une adresse qui dispose dun seul
accumulateur et dont le jeu dinstruction contient les instructions LoadValue, ConvReal, Mul, Add et Store. Elles
permettent de raliser les oprations donnes dans la deuxime colonne. Nous avons suppos aussi que a
occupe la premire entre dans la table des symboles, b occupe la deuxime et c la troisime.
Ainsi, le code intermdiaire de lexpression a := b + 2 * c ; , peut tre comme suit :
Code
LoadValue 2
ConvReal
Store temp1
Load temp1
Mul 3
Add 2
Store 1

Signification oprationnelle des instructions


Charger laccumulateur avec une valeur directe (2)
Convertir le contenu de laccumulateur en rel
Stocker le rsultat dans la variable temporaire temp1
Charger laccumulateur avec la valeur de temp1
Multiplier le contenu de laccumulateur par le contenu de
lentre 3 de la table de symboles (c)
Additionner le contenu de laccumulateur au contenu
lentre 2 de la table de symboles (b)
Ranger le contenu de laccumulateur dans lentre 1 de la
table de symboles (a)

1.2.5 Loptimiseur du code intermdiaire


Lors de la phase doptimisation, le code intermdiaire est chang pour amliorer les performances du code cible
qui en sera gnr. Il sagit principalement de rduire le temps dexcution et lespace mmoire qui sera occup
par le code cible. Loptimisation supprime, par exemple, les identificateurs non utiliss, limine les instructions
inaccessibles, limine les instructions non ncessaires, fait ressortir hors des boucles les instructions qui ne
dpendent pas de lindice de parcours des boucles, etc.
Loptimisation risque de ralentir le processus de compilation dans son ensemble mais elle peut avoir un effet
positif considrable sur le code cible qui sera gnr ultrieurement.

Compilation, L3 Informatique , Pr Souici-Meslati L., Universit dAnnaba, 2012/2013

Exemple
On constate dans lexemple prcdent que la valeur convertie 2.0 est stocke dans temp1 puis rcupre et
charge dans laccumulateur. Puisque aucun usage nest fait de temp1 dans le reste du code, il est possible
dliminer les deux instructions en question. Aprs conversion, le rsultat 2.0 reste alors dans laccumulateur et
sera utilis directement dans la multiplication. Noter que, loppos, si la conversion en rel de la valeur 2 est
souvent ncessaire, il serait prfrable de la stocker dans un espace temporaire. Cependant, ce dernier
augmente lespace rserv aux donnes dans le code cible.
Le nouveau code intermdiaire est le suivant :
Code
LoadValue 2
ConvReal
Mul 3
Add 2
Store 1

Signification oprationnelle des instructions


Charger laccumulateur avec une valeur directe
Convertir le contenu de laccumulateur en rel
Multiplier le contenu de laccumulateur par le contenu de
lentre 3 de la table de symboles
Additionner le contenu de laccumulateur au contenu
lentre 2 de la table de symboles
Ranger le contenu de laccumulateur dans lentre 1 de la
table de symboles

1.2.6 Le gnrateur du code cible


Cest la phase finale dun compilateur qui consiste produire du code cible dans un langage dassemblage ou
un langage machine donn. Le code gnr est directement excut par la machine en question ou alors il lest
aprs une phase dassemblage.
Exemple
Considrons une machine deux adresses qui dispose de deux registres de calcul R1 et R2. Nous supposons
que les variables a, b et c de la table des symboles ont comme adresses de cellules mmoires correspondantes
ad1, ad2 et ad3. Le code cible qui sera gnr pour cette machine est donn dans le tableau suivant :
Code
MOV R1, #2
CReal R1
MOV R2, ad3
MUL R1, R2
MOV R2, ad2
ADD R1, R2
STO R1, ad1

Signification oprationnelle des instructions


Charger R1 avec la valeur directe 2
Convertir le contenu de R1 en rel
Charger le registre R2 avec le contenu de la cellule
mmoire dadresse ad3
Multiplier le contenu de R1 par le contenu de R2, le
rsultat est dans le premier registre
Charger R2 avec le contenu de ladresse ad2
Additionner le contenu de R1 au contenu de R2, le
rsultat est dans le premier registre
Ranger le contenu de R1 dans la cellule mmoire
dadresse ad1

1.2.7 Le gestionnaire de la table de symbole


Les phases logiques de compilation changent des informations par lintermdiaire de la table des symboles.
Cest une structure de donnes (gnralement une table) contenant un enregistrement pour chaque
identificateur utilis dans le code source en cours danalyse. Lenregistrement contient, parmi dautres
informations, le nom de lidentificateur, son type, et lemplacement mmoire qui lui correspondra lors de
lexcution.
A chaque fois que lanalyseur lexical rencontre un identificateur pour la premire fois, le gestionnaire de la table
des symboles insre un enregistrement dans la table et linitialise avec les informations actuellement disponibles
(le nom). Lors de lanalyse syntaxique, le gestionnaire associera le type lidentificateur, alors que, lors de
lanalyse smantique, une vrification de types est opre grce cet enregistrement.

1.2.8 Le gestionnaire des erreurs


Son rle est de signaler les erreurs qui peuvent exister dans le code source et qui sont dtectes lors des
diffrentes phases logiques de la compilation. Il doit produire, pour chaque erreur, un diagnostic clair et sans
ambigut qui permettra la localisation et la correction de lerreur par lauteur du code source.

Compilation, L3 Informatique , Pr Souici-Meslati L., Universit dAnnaba, 2012/2013

1.3 Outils de construction des compilateurs


Suite au dveloppement des premiers compilateurs, on sest trs vite rendu compte que certaines tches lies
au processus de compilation peuvent tre automatises, ce qui facilite grandement la construction des
compilateurs. La notion doutils de construction de compilateurs est alors apparue.
La premire catgorie est reprsente par des outils gnraux appels Compilateurs de Compilateurs,
Gnrateurs de Compilateurs ou Systmes dcriture de traducteurs. Les outils de cette catgorie se sont
souvent orients vers un modle particulier de langages et ne sont adapts qu la construction de compilateurs
pour des langages correspondant ce modle.
La deuxime catgorie correspond des outils spcialiss dans la construction automatique de certaines phases
dun compilateur, tels que :
-

Les constructeurs ou gnrateurs automatiques danalyseurs lexicaux partir dune spcification


contenant des expressions rgulires

Constructeurs ou gnrateurs automatiques danalyseurs syntaxiques partir dune spcification base


sur une grammaire non contextuelle et en utilisant des algorithmes danalyse puissants mais difficile
mettre en uvre manuellement.

Compilation, L3 Informatique , Pr Souici-Meslati L., Universit dAnnaba, 2012/2013