Ajout notes ppt Compilateur

This commit is contained in:
Matt Marcha 2019-06-17 18:52:50 +02:00
parent 5ded1cdd72
commit 69d368479f

View file

@ -1263,13 +1263,18 @@ Windows utilise une signature numérique valide pour vérifier les éléments su
## Présentation
Le compilateur traduit du texte >> il le convertit.
### Quest-ce quun compilateur ?
Types ?
Compilateur = vérificateur et traducteur
- Interpréteurs
- Formateurs de texte
- Préprocesseurs
### Cousins
- Interpréteurs
Diffèrent d'un compilateur par l'intégration de l'exécution et de la traduction. Utilisés pour les langages de commande
- Formateurs de texte
Traduit le code source dans le langage de commande d'une imprimante
- Préprocesseurs
Effectuent des substitutions de définitions, des transformations lexicales, des définitions de macros, etc.
Fonctionnement :
@ -1277,41 +1282,259 @@ Fonctionnement :
2. Syntaxe (backend) : regarde comment sont formés les mots pour en déduire la "grammaire", la structure du texte. Création d'un arbre syntaxique, ou arbre de dépendance.
3. Analyse sémantique : vérifie que la syntaxe est OK puis checke le sens. Regarde le contexte, voit la globalité : est-ce **logique** ?
L'optimisation passe
### Analyse lexicale (scanners)
- Par la vitesse d'exécution
- Par la taille du code (minify)
- Rôle : grouper les lettres pour former des mots.
- Au passage :
- reconnaît et signale les mots mal orthographiés
- peut supprimer les commentaires.
- peut préprocesser le texte : expansion de macros.
#### Lex : un outil pour construire un analyseur lexical
Fonctionnement :
- On décrit un ensemble de mots par une expression.
- On associe à chaque expression une action.
- L'exécutable produit par lex lit le fichier d'entrée et pour chaque mot reconnu, effectue une action précisée par l'utilisateur.
expression -> action
Exemple : transformer tous les 'A' en 'a
### Analyse syntaxique
Vise à reproduire une représentation (arbre) des relations grammaticales entre les mots.
- La syntaxe est létude de la façon avec laquelle les mots sont composés pour construire des phrases.
- La syntaxe ne sinteresse pas à la sémantique des mots.
- Parcontre, une analyse syntaxique peut apporter de linformation utile à la compréhension dune phrase
- (utile en traduction automatique, système de réponse automatique..)
- Lanalyse syntaxique va permettre dexposer et de manipuler de nouveaux concepts linguistiques utiles :
- Les constituants qui sont des groupes de mots agissant comme une unité à part entière, tels les noun phrases.
- Les relations grammaticales telles les relations dobjet et de sujet dun verbe
- Dautres propriétés sur la relation entre les mots dune phrase telle les relations de dépendance.
### Analyse sémantique
À la sortie de lanalyse syntaxique, on se trouve avec un arbre syntaxique (abstrait) qui contient toutes les informations pertinentes sur la structure syntaxique du programme
On a donc vérifié quil est syntaxiquement correct. . . . . . ce qui ne veut pas dire quil est sémantiquement correct !
De même, on a compris sa structure syntaxique. . . . . . ce qui ne veut pas dire quon a compris sa signification !
### Optimisation de code
Le code est généré d'abord dans un langage intermédiaire, puis en code binaire pour la machine. À chaque fois il est généré puis optimisé.
Loptimisation de code peut être soit par :
1. #### Optimisations de la vitesse d'exécution
Un compilateur peut optimiser plusieurs choses:
- la taille du programme
- la vitesse dexécution
- la consommation énergétique du programme.
Si les compilateurs sont très bons pour optimiser la vitesse dexécution, il nen est pas vraiment de même pour la taille du code ou la consommation énergétique. Quoiquil en soit, il existe plusieurs façons pour optimiser la vitesse dexécution:
- utiliser au mieux les instructions du processeur;
- diminuer le temps processeur passé à faire des calculs;
- virer des branchements et fonctions pour obtenir un code le plus linéaire possible;
- utiliser au mieux la hiérarchie mémoire, que ce soit au niveau des registres, du cache ou de la DRAM.
2. #### Optimisations de la taille du code
Si la vitesse des programmes peut être optimisée, les compilateurs peuvent aussi jouer sur la taille du programme. La taille dun programme en elle-même nest pas importante pour des programmes PC puisque la majorité dentre eux possèdent plusieurs gibioctets1 de RAM, ce qui laisse une grande marge. Par contre, diminuer la taille du code a des effets indirects sur les performances en économisant de la mémoire cache. Mais dans la réalité, les optimisations de la taille du code entrent souvent en conflit avec les optimisations de vitesse dexécution et on a :
- Choix des instructions
- Jonction de branchements
- Abstraction de procédure
- Suppression de code mort
### Génération de code
Se passe en plusieurs étapes :
1. Génération du code intermédiaire
2. Optimisation du code intermédiaire
3. Génération du code machine
4. Optimisation du code machine
### Pile dexecution
Zone de mémoire supposée très grande.
Le registre traditionnellement utilise pour le haut de pile sappelle $sp.
Par convention, il pointe vers le mot (4 octets) le plus en haut.
Attention, on compte a lenvers en MIPS ! On augmente la pile en
diminuant $sp
### Appel de fonction
Les fonctions (et procédures) en assembleur sont simplement des adresses dans le code.
le passage des arguments se fait a la main, la récupération du résultat aussi, il ny a pas de “variable locale”.
On utilise la pile pour stocker
- le résultat,
- les arguments,
- les variables locales
### Arbre dactivation
A nimporte quel moment, une seule fonction est active
Elle est representée par une trame de pile ou trame dactivation
Les activations successives forment un arbre dactivation
Une trame de pile est crée lors dun appel a fonction
La trame est ecrasée quand la fonction finit son activation
### Outils logiciels
- Générateurs danalyseurs lexicaux
Engendrent un analyseur lexical (scanner, lexer) sous forme dautomate fini à partir dune spécification sous forme dexpressions rationnelles
Flex, Lex
- Générateurs danalyseurs syntaxiques
Engendrent un analyseur syntaxique (parser) à partir dune grammaire
Bison, Yacc
- Générateurs de traducteurs
Engendrent un traducteur à partir dun schéma de traduction (grammaire + règles sémantiques)
Bison, Yacc
## Analyse lexicale
C'est la première partie de la compilation, le point d'entrée, juste après le source code.
Analyse lexical = Transformation dune suite de caractères en une suite de mots.
C'est la première partie de la compilation, le point d'entrée, juste après le source code.
Un analyseur lexical est un automate fini
### Les REGEX
### Les enjeux
...explique ce que c'est.
- La production dun arbre (de syntaxe abstraite) à partir de caractères
- Création des automates finies à partir des expressions régulières qui sont utilisés souvent dans les éditeurs des textes et les grep d'Unix .
### Les langages formels
On se donne un ensemble Σ appelé alphabet, dont les éléments sont appelés caractères. Un mot (sur Σ) est une séquence de caractères (de Σ). On note є le mot vide, uv la concaténation des mots u et v (la concaténation est associative avec є pour élément neutre). On note Σ∗ lensemble des mots sur Σ.
Un langage sur Σ est un sous-ensemble L de Σ∗. On se donne quelques opérations sur les langages. Si U et V sont des langages sur Σ, on note U V lensemble des mots obtenus par la concaténation dun mot de U et dun mot de V; U (resp. U +), lensemble des mots obtenus par la concaténation dun nombre arbitraire, éventuellement nul (resp. non nul) de mots de U.
### Les expressions régulières (regex) :
Rôle : permettent de représenter des modèles de chaînes de caractère. Ce sont des outils très puissants et très utilisés.
Syntaxe :
- Une lettre de lalphabet a désigne le langage {a}.
- Epsilon є désigne le langage {є}
- Concaténation : M N désigne le langage [[M]] [[N]].
- Alternative : M N désigne le langage [[M]] [[N]].
- Répétition : M désigne le langage [[M]] .
- Autres constructions tel que a ou b : a|b , un ou plus a+ , a?, $,^, etc
- Exemple: Adresse email : `^[a-zA-Z-]+@[a-zA-Z-]+\.[a-zA-Z]{2,6}$`
### Les automates
DFA automate fini déterministe
#### DFA automate fini déterministe
NFA fini non déterministe
Nombre fini d'états et un état ne peut aller que vers un autre état (ex: feu tricolore)
## Compilateur : Analyse syntaxique
#### NFA fini non déterministe
Après l'analyse lexicale
La définition est la même que celle de automates déterministes, compte tenu des deux détails suivants :
Construit un arbre des relations grammaticales entre les mots.
1. Les transitions sont définies par une relation et non plus par une fonction, cest à dire que plusieurs transitions issues dun état donné peuvent porter la même étiquette.
2. Il existe des transitions « spontanées » qui portent une étiquette spéciale, classiquement є.
Il définit ce qu'est un sujet, un verbe.. donc un objets, une classe... ?
## Analyse syntaxique
### Rôle
Analyse syntaxique = fait suite à lanalyse lexical et qui permet de connaître la structure syntaxique dun énoncé et par suite expliciter les relations de dépendances entre les différents lexèmes et de construire la représentation du sens d'énoncé
Vise à reproduire une représentation (arbre) des relations grammaticales entre les mots.
Il définit ce qu'est un sujet, un verbe.. donc un objet, une classe... ?
### Le rôle de lanalyseur syntaxique
prépare la traduction : si des mots sont pas compwris, communication possible via la table des symboles.
Rôle central de la partie frontale :
1. active lanalyseur lexical;
2. vérifie la conformité syntaxique;
3. construit larbre danalyse ;
4. prépare ou anticipe la traduction ;
5. gère les erreurs communes de syntaxe.
6. Traitement des erreurs :
- diagnostic (messages) ;
- redémarrage : mode panique, jusquà resynchronisation ;
correction, difficile si lerreur est antérieure à sa détection ;
règles derreurs, intégrées à la grammaire.
### Grammaires
Syntaxe spécifiée par des règles de grammaire.
- Symboles terminaux (= unités lexicales) alphabet A ;
- Symboles intermédiaires ou variables (= catégories
grammaticales) alphabet X ;
- Règles de grammaire x ® w , où x Î X et où w Î (AÈ X)*
w est un mot quelconque, même vide.
Exemples :
instr ⇾ si expr alors instr sinon instr
phrase ⇾ gsujet gverbe gcomplément
Axiome (= programme)
Langage engendré = mots terminaux dérivant de laxiome
### Lanalyse descendante
Une procédure par terme.
Problème : récursivité directe à gauche ; nécessité dune transformation pour léliminer.
Procédures correspondantes : deux procédures supposées éc
- prévision retourne lunité lexicale suivante sans lenlever ;
- correspond(x) lit lunité lexicale suivante, lenlève et signale erreur si elle ne vaut pas x. Ici plus, nombre, etc. sont les codes dunités lexicales renvoyés par lanalyseur lexical
### Lanalyse ascendante
On utilise une pile, et une table de transition entre états. (Automate déterministe à une pile)
En fonction du symbole de prévision,
- on empile un état en lisant un caractère de lentrée (décalage)
- on dépile autant de symboles que la longueur de la règle quon a reconnue, et on empile un nouvel état (réduction)
## Analyse sémantique
La sémantique est létude du sens des mots, dans une phrase et dans le contexte de cette phrase. Lanalyse sémantique dun texte consiste à établir sa signification en utilisant le sens des éléments du texte ; a contrario, les analyses lexicales ou grammaticales ne font que décomposer le message à laide dun lexique (dictionnaire) ou dune grammaire
Un programme peut être syntaxiquement correct mais contenir des erreurs “sémantiques” :
- Variables/fonctions non déclarées
- Fonctions avec mauvais nombre/type de paramètres
- Opérateurs appliqués à des types incompatibles (int + string)
- Pas de return alors que la fonction nest pas void (ou vice-versa)
- Pas de main
### Système de types
Les variables, fonctions et expressions ont des types associés
- Types : déclarés ou inférés ? modifiables ?
- Déclarés : identificateurs déclarés avec un type (C, Java)
- Inférés : types sont inférés selon leur utilisation (Perl, Python, PHP)
- Modifiables : changement de type dans la même portée (Python)
- Vérifications : statiques (compilation) ou dynamiques (exécution) ?
- Statiques : compatibilité types utilisés/déclarés des variables
- Dynamiques : dépassement des bornes dun tableau
- Conversions de types
- Implicites (coercitions) : x = 1 + 5.3
- Explicites (cast) : x = (int)y + 1
- Polymorphisme (fonctions, opérateurs, types complexes)
### Table des symboles
- Elle rassemble toutes les informations utiles concernant les variables et les fonctions du programme. Pour toute variable, elle garde linformation de : son nom son type sa portée son adresse en mémoire.
- Pour toute fonction, elle garde linformation de : son nom sa portée le nom et le type de ses arguments, ainsi que leur mode de passage le type du résultat quelle fournit La table des symboles est construite lors du parcours de larbre abstrait.
- Elle grandit pendant la compilation des parties déclaratives : déclaration de variables, définition de fonctions. Elle est consultée pendant la compilation des parties exécutables : appel de fonction, référence à une variable. La table des symboles doit être réalisée avec soin : on estime quun compilateur passe la moitié de son temps à la consulter