Programme GIT/M1
Spécification & Traduction des langages
COMPILATION
Module1a
Chargé de cours:
Dr Yacouba GOÏTA
Tél : 72.21.09.60
Email : [email protected]
WEBOGRAPHIE
Algorithmique et bases de la programmation : Introduction à la
Compilation - Nicolas Delestre - INSA ROUEN
https://moodle.insa-rouen.fr/file.php/698/CM/Compilation.pdf
Introduction à la compilation: Cours 1 – Yann Régis-Gianas PPS –
Université Denis Diderot – Paris 7 (2010)
http://www.pps.jussieu.fr/~yrg/compil/compilation-slides-cours-1.pdf
Introduction à la compilation Christine Paulin-Mohring – Université Paris
Sud – Master Informatique 2009-2010
http://www.lri.fr/~paulin/COMPIL/slides-2009-1.pdf
Compilation – Alexis Nasr – http://pageperso.lif.univ-
mrs.fr/~alexis.nasr/Ens/Compilation/intro_compil.pdf
Cours M Hammemi Moez - ISG de Tunis (2007)
Cours Mme El Abed Lamia - ISG de Tunis (2007)
Cours – Annie Corbel 1999
http://www.emse.fr/~corbel/COMPIL/index.html
2 Cours Compilation
PREREQUIS
Théorie des langages formels: expressions
régulières, automates, grammaires, ambiguïté
Langages de programmation
Algorithmique
3 Cours Compilation
Objectif
POURQUOI?
QUOI?
COMMENT?
4 Cours Compilation
plan
Définition: compilateur
Analyse lexicale (linéaire)
Analyse syntaxique (hiérarchique)
Analyse sémantique
Génération du code intermédiaire
Optimisation du code
Génération du code objet
5 Cours Compilation
POURQUOI? (1)
Si vous deviez écrire un programme capable
d‘évaluer (au sens de calculer) des expressions
arithmétiques qu'un utilisateur aurait saisies au
clavier
Par exemple : ≪ (24+45.5)/87*1.2E3 ≫
Comment procéder ?
6 Cours Compilation
POURQUOI? (2)
Ecrire des procédures et des fonctions permettant
De reconnaitre un entier
De reconnaitre un réel
De reconnaitre une addition
...
➔ C'est compliqué pour quelque chose de simple
➔ A la moindre modification tout est à
reprogrammer
7 Cours Compilation
POURQUOI? (3)
Il faut suivre des méthodes et des
techniques afin de résoudre ce type de
problème :
C'est le rôle de la COMPILATION
8 Cours Compilation
QUOI? (1)
C'est un programme qui traduit un
programme écrit dans un langage source
vers un langage cible en indiquant les
erreurs éventuelles que pourrait contenir le
programme source
programme programme
compilateur
source cible
messages
d'erreur
9 Cours Compilation
QUOI? (2)
Premier compilateur : compilateur Fortran de
J. Backus (1957)
Langage source : langage de haut niveau (C,
C++, Java, Pascal, Fortran...)
Langage cible : langage de bas niveau
(assembleur, langage machine)
10 Cours Compilation
COMMENT? (1)
Et comment ça marche ?
Comme un enfant qui apprend à lire...
On reconnait d'abord les mots
Analyse Lexicale
Puis, on vérifie que tous les mots sont dans le bon
ordre
Analyse Syntaxique
Enfin, on vérifie que tout ceci a un sens
Analyse Sémantique
11 Cours Compilation
Structure Globale
En deux parties :
analyse/reconnaissance
synthèse/transformation
Partie Partie
Texte Rep Texte
Avant Arrière
source sémantique cible
(analyse) (synthèse)
12 Cours Compilation
Les phases de la compilation
programme source
analyseur lexical
analyseur syntaxique
analyseur sémantique
gestion de la
table des symboles générateur de code intermédiaire gestion des erreurs
"optimiseur" de code
générateur de code cible
programme cible
13 Cours Compilation
Analyse lexicale (1)
Lit le programme source
Reconnaît les séquences de caractères
significatives appelées lexèmes
Pour chaque lexème, l’analyseur lexical émet
un couple
(type du lexème, valeur du lexème | @ dans la table de symboles)
Exemple : (NOMBRE, 123)
14 Cours Compilation
Analyse lexicale (2)
Les types de lexèmes sont des symboles, ils
constituent les symboles terminaux de la
grammaire du langage
Les symboles terminaux de la grammaire (ou
types de lexèmes) constituent l’interface entre
l’analyseur lexical et l’analyseur syntaxique
Les types de lexèmes doivent être connus des
deux
15 Cours Compilation
Analyse lexicale (3)
Table de
symboles
16 Cours Compilation
Analyse lexicale (4)
Exemple:
position := initiale + vitesse*60
<id1,1> <aff,:=> <id2,2> <op,+> <id3,3> <op,*>
<nb,60>
Table de symboles
1 position …
2 initial …
3 rate …
17 Cours Compilation
Analyse lexicale(5)
Comment reconnaitre les mots?
Les lister : avoir un dictionnaire de mots clefs
Mais certains mots sont génériques :
Les nombres
Les identifiants des programmes (variable,
fonction/procédure, etc.)
Il faut avoir un outil permettant de les caractériser
expressions régulières
18 Cours Compilation
Analyse lexicale(6)
Comment on implante tout ça ?
La théorie montre que toute expression régulière peut
être représentée à l'aide d'un automate (et inversement)
Problème de différenciation entre identificateurs et
mots clés
19 Cours Compilation
Analyse syntaxique(1)
Vérifie que la suite des unités lexicales (lexèmes)
fournie par l’analyseur lexical est compatible avec
une grammaire et produit en sortie un arbre d'analyse
(arbre syntaxique)
grammaire hors contexte (ou notation BNF) qui sert à
décrire la syntaxe du langage
Deux types d'analyse : Ascendante ou Descendante
20 Cours Compilation
Analyse syntaxique(2)
Exemple: (Arbre d’Analyse Descendante )
<id1,1> <aff,:=> <id2,2> <op,+> <id3,3> <op,*> <nb,60>
Affectation
id := expr
position expr + expr
id expr * expr
initiale id nombre
vitesse 60
21 Cours Compilation
Analyse sémantique(1)
Vérifie la cohérence de l'arbre d'analyse
Collecte d'informations destinées à la production de
code
L’analyse sémantique utilise l’arbre abstrait, ainsi que
la table de symboles afin d’effectuer un certain
nombre de contrôles sémantiques
l’arbre abstrait
Analyse contrôles
la table de symboles Sémantique sémantiques
22 Cours Compilation
Analyse sémantique(2)
parmi lesquels :
Vérifier que les variables utilisées ont bien été
déclarées
Au contrôle de type : le compilateur vérifie que les
opérandes d’un opérateur possèdent bien le bon type
conversions automatiques de types
23 Cours Compilation
Analyse sémantique(2)
Exemple:
:= :=
id1 + id1 +
id2 * id2 *
id3 60 id3 EntierVersReel
60
24 Cours Compilation
Génération du code intermédiaire
Programme pour une machine abstraite
Code facile à produire, à traduire en langage
cible
Exemple: code à 3 adresses
:=
temp1:=EntierVersReel(60)
id1 +
temp2:=id3*temp1
id2 *
temp3:=id2+temp2
id3 EntierVersReel id1:=temp3
60
25 Cours Compilation
Optimisation du code
Optimiser le code intermédiaire en éliminant
les opérations inutiles pour produire du code
plus efficace et pour une exécution machine
plus rapide
Exemple:
temp1:=EntierVersReel(60)
temp2:=id3*temp1 temp1:= id3 * 60.0
temp3:=id2+temp2 id1:= id2 + temp1
id1:=temp3
26 Cours Compilation
Génération du code machine
Obtention du code machine
MOVF id3, R2
MULF #60.0, R2
temp1:= id3 * 60.0 MOVF id2, R1
id1:= id2 + temp1 ADDF R2, R1
MOVF R1, id1
27 Cours Compilation
Récapitulatif...
temp1:=EntierVersReel(60)
temp2:=id3*temp1
position := initiale + vitesse * 60 Analyseur
temp3:=id2+temp2
sémantique
id1:=temp3
Analyseur lexical :=
id1 + Optimiseur de
id1 := id2 + id3 * 60 code
id2 *
Analyseur temp1:= id3 * 60.0
syntaxique id3 EntToReel id1:= id2 + temp1
60
Générateur de
:= code
Générateur code
id1 + intermédiaire MOVF id3, R2
MULF #60.0, R2
id2 * MOVF id2, R1
ADDF R2, R1
id3 60 MOVF R1, id1
28 Cours Compilation
TAF
RECHERCHE
LEX/YACC
ANTLR
29 Cours Compilation