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)
|
||||
- [Conception de systèmes d'information](/conceptiondesystemesdinformation/README.md)
|
||||
- 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)
|
||||
- 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