Vous êtes sur la page 1sur 37

Compilation

SMI/S5
Compilation
Prof.: M. BENADDY
A.U. 2017-2018
Contenu du cours

Introduction
Analyse lexicale
Travaux pratiques (Lex,Flex)
Analyse syntaxique et smantique
Travaux pratiques (Yacc)
Gnration du code intermdiaire
Optimisation du code

Prof. M. BENADDY Compilation 1 2


Droulement

25 heures de cours
10 heures de TD
12 heures de TP

Prof. M. BENADDY Compilation 1 3


Evaluation

Note de l'examen final


Note des travaux pratiques et/ou mini projet

Prof. M. BENADDY Compilation 1 4


Rfrences
Compilers: Principles, Techniques, and Tools (2nd
Edition), Alfred V. Aho, Monica S. Lam, Ravi Sethi,
Jeffrey D. Ullman, Addison Wesley ; 2nd edition (2007)
Modern Compiler Implementation in Java, 2nd ed.
Andrew Appel, Cambrdige University Press (2004).
Lex & yacc (2nd Edition 1992), John R. Levine, Tony
Mason and Doug Brown, O'Reilly & Associates, Inc.
Engineering a Compiler Second Edition, Keith D.
Cooper Linda Torczon, Morgan Kaufmann, Elsevier, Inc.
(2012).
Programming Language, Third edition, Michael L. Scott,
2009 by Elsevier Inc.
Prof. M. BENADDY Compilation 1 5
Compilation

Chapitre 1 : Introduction gnrale

Prof. M. BENADDY Compilation 1 6


Introduction
Au dbut de linformatique on programme
directement les ordinateurs en langage machine,
Tche assez dur,
Solution : utiliser les possibilits de linformatique

pour faciliter le travail de programmation.


Un ordinateur reprsente toutes les informations
(donnes et programmes) par des suites de 0,1,
Le programmeur utilise des langages proches du
langage humain !!
Solution: un traducteur <=> compilateur/
interprteur
Prof. M. BENADDY Compilation 1 7
Langages compils/interprts

Langages compils : Se sont des langages o


toutes les instructions sont traduites en code
objet avant dtre excutes cette conversion est
effectue par un compilateur.
Langages interprts : Se sont les langages
dont les instructions sont dcodes et excutes
instruction/instruction lors de lexcution du
programme laide dun traducteur appel
interprte.

Prof. M. BENADDY Compilation 1 8


Famille des langages
Langages de bas niveau (1re et 2me gnration) :
Le langage machine,
Lassembleur.

Langages de haut niveau (3me gnration) :


les langages procduraux (Fortran, Cobol, Basic, Pascal,
Langage C, )
les langages orients objet (SIMULA, C++, Java,
SMALTALK, Object Pascal, EIFFEL, )
les langages orients listes (LISP, PROLOG,

PYTHON, ...)
Langages de 4me gnration : se sont des langages crs
pour des applications spcifiques (SQL, NOMAD, )
Prof. M. BENADDY Compilation 1 9
Famille des langages

Remarque : d'autres classifications peuvent tre


