5. Optimisation du code intermédiaire ] Phases de synthèse
6. Génération du code objet (exécutable) ]
### Compilateur : Phases d'analyse
##### Analyse lexicale
- Consiste à lire le texte source (char par char), et produit une **chaine d'instructions** séparées par un caractère particulier appelé **séparateur**
- Former des unités lexicales appelées **lexèmes**
- Eliminer le informations inutiles (commentaires, etc)
- Présenter une chaine d'entree à l'analyseur syntaxique
Un **lexème** peut être défini comme une unité propre à un langage considéré:
- Consiste à prélever des instructions de la chaine délivrée par l'analyseur lexical et déterminer si chacune est conforme aux **règles de syntaxe** du langage considéré.
- Vérification en construisant l'**arbre syntaxique** de l'instruction à analyser
- Les feuilles de l'arbre doivent être les **lexèmes** consistuant l'instruction
- Pour construire l'arbre, l'analyseur syntaxique dispose de **règles de syntaxe** (grammaire) du langage considéré
##### Analyse sémantique
- Destinée à la détection d'erreurs sur la manipulation des objets du langage de programmation, et en particulier au **contrôle de types**
- **Exemple**: contrôle à travers l'arbre syntaxique, fourni par l'analyseur syntaxique, si chaque opérateur est appliqué à de opérandes ayant les types permis par la spécification du langage considéré
- Elle n'existe pas dans tous les compilateurs; apparue avec les langages typés (Pascal)
### Compilateur : Phases de synthèse
##### La génération du code intermédiaire
- Utilisation des variables intermédiaires
- Choix de l'ordre pour faire le calcul
##### L'optimisation du code intermédiaire
- Amélioration du code intermédiaire
- Réduction du nombre de variables de d'instructions
##### La génération du code cible
- Choix des emplacements mémoire pour les variables
- Assignation des variables aux registres
### Compilateur : Phases
##### La gestion des erreurs
- ANalyse lexicale: caractère illégal, identificateur trop long, nombre illégal
- Analyse syntaxique: parenthèses manquantes au sens général( (), begin, etc)
- Analyse sémantique: opérateur incompatible avec le type de l'objet considéré, dépassement d'intervalle, division par 0
- Génération du code cible: dépassement de capacité, etc
- Table des symboles: double déclaration
##### La génération de la table des symboles
- Enregistre les identificateurs et les attributs (emplacement mémoire, typage, etc)
- Chaque identificateur (variable) a une entrée dans la table des symboles
- L'analyseur lexical crée une entrée dans la table des symboles à chaque fois qu'il rencontre un nouvel identificateur
### Outils pour la compilation
##### Correction
- Entrée invalide détectée ?
- Sortie conforme aux attentes ?
- Outil de prédilection = **théorie des langages**
##### Efficacité
- Faut-il attendre le résultat de la compilation ?
- Outil de prédilection = **algorithmique**
##### Bonne conception du logiciel
- Logiciel facile à modifier/étendre ?
- Outil de prédilection = **Génie Logiciel (GL)**
### Thérie de langages pour la compilation ?
Permet de définir rigoureusement et reconnaitre algorithmiquement (pour les langages source et cible):