La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Vue générale Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure dInformatique (ESI)

Présentations similaires


Présentation au sujet: "Vue générale Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure dInformatique (ESI)"— Transcription de la présentation:

1 Vue générale Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure dInformatique (ESI)

2 Vue générale Motivation Structure dun compilateur Grammaires Arbres Syntaxiques et Ambiguïté Classification de Chomsky Présentation Z#

3 Histoire (Construction des compilateurs) Autrefois " un mystère ", aujourd'hui lune des branches les plus maîtrisées En informatique. 1957Fortran Premiers compilateurs (Expressions, instructions, procédures) 1960 Algol Première définition formelle dun langage (grammaires sous forme de Backus-Naur, bloc, récursivité,...) 1970Pascal types, machines virtuelles (P-code) 1985C++ Orientation objets, exceptions 1995Java Portabilité Le cours concerne uniquement les langages impératifs (procéduraux) langages fonctionnels (Lisp) et langages logiques ( Prolog) exigent dautres techniques.

4 Comment est écrit le premier compilateur? Programmation degré 0 : en binaire (suite de 0 et de 1) Programmation degré 2 : langage de programmation (CALL, SINUS,.) Le premier assembleur est écrit en binaire Aujourd'hui un compilateur pour le langage U est écrit avec un langage V doté dun compilateur écrit dans un langage W. Programmation degré 1 : langage dassemblage (LW, JUMP,.) Le premier compilateur est écrit en langage dassemblage

5 Pourquoi apprendre la compilation? Comment les compilateurs fonctionnent? Comment les ordinateurs fonctionnent? (instructions, registres, addressage, déroulement dune instruction,...) Code machine généré (efficacité) Cest quoi une bonne conception de langage ? Constitue une base pour un ingénieur en informatique Utile dans dautres domaines Lecture des requêtes de bases de données () Lecture des données structurées du type XML, fichier image,...) Interprétation des lignes de commande...

6 Vue générale Motivation Structure dun compilateur Grammaires Arbres Syntaxiques et Ambiguïté Classification de Chomsky Présentation Z#

7 Structure dun compilateur Programme source val=01*val+i Analyse lexicale Unités lexicales 1 (ident) "val" 3 (assign) - 2 (number) 10 4 (times) - 1 (ident) "val" 5 (plus) - 1 (ident) "i" Code de lunité Valeur de lunité Analyse syntaxique Arbre syntaxique ident = number * ident + ident Term Expression Statement

8 Structure dun compilateur Analyse sémantique Arbre syntaxique ident = number * ident + ident Term Expression Statement Représentation intermédiaire Arbre syntaxique, table des symboles,... Optimisation Génération de code Code machine

9 Compilateurs à une passe Fonctionnement simultané des phases Scanne une unité Analyse une unité Vérifie une unité Génère le code pour une unité eof? Le programme objet est généré en même temps que le programme source est lu. n y

10 Compilateurs à plusieurs passes Les phases sont des programmes séparés qui sexécutent séquentiellement Chaque phase lit à partir dun fichier et écrit sur un nouveau fichier Source Lexique Unités lexicales Syntaxe Arbre Sémantique... Code Pourquoi plusieurs passes? Mémoire insuffisante (Aujourd'hui, ce nest plus un motif) Langage complexe Portabilité importante

11 En général: Compilateurs à deux passes Passe 1 Lexique Syntaxe Sémantique Représentation intermédiaire Passe 2 Génération code Dépendant du language Java C Pascal Dépendant de la machine Pentium PowerPC SPARC Toute combinaison possible Avantages Meilleure portabilité Combiner les techniques entre les deux passes Optimisations plus simples sur la représentation intermédiaire que sur le code source Inconvénients Lenteur Plus de mémoire

12 Différence entre Compilateur et Interpréteur Compilateur Traduit vers le code machine scannerparser...code generatorloader code sourcecode machine Variante: interprétation du code intermédiaire... compilateur... code sourceCode intermédiaire (Langage pivot)) VM Le code source est traduit dans le code dune machine virtuelle (VM) VM interprète le code simulant la machine physique Interpréteur exécute le code source "directement" scannerparser code source interprétation Les instructions dune boucle sont scannées et analysées à chaque itération