adopts, telles que :
Les langages dclaratifs (C, C++, Java, C#...)
Les langages fonctionnels (ML, HASKELL,)
Les langages de scripts (Awk, Javascript, Php, Perl,
Python, Ruby, Tcl,...)

Prof. M. BENADDY Compilation 1 10


Les compilateurs
Un compilateur est un programme qui lit le programme crit
dans un premier langage (langage source) et le traduit en un
programme quivalent crit dans un autre langage langage
cible ou langage destination.
La compilation est compose de deux parties essentielles :
lanalyse et la synthse.
Lanalyse : la partition du programme source en ces
constituants et en crant une reprsentation intermdiaire.
La synthse : gnre le programme cible partir de la
reprsentation intermdiaire.
Remarque : au cours du processus de traduction un rle
important du compilateur est de signaler lutilisateur la
prsence des erreurs dans le programme source
Prof. M. BENADDY Compilation 1 11
Les compilateurs
Remarque : Pendant lanalyse les oprations de spcifies
par le programme source sont dtermines et conserves
dans une structure hirarchique appele arbre abstrait
chaque nud de larbre reprsente une opration et les fils
des nuds reprsentent les arguments de cette opration.
Exemple : arbre abstrait

T=x+y*z
=
/\
T +
/\
X*
/\
Prof. M. BENADDY
Y z Compilation 1 12
Les compilateurs
Reprsentation schmatique :

Programme crit Compilateur Programme crit


en langage source en langage destination

Erreurs

Prof. M. BENADDY Compilation 1 13


Les compilateurs
Phases d'un compilateur

Phases d'analyse
Analyse lexicale
Analyse syntaxique

Table des Analyse smantique Gestion


symboles Gnration du code
Des
intermdiaire erreurs
Optimisation du code
Phases de synthse
Gnration du code objet

Programme cible

Prof. M. BENADDY Compilation 1 14


Les phases d'un compilateur
Analyse lexicale (scanner) : Trouver les mots du programme.
Il dcompose le texte du programme en lexme appel aussi
token ou unit lexicale, les tokens sont classs comme suit :
Les identificateurs : se sont les mots du programme forms
par lutilisateur pour lappellation des variables et des
constantes du programme,
Les mots cls : se sont les mots particuliers au langage
ayant un sens bien spcifique, ils sont diffrents dun langage
un autre,
Les constantes,
Les oprateurs : +, -,*,/, ou, et, non,
Les sparateurs : se sont les caractres de ponctuation telle
que le point virgule ( ;) la virgule (,),
Laffectation.
Prof. M. BENADDY Compilation 1 15
Les phases d'un compilateur
Analyse lexicale
Exemple : Mots cl Identificateurs Constantes Oprateurs Sparateurs Affectation

For, do, to i, s 1, 10 + ; :=

For i :=1 to 10 do
s :=s+i ;

Lanalyseur lexicale remplit galement tout les symboles du programme


et qui nappartient pas au langage comme les identifiants, les constantes,
..., dans la table des symboles.
Le code produit par la phase lexicale est une chane dunits lexicales,
Une unit lexicale est codifie par la paire (type, valeur (vallex)) o type
est le type de lunit lexicale savoir les identificateurs, les
constantes, ..., vallex est la valeur de lunit : si lunit est un
identificateur vallex sera une chane de caractres qui forme le nom de
cet identificateur.
Prof. M. BENADDY Compilation 1 16
Les phases d'un compilateur
Analyse lexicale
Exemple : l'instruction position = initial + rate*60
Est codifi : <id,1> <=> <id,2> < +> <id,3>*<60>
Remarque : les mots cls ainsi que les sparateurs sont
considrs comme des units nayant pas de valeurs ils
ne seront donc pas codifis que par le type.

Prof. M. BENADDY Compilation 1 17


Les phases d'un compilateur
Analyse Syntaxique : Appele aussi analyse hirarchique ou analyse
grammaticale,
Vrifier si la syntaxe de la chane code est conforme avec celle du
langage compiler,
Il consiste trouver les phrases du programme source partir des mots
donns par lanalyseur lexical, formellement cela consiste crer larbre
syntaxique, celui-ci dcrit la structure du programme.
Lanalyseur syntaxique se fait sur la base dune grammaire.
Gnralement la structure hirarchique dun programme est exprime
par des rgles rcursives.
Exemple :
Un identificateur est une expression,
Une constante est une expression,
Si expression 1 et expression 2 sont des expressions alors (expr1 +
expr2) est une expression (expr1*expr2) lest aussi.
Prof. M. BENADDY Compilation 1 18
Les phases d'un compilateur
Analyse Syntaxique :
Exemple : soit lexpression
position := initial + rate*60
position, initial, rate expression
60 expression
Rate*60 expression
initial + rate*60 expression

Prof. M. BENADDY Compilation 1 19


Les phases d'un compilateur
Analyse Syntaxique :
Exemple : soit lexpression
position := initial + rate*60

Prof. M. BENADDY Compilation 1 20


Les phases d'un compilateur
Analyse smantique : contrle si le programme source contient des
erreurs smantiques elle utilise la structure hirarchique dtermine
par la phase danalyse syntaxique pour identifier les oprateurs et les
oprandes des expressions ainsi que les instructions.
Cette analyse effectuera quelques contrles et quelques
modifications de larbre syntaxique et contrles portant par
exemple :

Sur la visibilit des variables c--d vrifier quils sont dclares
et visibles aux endroits o ils sont utiliss.
Sur le mode c--d vrifier les types utiliss. Ceci peut
ventuellement amener des modifications de larbre syntaxique
par lajout de nuds spciaux.
Par exemple pour le transtypage dun entier vers un rel, on
pourrait rajouter un nud entier vers rel qui indique quune
conversion doit tre faite.
Prof. M. BENADDY Compilation 1 21
Les phases d'un compilateur
Analyse smantique :
Exemple : soit X = X0 + V0*60, sachant que X, X0, V0
sont des rels
Larbre smantique correspondant larbre syntaxique
est :

Prof. M. BENADDY Compilation 1 22


Les phases d'un compilateur
Production du code intermdiaire : A partir des analyses
syntaxiques et smantiques un code simple de bas niveau (proche du
code machine) est gnr.
Ce code intermdiaire doit :
tre facile produire et facile traduire en langage cible.
Cette reprsentation intermdiaire peut prendre une grande varit
de forme, les plus utilises sont :
Le code post fix : cest un code dans lequel tout oprateur
apparat aprs ses oprandes. Cest un code prconis car les
oprateurs et les oprandes dans ce code apparaissent dans le
mme ordre qu lexcution.
Le code trois adresses : cest un code semblable au langage
dassemblage dune machine. Il est caractris par le fait que
linstruction contienne en plus un seul oprateur et trois
oprandes.
Prof. M. BENADDY Compilation 1 23
Les phases d'un compilateur
Production du code intermdiaire :
Exemple : id1 = id2 + id3*60
tmp1 = EVR(60)
tmp2 = tmp1*id3
tmp3 = tmp2+id2
id1 = tmp3

Le compilateur doit dcider dans quel ordre les oprations


doivent tre effectus, exemple : la multiplication prcde
laddition.

Prof. M. BENADDY Compilation 1 24


Les phases d'un compilateur

Optimisation du code : cette phase tante damliorer le code intermdiaire de


faon que le code machine rsultant sexcute plus rapidement.
Loptimisation peut se faire soit sur la taille du code soit sur la mmoire utilise par
le programme soit encore sur le temps dexcution.

Par exemple un algorithme produira le code intermdiaire en employant une


instruction pour chaque oprateur de la reprsentation arborescente obtenue
aprs lanalyse smantique, bien quil y est une meilleure manire deffectuer le
mme calcul avec les deux instructions :

tmp1 = id3 * 60
id1 = tmp1 + id2
le compilateur peut dduire lui mme que la conversion de lentier 60 en rel peut
tre effectue une fois pour toute au moment de la compilation de sorte que lon
peut liminer lopration entier vers rel. tmp3 nest utilise quune seule fois pour
transmettre sa valeur id1, on peut donc en toute scurit substituer id1 tmp3.
Parmi les optimisations courantes :
Le code constant dans une boucle peut tre sorti de celle-ci.
Prof. M. BENADDY Compilation 1 25
Les phases d'un compilateur
Optimisation du code :
Parmi les optimisations courantes :
Le code constant dans une boucle peut tre sorti de celle-
ci. for(i = 0 ; i<3 ; i++)
{
Opt b = 12 ;
for(i = 0 ; i<3 ; i++)
scanf(%d,&a) ; {
b = 12 ; scanf(%d,&a) ;
a=a+i; a=a+i;
printf(%d,a) ; printf(%d,a) ;
} }

Les calculs et les transtypages portant uniquement sur


des constantes peuvent tre faites la compilation.
Les parties du code inaccessibles peuvent tre
supprimes. If(cond1 || true)
Inst1 ;
Opt Inst1 ;

else inst2 ;

Prof. M. BENADDY Compilation 1 26


Les phases d'un compilateur
Optimisation du code : cette phase produit le code final
quivalent au programme de dpart.
Avant la gnration du code il faut connatre la forme du
code final et aussi larchitecture de la machine sur laquelle le
programme sera excut.
Gnralement le code cible consiste en langage
dassemblage.
On slectionne les emplacements mmoire pour chacune
des variables utilises dans le programme, ensuite les
instructions intermdiaires sont traduites en une suite
dinstructions machines qui effectuent la mme tche,

Prof. M. BENADDY Compilation 1 27


Les phases d'un compilateur
Optimisation du code :
Un aspect crucial de ce processus est lassignation de
variables aux registres, par exemple en utilisant les registres
R1 et R2 la traduction de linstruction id1 = id2 + id3*60 est :
MOVF id3,R2 Le F signifie float (rel)
MULF #60.0,R2 # constante interne
MOVF id2,R1
ADDF R2,R1
MOVF R1,id1

Prof. M. BENADDY Compilation 1 28


Les phases d'un compilateur
Synthse :

Prof. M. BENADDY Compilation 1 29


Les phases d'un compilateur
Gestion de la table des symboles :
Toutes les phases de compilation communiquent des
informations entre elles par lintermdiaire de la table des
symboles,
Chaque phase installe dans cette table les informations
ncessaires laccomplissement des phases ultrieures.
1)Lanalyse lexicale insre les identificateurs, les
constantes dans la table des symboles.
2)Lanalyse syntaxique est smantique associe chaque
identificateur sont type, chaque fonction son nombre
dargument et ses arguments, etc.

