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
[email protected]
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