Cours théorie des langages
This commit is contained in:
parent
6831ccaa60
commit
b0100aa876
|
@ -5,6 +5,6 @@ Cours de Licence3 Semestre 2
|
||||||
- [Systèmes d'exploitation](/systemesdexploitation/README.md)
|
- [Systèmes d'exploitation](/systemesdexploitation/README.md)
|
||||||
- [Conception de systèmes d'information](/conceptiondesystemesdinformation/README.md)
|
- [Conception de systèmes d'information](/conceptiondesystemesdinformation/README.md)
|
||||||
- Paradigmes de programmation
|
- Paradigmes de programmation
|
||||||
- Théorie des langages et compilation
|
- [Théorie des langages et compilation](/theoriedeslangagesetcompilation/README.md)
|
||||||
- [Systèmes distribués](/systemesdistribues/README.md)
|
- [Systèmes distribués](/systemesdistribues/README.md)
|
||||||
- Anglais
|
- Anglais
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
Théorie des langages de programmation & compilation
|
||||||
|
---------------------------------------------------
|
||||||
|
|
||||||
|
#### Cours
|
||||||
|
|
||||||
|
1. [Cours 1](/cours/1.md)
|
||||||
|
|
||||||
|
#### TDs
|
||||||
|
|
||||||
|
#### TPs
|
||||||
|
|
|
@ -0,0 +1,154 @@
|
||||||
|
|
||||||
|
### 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 => COMPILATEUR => PROGRAMME CIBLE
|
||||||
|
||
|
||||||
|
v
|
||||||
|
nessages d'erreur
|
||||||
|
|
||||||
|
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%
|
Loading…
Reference in New Issue