Vous êtes sur la page 1sur 25

Compilation

Pr. Khalid El Fahssi


Lien d’information

https://cutt.ly/sgSNfzL
Modalité de calcul de la note finale

Note= Examen final + la note de TP (Colle ou mini projet)


Sommaire

 Introduction et Généralités.
 Automates finis et expression régulière.
 Grammaires hors contexte et automates à pile.
 Analyse lexicale.
 Analyse syntaxique.
 Analyse sémantique.
 Génération de code.
Introduction et Généralités
 Au début de l’informatique on programme directement les
ordinateurs en langage machine,
 Tache assez dur,
 Solution : utiliser les possibilites de l’informatique
pour faciliter le travail de programmation.
 Contrainte:
 Un ordinateur represente toutes les informations (donnees et
programmes) par des suites de 0,1,
 Le programmeur utilise des langages proches du langage
humain !!s
 Solution:
 un traducteur <=> compilateur /interpréteur
Introduction et Généralités
Compilateur
 Un compilateur est un programme
1 qui lit un autre programme rédigé dans un langage de
programmation, appelé langage source
2 et qui le traduit dans un autre langage, le langage cible.
 Le compilateur signale de plus toute erreur contenue dans le
programme source
 Lorsque le programme cible est un programme exécutable, en
langage machine, l’utilisateur peut ensuite le faire exécuter afin
de traiter des données et de produire des résultats.
Introduction et Généralités
Les interpréteur
 Les interpréteurs sont des programmes qui traduisent directement
le programme source en des commandes exécutables
immédiatement.

 Question: Quel est la différence entre compilateur et


interpréteur?
Un compilateur prend tout le
programme et le convertit en code objet Un interpréteur exécute directement
qui est généralement stocké dans un des instructions écrites dans un langage
fichier. Le code objet est également de programmation ou de script sans les
référencé en tant que code binaire et convertir en un code objet ou un code
peut être exécuté directement par la machine.
machine après la liaison.
Introduction et Généralités
 Principe de Compilateur
Programme Programme
Source Compilateur Cible
Phases Phases
Analyse Synthèse

Messages d’erreurs
Un compilateur est décomposé en deux phases principales:
• Phases d’analyse: Permettent de dégager les constituants d’un programme source dans
une représentation intermédiaire
• Phases de synthèse: Permettent de construire le programme cible à partir de cette
représentation intermédiaire.
Exemple:
• 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)
Introduction et Généralités
 Arbre abstrait:
Pendant l'analyse, les opérations spécifiées par le programme source sont déterminées et
conservées dans une structure hiérarchique appelée arbre abstrait.

 Un arbre abstrait est constitué de noeuds qui représentent les opérations et les
fils des noeuds qui représentent les arguments des opérations

 Exemple : Soit l'instruction: A = B1 + B2 * 60


Son arbre abstrait est:

=
A +
B1 *
B2 60
Introduction et Généralités
Exemple:

 programme source  programme cible


entier d; f:
push ebp
f(entier a, entier b) mov ebp, esp
entier c, entier k; sub esp, 8
{ mov ebx, [ebp + 12]
push ebx
k = a + b; mov ebx, [ebp + 8]
retour k; push ebx
...
} main:
main() push ebp
{ mov ebp, esp
sub esp, 8
d = 7; push 7
ecrire(f(d, 2) + 1); pop ebx
mov [d], ebx
} ...
Introduction et Généralités
 Structures d’un compilateur
Un compilateur typique se décompose en 6 phases élémentaires: 3 phases d’analyse et 3 phases de
synthèse. Deux autres tâches interagissent avec les six phases : la gestion d’une table des symboles et
la détection des erreurs.

Programme
Analyseur lexical
source

Analyseur syntaxique

Table des Analyseur sémantique Gestion des


symboles erreurs
Générateur de code intermédiaire

Optimiseur de code

Programme
Générateur de code final
Cible
Introduction et Généralités
 Phases d’un compilateur
Phase Description Exemple
Permet de reconnaître les unités lexicales ou identificateurs

lexèmes (Identificateurs, mots clés du langage; y := a * b + 30


Analyseur lexical
l’affectation et opérateurs (+,*,...)).
Affectation opérateurs nombre

Permet de vérifier les entités en entrée :=


apparaissent conformément ou non aux règles y +
Analyseur syntaxique
définissent la grammaire du langage.
* 30

Permet de contrôler la cohérence sémantique y:=a*b+30 erreura si b


du programme source: y et a sont des
:=
-Vérifie la cohérence des types des variables et entiers alors que b
est de type caractère y +
Analyseur sémantique des expressions
-Procède parfois à des conversions (entier vers * conversion
réel). entier réel

