Technique de compilation
Enseignants : Mohamed Zeba
Généralités sur la compilation
Un compilateur
Un compilateur est un programme qui lit un programme écrit dans un
premier langage (le langage source) et le traduit en un programme équivalent
dans un autre langage (le langage cible).
Un compilateur est également un rapporteur des erreurs contenues dans le
code source.
Lors des différentes étapes d'analyse, il vérifie le code et signale les
éventuelles erreurs.
Un compilateur
Une compilation s’effectue en deux parties: l’analyse et la synthèse.
Exemples de langages compilés : Fortran, C, Ada, C++
Un compilateur
○ La partie d’analyse partitionne le programme source en ses constituants
et en crée une représentation intermédiaire.
○ La partie de synthèse construit le programme cible à partir de cette
représentation intermédiaire.
Un interpréteur
Un interpréteur analyse une à une les instructions d'un programme, les traduit
et les exécute.
○ L’interpréteur doit être présent sur le système où le programme
s’exécute
○ L’exécution est plus lente
○ On peut modifier le source pendant l’exécution
Génération des langages
● Première génération
Écrit en code binaire directement exécutable par la machine
● Deuxième génération
Écrit en assembleur, code proche du langage machine mais plus lisible
● Troisième génération
Syntaxe plus proche du naturel, meilleur lisibilité (ex: C, python,
Java,...)
● Quatrième génération (SQL, Visual Basic, Postscript,...)
● Cinquième génération (Prologue, OPS5,...)
Phases de la compilation
Analyse lexicale
Première phase de la compilation, cette phase permet de décomposer le code
source en entités élémentaires appelées lexèmes (ou tokens en anglais). Un
lexème est une suite de caractères ayant une signification précise et
appartenant à des catégories prédéfinies appelées unités lexicales.
Phases de la compilation
Analyse lexicale
Le but est de reconnaître une séquence de mots appartenant à un langage
défini à l’aide d’une expression régulière. On utilise pour cela des techniques
utilisant des automates finis.
Entrée: code source
Sortie: Séquence de lexèmes
Exemple: TD
Phases de la compilation
Analyse lexicale
Exemple: A = B1 + B2 * 60
A =: identificateur
= =: affection
B1 =: identificateur
+ =: opérateur arithmétique (addition)
B2 =: identificateur
* =: opérateur arithmétique (multiplication)
60 =: nombre
Phases de la compilation
Analyse syntaxique
Seconde phase de la compilation, elle vérifie si l'écriture du programme
source est conforme à la syntaxe du langage. La syntaxe d’un langage peut
être décrite par une grammaire. Cette grammaire décrit comment les unités
lexicales doivent être agencées. Les unités lexicales sont regroupés en unités
grammaticales.
Entrée: unités lexicales
Sortie: arbre syntaxe
Phases de la compilation
Analyse syntaxique
Exemple d'arbre abstrait
Phases de la compilation
Analyse sémantique
Elle contrôle la cohérence sémantique du programme source(analyser le
sens et fixer une interprétation)
La génération de code intermédiaire
Traduit l’arbre de syntaxe abstraite en un code pour une machine
abstraite
Phases de la compilation
Optimisation de code intermédiaire
Améliore la performance du code. Réalise les optimisations
indépendantes de l’architecture
Génération de code Final
La génération de code final traduit le langage intermédiaire en un
langage machine dépendant de l’architecture
Phases de la compilation
En parallèle des six phases citées plus hauts, nous avons deux traitements qui
s’effectuent:
Gestion d’une table de symbole
Elle contient les identificateurs des variables et attributs (type, valeur, portée,
…)
Détection des erreurs
La génération de code final traduit le langage intermédiaire en un
langage machine dépendant de l’architecture
Phases de la compilation
Détection des erreurs
Le compilateur doit traiter les erreurs de façon à ce que la compilation puisse
continuer.
Résumé
Résumé