Prof. M. BENADDY Compilation 1 30


Les phases d'un compilateur

Gestion de la table des symboles :


3) Le gnrateur du code intermdiaire doit accder la table pour reprer le
types des oprandes afin de vrifier la compatibilit des types. Si le langage
permet le mixage des types, une instruction spcifiant une conversion de
type sera gnre. Le gnrateur doit mmoriser le nouveau type de
lidentificateur dans la table des symboles.
4) Lors de loptimisation du code tout identificateur rsultant par exemple
une expression liminer doit tre substitue par lidentificateur de
lexpression garder, le rsultat de cette modification doit figurer dans la
table.
5) On doit insrer dans la table des symboles linformation d est remplace
par a dans la suite du code.
6) Dans la gnration du code final on peut associer chaque identificateur
les registres qui doivent contenir sa valeur.
B = 12 ; opt B = 12 ;
C = 14 ; C = 14 ;
A=B+C; A=B+C;
D=B+C; (id,d)
Prof. M. BENADDY Compilation 1 31
Les phases d'un compilateur
Gestion des erreurs : La gestion des erreurs est une tape
importante du compilateur, il existe deux stratgies :
1)Soit on arrte ds quil y a une erreur.
2)Soit on essaie de resynchroniser et de dterminer le plus
prcisment possible la cause de lerreur.
Une bonne gestion des erreurs permet de dtecter un
maximum en mme temps, ce qui permet de les corriger
avant de ressayer la compilation.
Linconvnient de cette stratgie est quon peut avoir dautres
messages derreurs dues des erreurs prcdentes.

