cours/theoriedeslangagesetcompila.../cours/introduction.md

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)

  1. mots spécifiques du langage (if, for, struct, ...)
  2. 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%