13 Fonctionnement dun compilateur Analyse Syntaxique Sémantique scanner Table des symboles Génération de code Fournit les unités lexicales à partir du code source Maintient des informations sur les variables et types déclarés génère le code machine "Programme principal" Dirige toute la compilation Utilise Flots de données

14 Vue générale Motivation Structure dun compilateur Grammaires Arbres Syntaxiques et Ambiguïté Classification de Chomsky Présentation Z#

15 Cest quoi une grammaire? Exemple Statement = "if" "(" Condition ")" Statement ["else" Statement]. Quatre composantes Symboles terminauxSont atomiques "if", ">=", ident, number,... Symboles non terminaux Sont dérivés en unités Statement, Expr, Type,... productionsRègles donnant la décom- position des non terminaux Statement = Designator "=" Expr ";". Designator = ident ["." ident].... Symbole de départNon terminal axiome CSharp

16 Notation EBNF Extended Backus-Naur form John Backus: a développé le premier compilateur Fortran Peter Naur: définition de Algol60 SymbolesSensexemples Chaîne Nom =. Dénote une chaîne de caractères Dénote un symbole T ou NT Sépare les membres dune production Termine une production "=", "while" ident, Statement A = b c d. | (...) [...] {...} Choix Choix de groupes Partie optionnelle Partie répétitive a | b | c a or b or c a ( b | c ) ab | ac [ a ] b ab | b { a } b b | ab | aab | aaab |... Conventions Symboles terminaux : commencent par des lettres minuscules (ex. ident) Symboles non terminaux : commencent par des lettres majuscules (ex. Statement)

17 Exemple: Grammaire pour les expressions arithmétiques Productions Expr= [ "+" | "-" ] Term { ( "+" | "-" ) Term }. Term= Factor { ( "*" | "/" ) Factor }. Factor= ident | number | "(" Expr ")". Expr Term Factor Symboles Terminaux "+", "-", "*", "/", "(", ")" ( 1 instance) ident, number (plusieurs instances) Symboles non terminaux Expr, Term, Factor Symbole de départ Expr

18 Priorité des opérateurs Des grammaires peuvent être utilisées pour définir la priorité des opérateurs Expr= [ "+" | "-" ] Term { ( "+" | "-" ) Term }. Term= Factor { ( "*" | "/" ) Factor }. Factor= ident | number | "(" Expr ")". Entrée: - a * 3 + b / 4 - c - ident * number + ident / number - ident = - Factor * Factor + Factor / Factor - Factor = - = Term+ - "*" et "/" ont des priorités supérieures à "+" et "-" = Expr "-" ne porte pas sur a, mais sur a*3 Expr= Term { ( "+" | "-" ) Term }. Term= Factor { ( "*" | "/" ) Factor }. Factor= [ "+" | "-" ] ( ident | number | "(" Expr ")" ). Comment transformer la grammaire pour que "-" porte sur a?

19 Premiers dun non terminal Avec quels symboles terminaux un non terminal peut commencer? Expr= ["+" | "-"] Term {("+" | "-") Term}. Term= Factor {("*" | "/") Factor}. Factor= ident | number | "(" Expr ")". First(Factor) =ident, number, "(" First(Term) =First(Factor) = ident, number, "(" First(Expr) ="+", "-", First(Term) = "+", "-", ident, number, "("

20 Suivants dun non terminal Quels symboles terminaux peuvent suivre un non terminal ? Expr= [ "+" | "-" ] Term { ( "+" | "-" ) Term }. Term= Factor { ( "*" | "/" ) Factor }. Factor= ident | number | "(" Expr ")". Follow(Expr) =")", eof Follow(Term) ="+", "-", Follow(Expr) = "+", "-", ")", eof Follow(Factor) ="*", "/", Follow(Term) = "*", "/", "+", "-", ")", eof Voir où Expr apparaît dans le coté droit dune production? Quels sont les symboles terminaux qui le suivent?

21 Terminologie Alphabet Lensemble des symboles terminaux et non terminaux dune grammaire Chaîne Une séquence finie de symboles dun alphabet. Dénotées par les lettres grecques (,,,...) Ex.: = ident + number = - Term + Factor * number Chaîne vide Dénotée par

