5.7 KiB
5.7 KiB
Motivations
Concept de langage formel
- créé par les linguistes pour décrire les langages naturels
- effectuer des traductions automatiques
- Noam CHOMSKY: modèle mathématique pour les grammaires
- 1958: langage ALGOL décrit à l'aide d'une grammaire "Hors-Contexte" (notations BNF: description d'un langage de prog.)
Pourquoi étudier les langages formels ?
- conception de langages: syntaxe et grammaire
- Analyse
- lexicale: déterminer les entités syntaxiques)
- syntaxicale: vérifier la syntaxe
- compilation: traduction
- Générateurs d'analyseurs lexicaux (ex: lex)
- Méta-compilateurs : compilateurs de compilateurs, ou générateurs de compilateur (ex: compilateur Ada compilé avec gcc)
- Nécessaire pour l'étude des langages de programmation
Un compilateur ?
PROGRAMME SOURCE
|
V
COMPILATEUR -> messages d'erreur
|
V
PROGRAMME CIBLE
Un compilateur est un programme qui
- prend en entrée une donnée textuelle source (programme, donnée xml, fichier de configuration, etc)
- la reconnait (l'analyse) pour vérifier sa correction
- émet éventuellement un message d'erreur
- le traduit dans le langage cible
Le processus de compilation est généralement analysé comme une série de phases.
Phase: opération logiquement distincte, qui à partir d'une représentation du programme, produit une autre représentation en entrée d'une phase
=== PHASES ===
1. Analyse lexicale ]
2. Analyse syntaxique ] Phases d'analyse
3. Analyse sémantique ]
4. Génération du code intermédiaire ]
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é:
- mots-clés, les identificateurs, les séparateurs, etc
- il y a correspondance avec la table des symboles
On peut distinguer 2 types de lexèmes (ex. Fortran)
- mots spécifiques du langage (if, for, struct, ...)
- identificateurs
Analyse syntaxique
- 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):
- Leur vocabulaire ou lexique : les mots autorisés
- analyse lexicale
- automates à nombre fini d'états
- Leur syntaxe: la structure des phrases autorisées:
- analyse syntaxique
- automates à pile, grammaires algébriques
- Leur sèmantique: la signification des phrases autorisées
- analyse sémantique
- grammaires attribuées
Programmation et modalités de contrôle
Programme
- Introduction
- Langages
- Grammaires
- Automates finis
- Expressions régulières
- ...
Modalités de contrôle des connaissances:
- Contrôle continue écrit = 30%
- Examen écrit = 70%