Académique Documents
Professionnel Documents
Culture Documents
LA COMPILATION
Section : SMI - Semestre 5
A.U: 2022-2023
abderrahim.tragha@univh2c.ma
1
C’EST QUOI LA COMPILATION ?
2
CHAINE DE DÉVELOPPEMENT D’UN PROGRAMME
Problème à résoudre
’ ’
’ ’
3
DÉFINITION
4
UN INTERPRÉTEUR
une instruction
’ ’
5
DIFFÉRENCE ENTRE INTRPÈTEUR ET COMPILATEUR
6
➤ Il existent des langages à mi-chemin de l’interprétation et la
compilation. On les appelle langages P-Codes ou Pseudo-Codes.
➤ Le code source est traduit (compilé) dans une forme binaire
compacte (du pseudo code ou P-code) qui n’est pas encore du code
machine.
➤ Lorsque l’on exécute le programme, ce code est interprété.
➤ Par exemple en Java, le prog. source est compilé pour obtenir un
fichier (.class) byte code qui sera interprété par une machine
virtuelle. De même pour le langage Python.
7
POURQUOI CE COURS ?
8
STRUCTURE D’UN
COMPILATEUR
9
COMPOSITION D’UN COMPILATEUR
Il se compose de deux phases
➤ Phase d’Analyse :
• reconnaitre les variables, les instructions, les opérations
• élaborer la structure syntaxique du programme
• ainsi que certaines propriétés sémantiques
➤ Phase production :
• Produire le code cible et l’optimiser
10
PHASE D’ANALYSE
➤ Analyse lexicale
➤ Analyse syntaxique
➤ Analyse sémantique
11
PHASE DE PRODUCTION
➤ Production de code
• Produire les instructions en langage cible
➤ Optimisation du code
• Améliorer le code produit afin que le programme résultant
soit plus rapide
12
PHASES EN PARALLÈLE
➤ Gestion de la table des symboles
if (i< a+b) // un simple test
X= 2* X ;
13
14
ANALYSE LEXIQUE
15
ANALYSEUR LEXICALE
➤ les taches principales :
• lire les caractères (un par un) du programme initial
• donner la suite des unités lexicales à l’analyseur syntaxique qui vas les
traiter
➤ les taches secondaires :
• éliminer les informations inutiles (commentaires, retours à la ligne,
espaces superflus, …
• créer la table de symboles rencontrés dans le programme initial
• détecter certaines erreurs (caractères non autorisés, nombre mal
écrit, …)
16
UNITÉS LEXICALES ET LEXÈMES
➤ Une unité lexicale est une suite de caractères qui a une signification collective.
- les chaines <, <=, >, >=, ==, <> sont des opérateurs relationnels. L’unité lexicale
OPREL (par exemple)
- les chaines toto, Tab, MONTANT, Tax2 sont des identificateurs unité lexicale IDENT
- if, else, while sont des mots réservés (mots clés)
( , ) , ; sont des séparateurs
➤ Un modèle est une règle associée à une unité lexicale qui décrit l’ensemble des
chaines du programme qui peuvent correspondre à cette unité lexicale
➤ On appelle lexème toute suite de caractère du programme source qui concorde
avec le modèle d’une unité lexicale.
17
Exemples :
18
TECHNIQUES UTILISÉES PAR L’ANALYSEUR LEXICAL & LES
PRINCIPES DE BASE
19
OUTILS POUR CONSTRUIRE UN ANALYSEUR LEXICAL
(Fast Lexer) est un compilateur pour la génération automatique
d’analyseurs lexicaux.
➤ Flex prend en entrée un fichier source Flex et produit en sortie un
fichier contenant le code C (ou C ++) du future analyseur lexical.
➤ Un fichier Flex est un fichier texte qui contient des spécifications
d’unités lexicales (sou forme d’expressions régulières) suivies
d’actions(à exécuter) écrites en langage C
20
ANALYSE
SYNTAXIQUE
21
ANALYSEUR SYNTAXIQUE
➤ L’analyseur syntaxique reçoit une suite d’unités lexicales de la part
de l’analyseur lexical et doit vérifier si cette suite peut être
engendrée par la grammaire du langage. (analyse descendante ou
ascendante)
➤ cela en essayant de construire un arbre de dérivation ou arbre
syntaxique.
➤ Si la suite des unité lexicales n’est pas en conforme avec la
grammaire le message d’une erreur sera affiché
➤ Sinon (aucune erreur n’est détecté) l’analyser génère un arbre
syntaxique est généré par l’analyseur syntaxique
22
EXEMPLE :
➤ if (x>10) a=a+b ;
cond if
> =
x 10 a +
a b
23
TECHNIQUES UTILISÉES PAR L’ANALYSEUR
SYNTAXIQUE
➤ les grammaires hors contexte
24
OUTILS POUR L’ANALYSEUR SYNTAXIQUE
http://langevin.univ-tln.fr/CDE/LEXYACC/Lex-Yacc.html 25
LES EXPRESSIONS
RÉGULIÈRES
26
NOTIONS DE BASE
➤ Alphabet : ensemble fini et non vide ∑ de symbols
➤ Mot ou chaine : une séquence de symboles de ∑ juxtaposés. la
longueur d’un mot w est le nombre des symboles qui le
composent et sera noté |w|
(Exemple: dans ∑={a, b, c, …,z} |abd|=3, |errahim| =7 ,
dans ∑={0, 1, espace} |01 101|=6, |10|=2 et |0|=1 )
➤ Le mot de longueur 0 est le mot vide(ou la chaine vide) et sera
notée 𝜀
➤ Langage : ensemble (fini ou non) de mots composés des
symboles de ∑
27
NOTIONS DE BASE
➤ La concaténation de deux mots U=u1u2…un et V=v1v2…vp de l’alphabet ∑ est le mot
U.V= u1u2…unv1v2…vp où ui vj ∈ ∑
(Rq : |U.V| = |U|+|V| U.𝜀 = 𝜀.U=U
Ex: U=bon V=jour U.V= bonjour mais V.U = jourbon ;
La concaténation est une loi de composition interne non commutative, elle admet comme 𝜀 élément
neutre)
➤ La concaténation de 2 langages L1 et L2 est le langage L1.L2 ={U.V tel que U∈ L1 et V ∈L2 }
➤ Soit ∑ un alphabet, on note ∑* et on l’appelle l’étoile de Kleene l’ensemble de toutes les chaines
possibles composées des symboles de ∑ dont 𝜀 est parmi eux.
➤ On note aussi ∑n l’ensemble des chaines de ∑ de longueur n
On définit ∑+ l’ensemble de tous les mots non vide de ∑* on peut écrire ∑*= ∑+ ∪{ 𝜀 }
28
LANGAGES RÉGULIERS
➤ Problème à résoudre: comment décrire tous les mots d’un langage ?
➤ ∃ plusieurs types de langages certains sont simples à décrire et d’autres
sont difficiles. Nous nous intéressons dans un 1er temps aux langages
réguliers.
➤ Définition: (récursive) soit ∑ un alphabet,
∅ est un langage régulier sur ∑
{𝜀} est un langage régulier sur ∑
Pour tout symbole s de ∑ { s } est un langage régulier sur ∑
Si L et H sont deux langages réguliers sur ∑
alors L∪H , L.H , L* sont des langages réguliers sur ∑
29
EXPRESSIONS RÉGULIÈRES
➤ Les langages réguliers se décrivent facilement à l’aide des expressions régulières (ER).
➤ Définition: (récursive) soit ∑ un alphabet,
ø est une ER qui décrit le langage vide ∅
𝜀 est une ER qui décrit le langage {𝜀}
s est une ER qui décrit le langage {s} où s appartient à ∑
si r1 et r2 sont des ER qui décrits respectivement les langages L1 et L2
alors r1|r2 est une ER qui décrit L1 ∪ L2
r1.r2 " " " " " " L1.L2 On peut la noter seulement par r1r2
r1* " " " " " " L 1*
➤ Dans une formule des ER s’il n’y a pas des parenthèses, on conviendra la priorité décroissante : * , . ,
|
➤ Nous ajoutons l’opérateur + en posant r1+ est une ER qui décrit L1+
➤ Dans le cas où les symboles sont ordonnés on utilise l’opérateur .. : s1.. s2 pour désigner tous les
symboles qui existent entre s1 et s2 Exemple: A..E désigne A|B|C|D|E
30
EXEMPLES D’EXPRESSIONS ET DE LANGAGES
RÉGULIERS
➤ 1* décrit { 𝜀, 1, 11,111, 1111, 11111, …}
31
EXEMPLES
➤ ab* décrit {a, ab, abbé, abbb, abbbb, …}
➤ a*b* décrit {𝜀, a, aa, aaa, aaaa, …, b, ab, aab, aaab, aaaab, …,bb, abb, aabb, aaabb, …, bbb, abbb,
… …} ={aibj avec i, j entiers positifs}≠
{anbn n entiers positif}
➤ (ab)* ={𝜀, ab, abab, ababab, ….}
➤ (a | b |c)*(c | ø) décrit l’ensemble de toutes les chaines composées des a,b et c dont le dernier
symbole est c ={c, ac, bc, cc, bac, abc, acc, bac, bbc, bcc, bac, cbc, ccc, …}
Questions
32
Exemples :
Unité
Modèle expression régulière
lexicale
33
DÉFINITION & PROPRIÉTÉS
➤ Un langage d’un alphabet est dit régulier s’il peut être décrit par une
expression régulière.
34
PROBLÉMATIQUE
➤ Si les expressions régulières servent à développer manuellement des
modèles. Comment vérifier si un lexème concorde avec le modèle d’une
unité lexicale?
SOLUTION
➤ L’utilisation des automates finis déterministes (DFA).
➤ A chaque modèle (Expression Régulière), construire un DFA, puis
développer un programme de simulation.
35
LES AUTOMATES
FINIS
36
AUTOMATES FINIS DÉTERMINISTES (Deterministic
Finite Automata)
Fonctionnement d’un DFA : DFA
37
EXEMPLES DFA
➤ L’ascenseur
➤ Le guichet bancaire automatique
➤ Distributeur des boissons
➤ Billetterie automatique
➤ Machine à laver
➤ Lave vaisselle
➤ …
38
DFA : DEFINITION FORMELLE
➤ Un automate fini déterministe (DFA) est défini par un 5-uplet (Q , ∑ ,
𝛿 , q0 , F) où :
Q : ensemble des états (fini)
∑ : alphabet (symboles d’entrés)
q0 : état initial ∈ Q
F : ensemble des états finaux (états d’acceptation) ⊂ Q
𝛿 : fonction de transition de Q Ⅹ ∑ vers Q
(p, s) ——> 𝛿(p,s)
39
EXEMPLES
➤ M1= ({p, q, r}, {0, 1}, 𝛿 , p , {r}) avec 𝛿 défini par la table:
𝛿 0 1
p r q
q r q
r p q
le ruban: 1 0
Etat actuel : p
0 1 1 0 1
la tête de lecture :
1 1 0 1 0 0
40
⇪
ACCEPTATION (Rappel)
41
REPRÉSENTATION GRAPHIQUE
➤ On utilise les formes suivantes afin de présenter un DFA sous la
forme d’un graphe orienté où:
➤ les noeuds sont des cercles représentant les états et
➤ les arcs sont des flèches étiquetées par les symboles
➤ si 𝛿( état1, symbole) = état2 on la présente par :
42
FORMALISATION DE L’ACCEPTATION D’UN DFA
➤ Soit M=(Q , ∑ , δ , q0, F) avec δ: QX∑ ——> Q
➤ L(M): l’ensemble des mots acceptés par M
= { w appartenant à ∑* de tel que l’examen des symboles de w se termine
dans un état final}
Problème : Comment décrire L(M) par une formule mathématique ?
Solution: Prolonger la fonction de transition δ sur QX∑* en posant
∆ : QX∑* ——> Q avec
∆(q , ℇ) = q ∀q dans Q
∆(q , us) = δ (∆( q, u), s) ∀ u dans∑* et ∀ s dans ∑
Exemples
43
EXEMPLE ET SOLUTION
∆(q , ℇ) = q ∀q dans Q
∆(q , us) = δ (∆( q, u), s) ∀ u dans∑* et ∀ s dans ∑
➤ Remarque:
∆(q , s) = δ (q, s) pour tout symbole s de ∑
donc ∆ coïncide avec δ sur QX ∑
44
EXEMPLE ET SOLUTION DU PROBLÈME
45
➤ Donner quatre chaines acceptées par l’automate :
01 ; O111; 01101;
10111001101101
46
AUTOMATES ÉQUIVALENTS = AUTOMATES QUI ACCEPTENT MÊME LANGAGE
➤ Pour le même langage nous pouvons avoir plusieurs DFA qui le
reconnaissent, par exemple: {w de{0 , 1 }* / w contient deux 1 successives
}= L((0∣1)*11(0∣1)*) est accepté par les automates :
47
DFA À NOMBRE D’ÉTATS MINIMAL
➤ Théorème 1 :
Soit L un langage régulier. Parmi tous les DFA reconnaissant L, il en
existe un et un seul qui a un nombre minimal d’états.
48
ALGORITHME DE MINIMISATION :
Pour un langage L, Comment peut-on en trouver un DFA qui a le nombre minimal des
états ?
1- Supprimer les états inaccessibles à partir de l’état initial, ainsi que les transitions
entrants ou sortants de ces états.
2- Supprimer les états qui n’amènent jamais à un état final, ainsi que les transitions
entrants ou sortants de ces états.
3- Diviser l’ensemble des états en deux classes
C1 : classe des états non finaux et C2 : classe des états finaux.
4- Pour chaque classe Ci , si ∃ deux états p et q et un symbole s de l’alphabet pour
lequel δ(p , s) et δ(q , s) ∉ la même classe alors diviser Ci en deux sous classes: Ci’ qui
contient p et Ci" qui contient q
5- Répéter 4- Jusqu’à ce qu’il ne reste aucune classe à diviser.
6- Le nombre des classes résultantes est le nombre minimal des états et l’automate
dont les états sont les classes est le DFA qui admet le nombre minimal des états.
49
EXEMPLE DFA À MINIMISER :
EXERCICE : MINIMISER LE NOMBRE DES ÉTATS POUR CE DFA
51
1- Eliminer l’état 9 il est inutile
3- C1 = { q1, q2, q3, q4, q5 } C2 = { q6, q7, q8 }
52
➤ C’1={q1,q2,q5} C’2={q3,q4} C’3={q6} et C’4={q7,q8}
53
Aucune classe n’est divisible donc le nombre minimal est 6 et le DFA qui
a ce nombre d’états est :
54
DFA MINIMAL DE L’EXEMPLE
55
DFA COMPLET
➤ Définition : Un automate fini déterministe est complet si de chaque état
le nombre des transitions sortantes est égal au nombre des symboles de
son alphabet
➤ Autrement dit: un DFA (Q , ∑ , δ , q0, F) est complet si : ∀q ∈ Q , ∀s ∈ ∑ ,
δ(q, s) est définie.
➤ Exemple: les deux derniers DFA sont complets. Par contre les DFA suivant
ne sont pas complets:
56
COMMENT RENDRE UN DFA COMPLET
57
COMMENT RENDRE UN DFA COMPLET
➤ Par exemple pour la complétion des DFA précédents :
58
OBJECTIF 1 :
➤ Nous allons montrer qu’à toute expression régulière correspond un
DFA. Autrement dit : l’équivalence entre les langages réguliers et les
DFA.
59
AUTOMATES FINIS NON DÉTERMINISTES (NFA)
➤ les NFA fonctionnent comme les DFA sauf ils autorisent le choix
entre plusieurs transitions pour le même état et le même symbole :
➤ Définition formelle:
Un NFA est la donnée d’un 5-uplet (Q , ∑ , 𝛿 , q0 , F)
où : Q , ∑ , q0 , F ont les mêmes significations déjà vues en DFA
et 𝛿 de Q Ⅹ ∑ vers l’ensemble des parties de Q
𝛿(p,s) ∈ P(Q) ∀(p, s) ∈ Q Ⅹ ∑
➤ Exemple:
60
EXEMPLE DE NFA:
➤ Un mot w de est accepté si parmi les séquences possibles des transitions étiquetées
par le symboles de w commençant de p il existe une séquence qui se termine par
l’état final t.
Pour w= 00101101 quelle sont les séquences possibles dans ce NFA 61
Formalisation de l'acceptation dans un NFA:
Par conséquence :
et par conséquence : ∆({p} , 0100) = δ ({p ,q} , 0) = δ ({p},0)∪δ({q} ,0) = {p,q}∪{t} = {p ,q,t}
➤ Noter bien: ∆ coïncide avec δ sur P(Q) X∑ on utilise alors δ pour noter ∆
64
DÉTERMINATION D’UN NFA
Considérons M’ = (P(Q) , ∑ , δ’, {q0}, F’) est un DFA qui reconnaît le même langage L,
avec : F’={X∈P(Q) , X∩F ≠ ∅}, δ’(X, a) = δ(X, a). ∀ a ∊ ∑
Pratiquement, on ne construit que les états accessibles à partir de {q0}, de proche en
proche : on calcule toutes les transitions qui partent de {q0}, puis on recommence
avec les nouveaux états obtenus, etc.
➤ Exemple :
65