Prof. M. BENADDY Compilation 1 32


Les phases d'un compilateur
Gestion des erreurs :
Chaque phase de compilation dtecte son propre type derreur :
Lanalyse lexicale dtecte peu derreurs essentiellement les fautes de
frappe, il sagit de caractres interdits ou ayant une forme illgale pour le
langage (3x, , , ...).
Lanalyse syntaxique dtecte les erreurs de construction du programme
par exemple : en C une accolade rencontre un point manquant ou encore
fi(x==4) (fi est considr comme identificateur par lanalyseur lexical,
mais lanalyseur syntaxique dit que cette instruction est illgale.
Lanalyse smantique dtecte des erreurs de type, les variables non
dclares, etc.
Loptimiseur du code peut informer une instruction du programme ne
peut jamais tre accessible et par consquent jamais excute.
Le gnrateur du code objet peut indiquer qu'une valeur cre par le
compilateur est trop grande pour tre mmorise.

Prof. M. BENADDY Compilation 1 33


Les phases d'un compilateur
Regroupement des phases :
Les sections prcdentes traite lorganigramme logique
dun compilateur, pour acclrer le processus de
compilation, les diffrentes phases sont regroupes en
une phase.

Prof. M. BENADDY Compilation 1 34


Les phases d'un compilateur
Regroupement des phases :
Parties frontale et finale :
Les diffrentes phases sont souvent remise en une partie frontale
et une partie finale.
La partie frontale est constitues des phases qui dpendent
principalement du langage source, elle comprend lanalyse
lexicale, lanalyse syntaxique, la cration de la table des
symboles, lanalyse smantique, la production du code
intermdiaire et le traitement des erreurs associes chacune
de ces phases.
La partie finale comprend les portions du compilateur qui
dpendent de la machine cible, on trouve dans cette partie
certains aspects, de loptimisation du code ainsi que la
production du code objet avec les oprateurs ncessaires de
traitement des erreurs et de gestion de la table des symboles.
Prof. M. BENADDY Compilation 1 35
Les phases d'un compilateur
Regroupement des phases :
Les passes :
Une passe est un module qui rassemble plusieurs phases du
compilateur dune excution.
Dans une excution les diffrentes phases chevauchent entre
elles (en relation) que leurs activits sont entrelaces durant
lexcution de cette passe.
Il existe un choix entre deux options dimplantation.
1)La premire consiste lutilisation dun sous programme pour
chaque phase du processus, appel aussi le paralllisme.
2)La 2me consiste donner le contrle dune phase qui fait
appelle au module des autres phases au moment opportun.
Prof. M. BENADDY Compilation 1 36
Les phases d'un compilateur
Outils de construction de compilateurs :
Les grammaires hors contextes, pour lanalyse
syntaxique, et les expressions rgulires, pour l'analyse
lexicale sont deux abstractions les plus utiles utiliss dans
compilateurs modernes.
Lex/Flex (qui converti des dclarations en un programme
danalyse lexicale).
Yacc (Yet Another Compiler-Compiler), qui convertit une
grammaire en un programme danalyse syntaxique.

Prof. M. BENADDY Compilation 1 37