22 Dérivations et Réductions Dérivation => (dérivation directe) Term + Factor * Factor => Term + ident * Factor Non terminal NT Partie droite dune production de NT => * (dérivation indirecte) => 1 => 2 =>... => n => => L (dérivation canonique gauche ) Le non terminal le plus à gauche dans est dérivé en premier => R (dérivation canonique droite) Le non terminal le plus à droite dans est dérivé en premier Réduction Cest linverse dune dérivation. Si le coté droit dune production figure dans il est remplacé par le non terminal correspondant

23 Dérivation de la chaîne vide( Annulabilité ) Une chaîne peut dériver la chaîne vide. =>* Exemple A = B C. B = [ b ]. C = c | d |. B peut dériver la chaîne vide :B => C peut dériver la chaîne vide :C => A peut dériver la chaîne vide :A => B C => C =>

24 Plus de terminologie Forme sententielle Toute chaîne qui peut être dérivée à partir de laxiome dune grammaire. Ex1:Expr // Ex2 : Term + Term + Term; Ex3:Term + Factor * ident + Term... Phrase du langage Une forme sententielle uniquement avec des symboles terminaux. Ex.:ident * number + ident Langage (langage formel) Cest lensemble de toutes les phrases dune grammaire (en général infini). Ex.: le langage C est lensemble de tous les programmes C corrects syntaxiquement. Phrase pour un non terminal U xUy forme sentientielle et U=>+u Si U=>u : phrase simple Handle Phrase simple la plus à gauche

25 Récursion Une production est récursive si A => * 1 A 2 Utilisée pour représenter des répétitions et des structures emboîtées Récursion directe A => 1 A 2 Récursion gauche A = b | A a. A => A a => A a a => A a a a => b a a a a a... Récursion droite A = b | a A. A => a A => a a A => a a a A =>... a a a a a b Récursion centrale A = b | "(" A ")". A => (A) => ((A)) => (((A))) => (((... (b)...))) Récursion indirecte A => * 1 A 2 Exemple Expr= Term { "+" Term }. Term= Factor { "*" Factor }. Factor= id | "(" Expr ")". Expr => Term => Factor => "(" Expr ")"

26 Comment éliminer la récursion à gauche? La récursion à gauche constitue un handicap pour les analyseurs syntaxiques TopDown A = b | A a. Les deux alternatives commencent avec b. Lanalyseur ne peut décider quoi choisir La récursion à gauche peut être transformée en une itération E = T | E "+" T. Quelles formes sententielles peuvent être dérivées? T T + T T + T + T... Ce qui donne la règle itérative EBNF : E = T { "+" T }.

27 Vue générale Motivation Structure dun compilateur Grammaires Arbres Syntaxiques et Ambiguité Classification de Chomsky Présentation Z#

28 Notation BNF ordinaire Symboles terminaux Sont écrits sans quottes (Ex. : ident, +, -) Symboles non terminaux sont écrits entre (Ex. :, ) Membres dune productionsont séparés par ::= Grammaire BNF pour les expressions arithmétiques ::= ::=+ ::=- ::= ::=+ ::=- ::= ::=* ::=/ ::=ident ::=number ::=( ) Alternatives sont transformées en productions séparées Répétition doivent être exprimée par récursion Avantages Sans méta symboles ( |, (), [], {}) Plus facile à construire un arbre syntaxique Inconvénient Lourdeur

29 Arbre syntaxique Montre la structure dune phrase particulière Ex. pour * i Arbre syntaxique concret (Arbre de lanalyseur) number+*ident Factor Term number Factor TermMulopFactorSign TermAddopExpr Reflète les priorités des opérateurs : de bas en haut dans larbre. Arbre syntaxique abstrait (feuilles = opérandes, nœuds internes = opérateurs) numberident * + number Souvent utilisé comme une représentation interne dun programme; Utilisé pour les optimisations.

30 Ambiguïté Une grammaire est ambiguë, si plus dun arbre syntaxique peuvent être construits pour une phrase donnée. Exemple T = F | T "*" T. F = id. phrase: id * id * id 2 arbres syntaxiques existent pour cette phrase id F T F T * T F T * T F T F T * T F T * T Les grammaires ambiguës causent des problèmes dans lanalyse syntaxique!

