Préprocesseur. Transformations sur un code source, avant la
compilation. Prise en compte de macros (#define) et des inclusions
de fichiers (#include).
Assembleur. Certain compilateurs produisent du code en langage
d’assembleur. Il faut donc produire du code machine
"translatable".
Chargeur. Le code "translatable" est modifié à absolu et placé en
mémoire aux emplacements appropriés.
Relieur (éditeur des liens). Il permet de constituer un programme
unique à partir de plusieurs fichiers contenant du code
"translatable".
Autre phases de compilation
Partie frontale ou d’Analyse.
Phases qui dépendent du langage source : lexicale,
syntaxique.
Partie finale ou de Synthèse.
Phases qui dépendent de la machine cible.
Regroupement de phases
--> On peut être amené a écrire seulement une de ces deux parties.
Partie
frontale
(analyse)
Programme en
langage source
Programme en
langage cible
Partie
finale
(synthèse)
code
intermédiaire
Passes : nombre de lectures du fichier source (une en général).
Compromis entre nombre de passes et la mémoire nécessaire.
Importance des grammaires
Compilation
Partie frontale d’un compilateur
Traduction dirigée par la syntaxe
Description d’un langage source :
• Syntaxe : grammaire non contextuelle.
• Sémantique : descriptions plus ou moins formelles ou des
exemples.
Une grammaire non contextuelle permet de :
• Spécifier la syntaxe
• Guider la traduction : traduction dirigée par la syntaxe.
Très utile pour organiser la partie frontale.
La traduction dirigée par la syntaxe est une combinaison d’un
analyseur syntaxique et d’un générateur de code intermédiaire.
Grammaire
L’ensemble de phrases syntaxiquement correctes d’un langage est
décrit par une grammaire.
Expression
suite de
caractères
Analyse
lexicale
suite
d’unités
lexicales
Traduction
dirigée par
la syntaxe
Représentation
intermédiaire
Une grammaire est un quadruplet G = (VT,VN, S0, P) où
•VT est l’ensemble de symboles terminaux (unités lexicales),
•VN est l’ensemble de symboles non terminaux,
•S0 VN est l’axiome ou symbole de départ,
• P est l’ensemble de productions (règles de grammaire) de la
forme
Grammaire
Une phrase générée par la grammaire G est obtenue en partant du
symbole initial et en appliquant des productions P jusqu'à
l'obtention des terminaux.
Le langage L(G) est l’ensemble de toutes les phrases que l’on peut
générer avec G. Formellement, on écrit :
L(G) = { w
Vt* | S0 w }
*
Exemple
•VT = {il, elle, est, boit, vite, beau}
•VN = {<pronom>, <verbe>, <adj>, <phrase>}
•S0 = <phrase>
• P = { <phrase> <pronom> <verbe> <adj> ,
<pronom> il | elle ,
<verbe> est | boit ,
<adj> vite | beau } Rmq : certaines phrases
n’ont pas de sens (il boit beau)