a b
-……..
12
Introduction et Généralités
 Phases d’un compilateur

Phase Description Exemple


Permet de construire une représentation Pour y:=a*b+30 on trouve:
intermédiaire des programmes sources t1←ER(30)
Générateur de code
indépendante de tous les langages de t2←id2*id3
intermédiaire
programmations. t3←t2+t1
id1←t3
Permet d’améliorer le code intermédiaire par t1←id2*id3
Optimiseur de code la réduction du nombre de variables et id1←t1+30.0
d’instructions
Permet de choisir des emplacements Mov R2, id2
mémoire pour les variables et de les assigner Mul id3; (R2= Al, Ax ou Eax)
Générateur de code
aux registres. Mov R1, 30
final
Add R1, R2
Mov id1, R1
Introduction et Généralités
 Phases d’un compilateur

Phase Description Exemple


Permet de stocker toutes les informations nécessaires Table des
sur les lexèmes (mots) du programmes source symboles
Gestion de table des id1 y
symboles
id2 a
id3 b

Après avoir détecter une erreur, une phase doit la -Erreur lexicale,
signaler et la traiter de telle façon que le compilateur -Erreurs syntaxique,
Gestion des erreurs puisse continuer son traitement et que d’autre erreurs -Erreur sémantique,
puissent être détectées.
-……
Introduction et Généralités
 Phases d’un compilateur
Analyseur lexical Analyseur syntaxique Analyseur sémantique

y:=a*b+30 id1:=id2*id3+nombre
Tables des
symboles
id1 y Mov R2, id2
Mul id3; (R2= Al, Ax ou Eax)
id2 a
Mov R1, 30
id3 b Add R1, R2
Mov id1, R1

Générateur de code
Générateur de code Optimiseur de code intermédiaire

t1←id2*id3 t1←ER(30)
id1←t1+30.0 t2←id2*id3
t3←t2+t1
id1←t3
Introduction et Généralités
 Environnement d’un compilateur
La création d’un programme cible exécutable requiert en fait plusieurs programmes en plus du strict
compilateur.
Eventuellement dispersé dans différents fichiers
Programme source Contient des définition de macros…….

Remplace les macros par leur définition


Préprocesseur Crée un fichier unique

Compilateur Programme cible en langage d’assemblage

Assembleur Code machine translatable

Relieur-chargeur Inclut les bibliothèques

16
Code machine absolu
Introduction et Généralités
 Compilateur et interpréteur

Algorithme

Editeur de texte

Programme source Programme source

Erreurs de Résultat
Compilateur Données Interpréteur
compilation Erreurs

Editeur de lien Erreurs d’édition


de lien Exemples: Lisp, Perl, Prolog, …
Programme cible
Résultats
Données Processeur Erreurs
d’exécution
17
Exemples: Pascal, C, C++, Java,…
Introduction et Généralités
 Outils pour la construction d’un compilateur
Introduction et Généralités
 Gestion de la table des symboles:
Une table des symboles est une structure de données contenant
un enregistrement pour chaque identificateur, muni de
champs pour ses attributs (emplacement mémoire, son type, sa
protée..).
 Pour les fonctions, la table des symboles garde le nombre
et les types de ses arguments, le mode de passage de chacun d'eux et la
valeur de retour.
Introduction et Généralités
 Traitement des erreurs:
Chaque phase peut rencontrer des erreurs.
Après avoir détecté une erreur, une phase doit la traiter de
telle façon que la compilation puisse continuer et que
d'autres erreurs dans le programme puissent être détectées.
 Chargeurs et relieurs (édition de liens):
Charger les fichiers et les fonctions des bibliothèques et les
relier pour la production du code exécutable.
Introduction et Généralités
 Exemple
 Traduction de l’instruction
 position = initial + rate * 60
Introduction
position = initial + rate * 60

Analyseur lexical

id1 = id2 + id3 * 60

Analyseur
syntaxique

=
id1 +
id2 *
id3 60

Analyseur
sémantique
=
id1 +
id2 *
id3 inttoreal

60

temp1 = inttoreal (60)


temp2 = id3 * temp1
temp3 = id2 + temp2
id1 = temp3
Optimiseur de code

temp1 := id3 * 60.0


id1 := id2 + temp1

Générateur de code

MOV id3, R2
MUL #60.0, R2
MOV id2, R1
ADD R2, R1
MOV R1, id1
Introduction et Généralités
position …
initial …
rate …
… …
… …

La phase finale d’un compilateur est la production du code cible, qui consiste normalement en du code
machine translatable ou en code en langage d’assemblage.

Vous aimerez peut-être aussi