31 Éviter lambiguïté Exemple T = F | T "*" T. F = id. Remarque : seule la grammaire est ambiguë, pas le langage. La grammaire peut être transformée : T = F | T "*" F. F = id. cad. T a la priorité sur F Encore mieux : transformation vers EBNF T = F { "*" F }. F = id. id F T F * T F * T Un seul arbre syntaxique est possible

33 Vue générale Motivation Structure dun compilateur Grammaires Arbres Syntaxiques et Ambiguïté Classification de Chomsky Présentation Z#

34 Classification des grammaires Due à Noam Chomsky (1956) Les grammaires sont des ensembles de productions de la forme =. class 0 Grammaires non restritives ( et arbitraires) Ex.: A = a A b | B c B. aBc = d. dB = bb. A => aAb => aBcBb => dBb => bbb Reconnues par les machines de Turing class 1 Grammaires à contexte sensitif ( =xUy et =xuy),U=NT Ex:a A = a b c. Reconnues par les automates linéaires finis class 2 Grammaires à contexte-libre ( = NT, # ) Ex: A = a b c. Reconnues par les automates à piles class 3 Grammaires régulières ( = NT, = T | T NT) Ex: A = b | b B. Reconnues par les automates finis Seules ces deux classes sont exploitées dans la construction des compilateurs.

35 Vue générale Motivation Structure dun compilateur Grammaires Arbres Syntaxiques et Ambiguïté Classification de Chomsky Présentation Z#

36 Un prototype de langage objet simple : z # Un programme est composé dune seule classe avec des variables globales et méthodes. Il ny a pas de classes externes mais seulement des classes internes. Les classes internes sont utilisées comme des types de données. La méthode principale est toujours appelée Main(). Quand le programme est appelé, cette méthode est exécutée en premier

37 Un prototype de langage objet simple : z # Éléments : - constantes de type int (Ex: 123) et char (Ex. 'a').Pas de constantes chaîne de caractères. - variables: toutes les variables structurées contiennent des références (pointeurs); - les variables dans la classe principale sont statiques (globales). - Types de base : int, char (Unicode, 2 octets) - Types structurés: tableau à une dimension et classes internes avec des champs mais sans méthodes. - les méthodes sont définies dans la classe principale. - procédures prédéfinies : ord, chr, len.

38 Exemple de programme z # class P const int size = 10; class Table { int pos[]; int neg[]; } Table val; { void Main () int x, i; { // Initialize val val = new Table;val.pos = new int[size]; val.neg = new int[size]; i = 0; while (i < size) { val.pos[i] = 0; val.neg[i] = 0;i++; } // Read values read(x); while (-size < x && x < size) { if (0 <= x) val.pos[x]++;else val.neg[-x]++; read(x); }

39 Syntaxe complète de z # Program= "class" ident { ConstDecl | VarDecl | ClassDecl } "{" { MethodDecl } "}". ConstDecl= "const" Type ident "=" ( number | charConst ) ";". VarDecl= Type ident { "," ident } ";". ClassDecl= "class" ident "{" { VarDecl } "}". MethodDecl= ( Type | "void" ) ident "(" [ FormPars ] ")" { VarDecl } Block. FormPars= Type ident { "," Type ident }. Type= ident [ "[" "]" ]. Statement= Designator ( "=" Expr | "(" [ ActPars ] ")" | "++" | "--" ) ";" | "if" "(" Condition ")" Statement [ "else" Statement ] | "while" "(" Condition ")" Statement | "break" ";" | "return" [ Expr ] ";" | "read" "(" Designator ")" ";" | "write" "(" Expr [ "," number ] ")" ";" | Block | ";". Block= "{" { Statement } "}". ActPars= Expr { "," Expr }.

40 Syntaxe complète de z# (suite) Condition= CondTerm { "||" CondTerm }. CondTerm= CondFact { "&&" CondFact }. CondFact= Expr Relop Expr. Expr= [ "-" ] Term { Addop Term }. Term= Factor { Mulop Factor }. Factor= Designator [ "(" [ ActPars ] ")" ] | number | charConst | "new" ident [ "[" Expr "]" ] | "(" Expr ")". Designator= ident { "." ident | "[" Expr "]" }. Relop= "==" | "!=" | ">" | ">=" | "<" | "<=". Addop= "+" | "-". Mulop= "*" | "/" | "%".


Télécharger ppt "Vue générale Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure dInformatique (ESI)"

Présentations similaires


Annonces Google