Contenu connexe
Similaire à Compilationnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
Similaire à Compilationnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn (20)
Compilationnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
- 2. PLAN
1. Fondements de la compilation
2. Analyse lexicale
3. Analyse syntaxique
4. Analyse sémantique
© Compilation / M.MOURCHID, SMI, 2023-2024
2
- 4. SOMMAIRE
Pourquoi étudier la construction de compilateurs?
Qu’est-ce qu’un compilateur ?
Phases d’un compilateur
© Compilation / M.MOURCHID, SMI, 2023-2024
4
- 5. POURQUOI ÉTUDIER LA CONSTRUCTION DE COMPILATEURS?
Très peu de gens écrivent des compilateurs comme profession.
Alors pourquoi apprendre à construire des compilateurs ?
Ca vous rendra plus compétent :
Un informaticien compétent comprend les langages de haut niveau ainsi que
le matériel.
Un compilateur relie les deux.
Comprendre les techniques de compilation est essentiel pour comprendre
comment les langages de programmation et les ordinateurs interagissent.
Les algorithmes et les outils de compilations sont repris dans d’autres
domaines informatiques ( TALN, Parser des documents, ….)
I
© Compilation / M.MOURCHID, SMI, 2023-2024
5
- 6. POURQUOI ÉTUDIER LA CONSTRUCTION DE COMPILATEURS?
On compile ailleurs que dans les compilateurs :
Beaucoup d’applications contiennent de petits langages pour leur
configuration et pour flexibiliser leur contrôle :
les macros de Word, les scripts pour le graphisme et l’animation, les
descriptions de structures de données.
Les techniques de compilation sont nécessaires pour correctement
implanter des
langages d’extension.
Les formats de données sont aussi des langages formels. De plus en plus
de données en format interchangeable ressemblent `à un texte d’un langage
formel (p.ex. HTML, XML).
Les techniques de compilation sont utiles pour lire, manipuler et écrire
des données.
© Compilation / M.MOURCHID, SMI, 2023-2024
6
- 7. QU’EST-CE QU’UN COMPILATEUR ?
Le rôle d’un compilateur:
Le rôle principal d’un compilateur est de traduire des
programmes écrits dans un langage source donné en un
langage objet.
Souvent, le langage source est un langage de programmation
et le langage objet est un langage machine.
Quelques exceptions : traduction source-source, traduction de
code machine, manipulation de données en XML.
Une partie du travail du compilateur est aussi de détecter si
un programme donné est conforme aux règles du langage
source.
© Compilation / M.MOURCHID, SMI, 2023-2024
7
- 8. PHASES D’UN COMPILATEUR
Schéma d’un compilateur:
© Compilation / M.MOURCHID, SMI, 2023-2024
8
La phase frontale (ou phase d’analyse): traduit le code
source en une représentation intermédiaire (RI).
La phase arrière (ou phase de synthèse) traduit la RI
en un code cible.
- 9. PHASES D’UN COMPILATEUR
Partie frontale:
© Compilation / M.MOURCHID, SMI, 2023-2024
9
Rôle de la partie frontale d’un compilateur :La phase
frontale: traduit le code source en une représentation
intermédiaire (RI).
Reconnaissance des éléments du programme source.
Détection des erreurs.
Production de la RI.
Préparation du code pour la partie arrière.
- 10. PHASES D’UN COMPILATEUR
Partie frontale:
© Compilation / M.MOURCHID, SMI, 2023-2024
10
Analyseur lexical (Scanner) :
Rôle principal : délivrer les tokens à partir des flots de caractères (les
unités de base de la syntaxe).
Exemple: X = X + 1 devient:
< X, id >, < =, Opaff >, < X, id >, < +, Opadd>, < 1, Number >,
Rôle secondaire : éliminer les ´éléments inutiles (espaces, tabulations,
commentaires).
- 11. PHASES D’UN COMPILATEUR
Partie frontale:
© Compilation / M.MOURCHID, SMI, 2023-2024
11
Analyseur syntaxique (Parser) :
Reconnaître les unités syntaxiques.
Guider l’analyse sémantique (traduction dirigée par la syntaxe):
Construire la RI.
Produire les messages d’erreurs adéquats.
Faciliter la correction des erreurs.
- 12. PHASES D’UN COMPILATEUR
Partie frontale: Analyseur sémantique
L’analyseur sémantique contrôle le code pour s’assurer qu’il est
conforme aux spécifications du langage.
Il contrôle :
le typage.
le flot d’exécution : branchements après un break.
unicité des objets, des étiquettes, ...etc.
© Compilation / M.MOURCHID, SMI, 2023-2024
12
Analyseur syntaxique (Parser) :
Reconnaître les unités syntaxiques.
Guider l’analyse sémantique (traduction dirigée par la syntaxe):
Construire la RI.
Produire les messages d’erreurs adéquats.
Faciliter la correction des erreurs.
- 13. PHASES D’UN COMPILATEUR
Partie frontale: Analyseur sémantique
L’analyseur sémantique contrôle le code pour s’assurer qu’il est
conforme aux spécifications du langage.
Il contrôle :
le typage.
le flot d’exécution : branchements après un break.
unicité des objets, des étiquettes, ...etc.
© Compilation / M.MOURCHID, SMI, 2023-2024
13
Analyseur syntaxique (Parser) :
Reconnaître les unités syntaxiques.
Guider l’analyse sémantique (traduction dirigée par la syntaxe):
Construire la RI.
Produire les messages d’erreurs adéquats.
Faciliter la correction des erreurs.
- 14. PHASES D’UN COMPILATEUR
Partie arrière : Génération de code intermédiaire
Le générateur de code intermédiaire construit explicitement une
représentation intermédiaire du programme source.
Cette représentation intermédiaire doit être facile à produire et
facile à traduire en langage cible.
© Compilation / M.MOURCHID, SMI, 2023-2024
14
- 15. PHASES D’UN COMPILATEUR
Partie arrière :
Optimisation de code intermédiaire
L’optimiseur de code intermédiaire tente d’améliorer le code
intermédiaire de façon que le code machine résultant
s’exécute le plus rapidement possible.
Génération de code cible:
Le générateur de code cible produit le code cible, c’est-`a-
dire du code machine translatable ou du code en langage
d’assemblage.
Les emplacements mémoire pour chacune des variables
utilisées dans le programme sont s´sélectionnées.
© Compilation / M.MOURCHID, SMI, 2023-2024
15
- 17. L’ANALYSEUR LEXICAL
Rôle : l’analyseur lexical prend en entrée le flot de caractères constituant le
programme source et délivre les unités lexicales.
Le flot de caractères du programme source est lu de gauche à droite.
Les caractères formant un sens sont groupés en unités lexicales (tokens).
Les caractères superflus sont supprimés par l’analyseur lexical.
Une des tâches de l’analyseur lexical est d’ignorer les commentaires.
Unité lexicale (token) : c’est une suite de caractères ayant une signification
collective.
L’analyseur lexical doit aussi déterminer si chaque lexème est un mot correct du
vocabulaire du langage.
© Compilation / M.MOURCHID, SMI, 2023-2024
17
- 18. L’ANALYSEUR LEXICAL
Exemple
Soit l’instruction Pascal :
aire:=base*hauteur/2
L’analyse lexicale reconnait les lexèmes suivants :
Les unités lexicales reconnues sont :
<identificateur> aire
<affectation> :=
<identificateur> base
<opérateur> *
<identificateur> hauteur
<opérateur> /
<nombre> 2
© Compilation / M.MOURCHID, SMI, 2023-2024
18
aire := base * hauteur / 2
- 19. L’ANALYSEUR SYNTAXIQUE
Rôle : l’analyseur syntaxique prend en entrée un flot d’unités lexicales fournit par
l’analyseur lexical et délivre les unités syntaxiques.
Une unité syntaxique est une structure grammaticale représentée généralement par
des arbres dites « arbres syntaxiques ».
L’analyseur syntaxique doit également déterminer si chaque unité syntaxique est
une phrase correcte du langage, c’est-à-dire qu’elle vérifie sa grammaire. Cette
dernière est définie par un ensemble de règles de production.
© Compilation / M.MOURCHID, SMI, 2023-2024
19
- 20. L’ANALYSEUR SYNTAXIQUE
Exemple
L ’arbre syntaxique produit est :
© Compilation / M.MOURCHID, SMI, 2023-2024
20
Instruction d’affectation
identificateur := Expression
Expression Expression
Expression Expression
identificateur
identificateur
Nombre
base
hauteur 2
*
/
aire
- 21. L’ANALYSEUR SÉMANTIQUE
L’analyse sémantique contrôle si le programme source contient des erreurs
sémantiques et collecte des informations de type destinées à la phase de
production de code qui la suit.
L’analyseur sémantique prend en entrée l’arbre syntaxique délivré par l’analyseur
syntaxique pour identifier les opérateurs et les opérandes des expressions, ainsi que
les instructions.
La tâche importante de l’analyseur sémantique est la vérification de type. Par
exemple, dans la plupart des langages de programmation, l’indice d’un tableau doit
être de type entier et non pas de type réel.
© Compilation / M.MOURCHID, SMI, 2023-2024
21
- 22. L’ANALYSEUR SÉMANTIQUE
Une autre activité de l’analyseur sémantique est la conversion implicite de type.
Par exemple, additionner un « float » et un « int » ne se fait pas directement, il faut
transformer la valeur int en une valeur float (elles n’ont pas la même représentation
binaire).
Autres activités de l’analyseur sémantique :
Détecter les erreurs d’incompatibilité de types : opération sur deux types
incompatibles (« fichier + ensemble » ou « fonction * tableau »).
Détecter certaines erreurs de calcul : division par 0, racine carrée ou logarithme
d’un nombre négatif.
© Compilation / M.MOURCHID, SMI, 2023-2024
22
- 23. L’ANALYSEUR SÉMANTIQUE
Exemple
Ici l’analyseur sémantique va effectuer la conversion
implicite de type
© Compilation / M.MOURCHID, SMI, 2023-2024
23
:=
aire *
hauteur /
base Conversion « int réel »
2.0