Cours de compilation Mr HAMMOUDA Mohamed USDB, 3ème année licence, SI INTRODUCT

Cours de compilation Mr HAMMOUDA Mohamed USDB, 3ème année licence, SI INTRODUCTION Qu'est ce qu'un compilateur? Un compilateur est un logiciel qui traduit un programme source écrit dans un langage de haut niveau en un programme équivalent écrit dans un langage cible appelé aussi programme objet. Ce langage cible peut être: - Le langage machine - L'assembleur - Ou un langage intermédiaire. On peut distinguer aussi d'autres formes de compilation: - Les interpréteurs: contrairement aux compilateurs, un interpréteur analyse et exécute les instructions du programme source une après l'autre. - Les traducteurs: la compilation peut être aussi une traduction d'un langage à un autre (par exemple du C++ vers JAVA) ou d'un format à un autre (par exemple du Word vers HTML) Les qualités d'un compilateur  Le programme cible doit être équivalent au programme source.  Le temps de compilation doit être proportionnel à la taille du programme source.  Le code produit doit être efficace en temps et en espace.  Le diagnostique d'erreurs doit être de très bonne qualité.  La possibilité d'utiliser un debugger sur le code produit. Structure d'un compilateur La compilation se décompose en deux phases (figure 1): (1) Une phase d'analyse (partie frontale): qui permettra de reconnaitre les variables, les instructions, les opérateurs, … et élaborer la structure syntaxique du programme ainsi que certaines propriétés sémantiques. (2) Une phase de synthèse et de production (partie finale): qui consiste en la production du code. La table des symboles et le gestionnaire des erreurs sont des phases parallèles. Partie frontale Partie finale Table des symboles Gestionnaire des erreurs Code Source Code cible Représentation intermédiaire Figure 1: phases de compilation Cours de compilation Mr HAMMOUDA Mohamed USDB, 3ème année licence, SI Table des symboles C'est une structure de données utilisée pour stocker des informations concernant les variables du programme source (le type, l'emplacement en mémoire, la portée, la visibilité, …) Gestionnaire des erreurs Il a pour rôle de détecter et d'informer l'utilisateur le plus précisément possible des erreurs rencontrées (les erreurs de syntaxe, de sémantique, …). Les étapes de la phase d'analyse (figure 2) (1) Analyse lexicale (scanner) appelée aussi analyse linéaire (Eliminer les caractères superflus, identifier les mots qui composent le texte, …) Les outils: les expressions régulières, les automates à états finis (2) Analyse syntaxique (parser) appelée aussi analyse hiérarchique ou grammaticale: Il s'agit de découvrir la structure du programme source et de vérifier s'il respecte la grammaire du langage. Les outils: les grammaires, les automates à pile (3) Analyse sémantique appelée aussi analyse contextuelle: Il s'agit de vérifier certains aspects sémantiques (les déclarations, les types, la consistance des expressions, …) Les outils: la définition dirigée par la syntaxe (DDS) Les étapes de la phase de synthèse (1) Génération du code: En général, un compilateur produit un code intermédiaire pour une machine virtuelle qui traduit par la suite en code machine Outils: la traduction dirigée par la syntaxe (TDS) (2) Optimisation du code: Il s'agit d'améliorer le code produit afin d'augmenter son efficacité (éliminer les calculs inutiles, …) Outils: des algorithmes d'optimisation Cours de compilation Mr HAMMOUDA Mohamed USDB, 3ème année licence, SI Exemple Langage simplifié des expressions arithmétiques Une grammaire G (S,N,T,P) où: - P l'axiome - N = {P,S,E,D,I,T,L,OP} l'ensemble des non terminaux - T = {; , entier reel = + * ident nombre} - P ensemble de productions: P = { P  S S  D I D  T L D | T L T  entier | reel L  id,L | id ; I  id=E; E  E OP E | ident | nombre OP+|* } Définitions des unités lexicales (tokens) - ID : "ident" est une suite de lettres alphabétiques ( l ) et de chiffres ( c) dont le premier caractère est une lettre l ( l | c )* . - NBR: "nombre" est suite non vide de chiffres pour les entiers (c+) ou une suite de chiffres suivie d'un point suivi d'une autre suite de chiffres (c+.c*|c*.c+) - OPA: liste d'opérateurs arithmétiques {+, *} - L'opérateur d'affectation {=} - Liste de séparateur {, ;} Programme Source Analyse lexicale (scanner) Analyse syntaxique (parser) Analyse sémantique Génération du code Optimisation du code Programme objet Gestion des erreurs Table des symboles Phase d'analyse Ou Partie frontale Phase de synthèse Ou Partie finale Figure 2: Structure générale d'un compilateur Cours de compilation Mr HAMMOUDA Mohamed USDB, 3ème année licence, SI Programme Source entier i ; reel p,v ; p=i+v*60 ; Analyse lexicale Modèle 1: élimination des délimiteurs Modèle 2: reconnaissance des lexèmes spéciaux Modèle 3: reconnaissance des identificateurs Modèle 4: reconnaissance des nombres Autre: Erreur 6 7 l l |c si "entier" ou "reel" return ("TYPE") sinon return("ID"); 1 2 4 3 5 +/* ; , = return("OPA"); return("="); return(","); return(";"); 0 " " |tabulation|saut de ligne return("NBR"); 8 9 10 11 12 c c . c c c . Analyseur lexical <entier,TYPE> <i,ID> <;> <reel,TYPE> <p,ID> <v,ID> <;> <p,ID> <=> <i,ID> <+,OPA> <v,ID> <*,OPA> <60,NBR> <;> Programme Source Cours de compilation Mr HAMMOUDA Mohamed USDB, 3ème année licence, SI Analyse syntaxique Ident Type Adresse …. p réel i entier v réel Table des symboles Analyse sémantique: Vérification de la consistance de l'instruction (déclaration et type) Génération du code intermédiaire trois adresses: t1=intoReal(60); t2=v*t1; t3=i+t2 p=t3; Optimisation: t1=v*60.0; p=i+t1; Génération du code final (Programme objet): LDF R2,v MULT R2,#60.0 LDF R1,i ADDF R1,R2 SET R1,p Analyseur syntaxique <entier,TYPE> <i,ID> <;> <reel,TYPE> <p,ID> <v,ID> <;> <p,ID> <=> <i,ID> <+,OPA> <v,ID> <*,OPA> <60,NBR> <;> S D I T L D entier i ; T L reel p , L v ; p = E ; E E OP E E OP + ; v * 60 Arbre syntaxique ou de dérivation Cours de compilation Mr HAMMOUDA Mohamed USDB, 3ème année licence, SI Implémentation en Flex/Bison L'analyseur lexical Alex.l L'analyseur syntaxique ASynt.y %{ /* Déclaration en C de variables, constantes, inclusions de fichiers */ #include "calc.tab.h" #include <stdlib.h> %} /* Déclarations des définitions régulières */ blancs [ \t\n]+ lettre [a-zA-Z] chiffre [0-9] reel ({chiffre}*"."{chiffre}+) | ({chiffre}+"."{chiffre}*) entier {chiffre}+ type "entier"|"reel" ident {lettre}({lettre}|{chiffre})* operat "+"|"*" %% /* règles de traductions */ {blancs} { /* On ignore */ } {reel} return(NBR); {entier} return(NBR); {type} return(TYPE); {ident} return(ID); {operat} return(OPA); "," return(VIR); ";" return(PVIR); "=" return(AFF); "{" return(AO); "}" return(AF); "$" return(FIN); %% /* bloc principal et fonctions auxiliaires */ %{ /* Déclaration en C de variables, de constantes, inclusions de fichiers … */ #include <stdio.h> #include <stdlib.h> #include <math.h> %} /* Déclaration des unités lexicales de priorités et de types */ %token NBR TYPE ID OPA %token FIN VIR PVIR AFF %left '+' %left '*' %start P %% /* Les règles de production et actions Sémantiques */ P: S ; S: FIN {YYACCEPT;} | D I { printf("correct syntax");YYACCEPT;} ; D: T L D | T L | ; T: TYPE ; L: ID VIR L | ID PVIR ; I: ID AFF E PVIR I | ; E: E OPA E | ID | NBR ; %% /* Les routines C et bloc principal */ int yyerror(char *s) { printf("%s\n",s); } int main(void) { yyparse(); } uploads/Management/ compilation-introduction.pdf

  • 103
  • 0
  • 0
Afficher les détails des licences
Licence et utilisation
Gratuit pour un usage personnel Attribution requise
Partager
  • Détails
  • Publié le Apv 06, 2021
  • Catégorie Management
  • Langue French
  • Taille du fichier 0.2891MB