langages de programmation - cjoint.com · 2019. 1. 14. · langages de programmation langage...

83
Aucune Ne dépend pas de la machine Dépend de de la machine Langages de Programmation Français Anglais Arabe Almand CC++Java …

Upload: others

Post on 28-Jan-2021

17 views

Category:

Documents


0 download

TRANSCRIPT

  • Aucune

    Ne dépend pas de la machine

    Dépend de de la machine

    Langages de Programmation

    Français

    Anglais

    Arabe

    Almand

    C、C++、Java …

  • Langages de Programmation

    Langage Machine (Binaire)

    Langage Assembleur

    — Assembleur converti Assembleur en langage machine

    Langages de Haut niveau (C, java, pascal, Perl, Shell)

    — Compilé : C, Pascal

    — Interprété : Perl, Shell

  • Exemple : de langage de haut niveau

    Utilisation d’un éditeur de texte pour créer un fichier source e.g. Ecrire.c :

    #include

    int main() { printf(‘’Un Simple programme en C !\n’’);

    return 0;

    }

  • Langages d’assemblage ou assembleurs

    Des versions un peu plus lisibles que du code machine

    Utilisent des noms symboliques pour les opérations et

    pour les opérandes.

    L’assemblage consiste à traduire un code en un

    assembleur vers le code binaire

    MOV a, R1

    ADD #2, R1

    MOV R1, b

    Spécificité :

    • Chaque processeur a son langage d'assemblage

    • Les langages d'assemblage d'un même constructeur se

    ressemblent

  • Langages machines

    Spécificité

    Fatigant

    Source d’erreurs

    Connaissances approfondies de la machine

    Exemples d'instructions binaires

    0001 01 00 00000000

    0011 01 10 00000010

    0010 01 00 00000100

    Les 4 premiers bits : correspondent au code de l’instruction

    0001 = charger

    0011 = ajouter

    0010 = sauvegarder

  • Introduction à la compilation

    Un compilateur est un programme qui traduit un autre programme

    Premier compilateur : compilateur Fortran de J. Backus (1957)

    Langage source : langage de haut niveau (C, C++, Java, Pascal,

    Fortran...)

    Langage cible : langage de bas niveau (assembleur, langage

    machine)

    compilateur programme

    source

    messages

    d'erreur

    programme

    cible

  • Exécution des langages

    Deux variantes :

    1. Les interpréteurs

    - lisent le programme au fur et à mesure

    les programmes peuvent être créés dynamiquement

    2. Les compilateurs

    - traduisent l’ensemble du programme

    soit - en langage d’une machine concrète

    ou - en langage d’une machine abstraite

    SECD Stack, Environment, Control, Dump; P.J. Lardin

    WAM (Machine abstraite de Warren) pour Prolog.

    JVM Java Virtual Machine, byte code Java

    P CODEMACHINE

  • 8

    Interpréteurs & Compilateurs

    Solutions Communes

    Compilateurs et interpréteurs tous les deux doivent lire les entrées – un flot de caractères – et “les comprendre” ; faire leur analyse

    int n, i, fact;

    for (i = 1, fact = 1; i

  • 9

    Interpréteurs & Compilateurs

    Interpréteur

    — Un programme qui lit un programme source, l’analyse et produit les résultats d’exécution du programme.

    Compilateur

    — Un programme qui traduit un programme d’un langage (source) à un autre programme d’un langage (cible)

  • Interpréteurs

    “Interprétation”

    — Moteur d’Exécution : exécuter les opérations du programme source

    — Exécution du programme entrelacée avec l’analyse

    Interpréteur

    Programme

    Source

    Entrées

    Sorties

    Messages d’Erreurs

  • Que fait un Compilateur ?

    11

    Un compilateur agit comme un traducteur, transforme des langages de programmation orienté humain en langages machine orienté-ordinateur.

    — Ignore les détails machine pour le programmeur

    Langage de

    Programmation

    (Source) :

    Orienté Humain

    Compilateur

    Langage

    Machine

    (cible)

    Orienté

    Ordinateur

  • 12

    Que fait un Compilateur ?

    Reconnaisseur, Traducteur et Optimiseur Lit et analyse le programme en entier

    - Reconnaître les programmes légaux (et illégaux)

    Le traduit en un programme sémantiquement équivalent dans un autre langage

    — Gérer le stockage des variables ainsi que le code

    — Traduire en format du code objet (ou assemblage)

    — Facile à exécuter, rapide et efficace

    — Améliore le programme d’une certaine façon

  • Compilateurs

    “Compilation”

    — Traduction d’un programme écrit dans un langage source en un programme sémantiquement équivalent écrit dans un langage cible.

    Compilateur

    Messages d’Erreurs

    Programme

    Source

    Programme

    Cible

    Entrée

    Sorties

  • Quelques termes

    Source — Le langage dans lequel est écrit le programme

    Objet — Le langage machine équivalent du programme après

    compilation

    Compilateur — Un programme logiciel qui traduit le code source en code

    objet

    — Assembleur est un cas spécial de compilateur où le source était écrit en langage d’Assemblage

  • Exemple de Compilation

    Conversion du Source en Objet

    Exemple : Somme = V1 + V2

    Compilation au langage Machine :

    LDR R1, V1

    LDR R2, V2

    ADD R1, R1, R2

    STR R1, Somme

  • Processus de Compilation

    Invoque le compilateur sur le programme source pour générer le langage machine équivalent

    Compilateur traduit l’objet source en cible

    Détection et signalisation des erreurs avec possibilité de les corriger

    Sauvegarde les objets de sorties comme fichier[s] disque

    Les grands Systèmes peuvent avoir plusieurs programmes source

    Chacun doit être compilé (compilation séparée)

  • 17

    Implémentations de compilateurs ou interpréteurs

    Compilateurs — FORTRAN, C, C++, Java, COBOL, Pascal, etc.

    — Fort besoin d'optimisation, rénovation, etc.

    Interpréteurs — PERL, BASIC, Python, awk, sed, sh, csh, postscript printer,

    Java VM

  • Cousins des compilateurs

    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.

    Linkeurs (Editeurs de lien)

    Chargeur

    Assembleurs

  • Étapes de Compilation des programmes

    Créer/Editer le programme source dan un langage de haut niveau

    Compiler le source

    lier (Linker) les objets des modules ensemble

    Tester l’exécutable

    Si erreurs logiques, Recommencer

    Stop

  • Liaison des objets des modules ensemble

    Prendre des objets des modules multiples

    Les combiner ensemble pour former l’exécutable

    Le LINKER (éditeur de lien) prend les objets module(s) et crée des exécutables — résout les références au autres objets modules

    — traite les appels aux bibliothèques externes (e. g. fonctions mathématiques)

    — Rassemble les fichiers objets pour ne former qu’un exécutable

    Certains langages modernes (e.g. Java) n'ont pas besoin de cette étape

  • 21

    Approches Hybrides

    Exemple bien connu est celui du Java

    Pour avoir une exécution, compilation suivie par interprétation : — Compilation du source Java en byte code – Java

    Virtual Machine language ( des fichiers .class)

    — Exécution – Interprète le byte code directement, ou

    – Compile quelque ou tout le byte code en code natif

  • Approches Hybrides

    Machine

    Virtuelle

    Traducteur

    Programme

    Source

    Programme

    intermédiaire

    input

    output

  • 23

    Les principales “Phases” d’un Compilateur

    Analyse Syntaxique

    Analyse Sémantique

    Génération de Code

    Programme Source

    Abstract Syntax Tree (arbre de syntaxe abstrait)

    Abstract Syntax Tree Décoré

    Code Objet

    Reports des Erreurs

    Reports des Erreurs

    Analyse Lexicale Reports des Erreurs

    Suite de lexèmes

  • Prétraitements, Compilateurs, Assembleurs, et Linkeurs

    Prétraitement

    Compilateur

    Assembleuur

    Linker

    « Squelette" de Programme Source

    Programme Source

    Programme Cible

    en langage d'assemblage

    Code Objet relogeable

    Code Machine Absolu

    Bibliothèques et

    Fichiers objet relogeable

  • 25

    Compilateur ?

    • Un compilateur est un programme d’ordinateur qui traduit un programme d’un langage source en un programme équivalent d’un langage cible.

    • Un programme/code source est un programme/code écrit dans le langage source, qui est généralement un langage de haut niveau.

    • Un programme/code cible est un programme/code écrit dans le langage cible, qui est souvent un langage machine ou un code intermédiaire.

    compilateur

    Programme

    Source

    Programme

    cible

    Message

    d’Erreurs

  • 26

    Editeur Compilateur Assembleur

    Linkeur

    Chargeur Débuggeur

    Programmeur Programme

    Source

    code Assembleur

    Code Machine

    Code Machine

    Image Executable

    résultats Débogage

    Programmeur fait des Correction manuelles du code

    Exécution sur la Machine cible

    Exécution sous Contrôle du debugger

    Environnement d'un compilateur

  • Environnement d'un compilateur

    "squelette" de programme source

    programme cible

    en langage d'assemblage

    préprocesseur

    code relogeable

    programme source prétraité

    code machine absolu

    compilateur

    assembleur

    éditeur de liens bibliothèque

    chargeur

    code relogeable

  • Préprocesseurs

    Traitement des macros #define

    Inclusion de fichiers #include

    Extensions de langages #ifdef

    Les définitions de macros permettent l'utilisation de paramètres.

  • 29

    Environnement Intégré

    Compilateur fait partie de l’environnement de développement du programme

    Les autres composantes de cet environnement sont l’éditeur, assembleur, linkeur, loadeur, debuggeur, etc.

    Le compilateur (et tous les autres outils) doivent se supporté mutuellement pour un développement de programmes simple

  • Interprétation

    Pas d’édition de lien

    Pas de génération de code objet

    Instructions du source exécutées line par ligne

  • Étapes d’interprétation

    Lecture d’une ligne source

    Analyse la ligne

    Faire ce que la ligne indique

    — Allouer l’espace aux variables

    — Execute les opérations arithmétiques, etc..

    — Refaire l’étape 1

  • Avantages de la Compilation

    Exécution rapide

    Fichier unique à exécuter

    Compilateur peut faire un meilleur diagnostic des erreurs syntaxique et sémantiques, car il a plus d'infos qu'un interprète (interprète ne voit qu'une ligne à la fois)

    Compiler peut optimiser le code

  • Désavantages de la Compilation

    Plus difficile à déboguer

    Prend plus de temps pour changer le code source, recompiler et relinker

  • Avantages de l’Interpréteur

    Plus facile à déboguer

    Temps de développement plus rapide

  • Désavantages de l’Interpréteur

    Temps d'exécution plus lent

    Pas d'optimisation

    Besoin de tout le code source disponible

    Code source plus grand que l'exécutable pour les grands systèmes

  • Problème pas Totalement Résolu ?

    Machines changent constamment

    — Changement dans l’architecture changes dans les compilateurs

    — Nouvelles fonctionnalités (besoins) posent de nouveaux problèmes

    — Evolution des couts entraîne des préoccupations différentes

    — Anciennes solutions doivent être remaniées (re-engineering)

    Innovations dans les compilateurs devraient susciter des changements dans l’architecture

    — Nouveaux langages et fonctionnalités

    36

  • Qualités importantes d’un compilateur ?

    1. Code Correct

    2. Exécution rapide des outputs( Code cible)

    3. Compilateur rapide

    4. Temps de compilation est proportionnel à la taille du programme source

    5. Supporte la compilation séparée

    6. Bons diagnostics pour les erreurs syntaxiques

    7. Bon fonctionnement avec le debugger

    8. Bons diagnostics pour les flux d’anomalies

    9. Appels croisés des langages

    10. Optimisation cohérente et prévisible

    37

  • Un Peu d’Histoire

    Cause — Logiciel pour les premiers ordinateurs a été écrit en langage

    assembleur

    — Les avantages de la réutilisation des logiciels sur différentes CPU’s ont commencé à devenir beaucoup plus important que le coût d'écriture d'un compilateur

    Le premier compilateur réel — Les premiers compilateurs datent des années 50. Dans le

    contexte de l’état de l’art de l’époque, ce sont des programmes difficiles à réaliser.

    — Le compilateur FORTRAN à la fin des années 1950’s

    — est estimé à un travail de 18 années-hommes à construire

    38

  • Un Peu d’Histoire

    Début des années 1950’s : Langages d'assemblage mnémoniques (Des instructions macro ont été ajoutées plus tard).

    1952: Premier compilateur (linker/loader) écrit par Grace Hopper pour le langage de programmation A-0

    1957: Premier compilateur complet pour le langage FORTRAN (calcul scientifique) écrit par John Backus et son équipe

    1960: compilateurs COBOL (traitement de données commerciales) pour plusieurs architectures

    1962: Premier compilateur self-hosting pour LISP (calcul symbolique)

    39

    Grand pas vers l'assembleur — notations de haut niveau

  • Un Peu d’Histoire

    40

    Les progrès effectués dans la construction des compilateurs

    sont considérables; ils sont dus principalement à plusieurs

    causes:

    La compréhension et la définition formelle des tâches à

    réaliser,

    La découverte des fondements théoriques qui apportent

    des résultats utilisables en pratique.

    Les avancées méthodologiques dans la production des

    grands logiciels,

    Le développement d’outils logiciels puissants et fiables.

  • Rôle d’un compilateur

    compilateur Code source Code cible

    Code machine du compilateur

    compilateur

    d’implémentation

    Générateur de

    compilateur

    (Flex, Bison)

    Code d’implémentation du compilateur

    Spécification

  • Outils logiciels

    Outils d’aide à la construction de compilateurs

    Générateurs d’analyseurs lexicaux

    Engendrent un analyseur lexical (scanner, lexer) sous forme

    d’automate fini à partir d’une spécification sous forme

    d’expressions rationnelles

    Flex, Lex

    Générateurs d’analyseurs syntaxiques

    Engendrent un analyseur syntaxique (parser) à partir d’une

    grammaire

    Bison, Yacc

    Générateurs de traducteurs

    Engendrent un traducteur à partir d’un schéma de traduction

    (grammaire + règles sémantiques)

    Bison, Yacc

  • 43

    Idée: Traduction en étapes

    Série de représentations de programmes

    Représentations intermédiaires optimisées pour des manipulations de programmes de différentes types (vérification, optimisation)

    Devient plus spécifique à la machine, moins spécifique au langage après la traduction

  • 44

    Tout compilateur doit effectuer deux tâches principales

    — Analyse du programme source

    — Synthèse d’un programme en langage machine

    Le Modèle d‘Analyse-Synthèse de la compilation

    Compilateur

    Analyse Synthèse

  • Le Modèle d’Analyse-Synthèse de la compilation

    La compilation comporte deux parties :

    — L'analyse détermine les opérations exprimées par le programme source qui sont enregistrées dans une structure d’arbre

    — La synthèse prend la structure arborescente et en traduit les opérations dans le programme cible

  • 46

    Structure d’un Compilateur

    Première approximation

    — Partie avant (Front end) : analyse

    – Lire le programme source et comprendre sa structure et sa signification

    — Partie arrière (Back end) : synthèse

    – Génère le programme équivalent en langage cible

    Source Cible Front End Back End

  • Modèle Analyse et Synthèse

    Les compilateurs sont le plus souvent conçus à base du modèle Analyse-Synthèse qui consiste à dissocier deux parties distinctes :

    – Partie avant ou frontale (« front end » ) : Indépendante de la machine

    • Analyse le programme source, conformément à la définition du langage compilé, indépendamment du langage cible.

    • Regroupe tout ce qui dépend du langage source plutôt que de la machine cible. Possibilité d’utiliser la même partie frontale sur une machine différente

    – Partie Arrière ou Finale (« back-end »): Dépendante de la machine

    • Produit le code généré, conformément à la définition du langage cible, indépendamment du langage source (synthèse).

    • Regroupe le reste

    Les deux parties communiquent entre elles via une ou plusieurs structures de données intermédiaire, le plus souvent des tables et/ou des arbres; une approche plus moderne utilise une communication de type API Java .

    47

  • Exemples de compilateurs GNU

    C

    ANSI

    68000 Pentium Power

    Ada

    95 C++ Pascal Front-ends

    partie avant

    Middle-end (5)

    Partie centrale

    Back-ends

    partie arrière

  • Modèle Analyse et Synthèse

    — Les compilateurs actuels sont le plus souvent conçus sur le modèle Analyse et Synthèse qui consiste à dissocier deux parties distinctes:

    – La partie Avant ou Frontale(« front-end ») qui analyse le programme source, conformément à la définition du langage compilé, indépendamment du langage cible.

    – La partie Arrière ou Finale (« back-end ») qui produit le code généré, conformément à la définition du langage cible, indépendamment du langage source.

    – Les deux parties communiquent entre elles via une ou plusieurs structures de données intermédiaire, le plus souvent des tables et/ou des arbres; une approche plus moderne utilise une communication de type API Java .

    49

  • Groupement des phases et en Passes

    Partie frontale (front end)

    Regroupe tout ce qui dépend du langage source plutôt que de la

    machine cible. On peut utiliser la même partie frontale sur des

    machines différentes

    Partie arrière (back end)

    Regroupe le reste

    Passes

    Plusieurs phases peuvent être regroupées dans une même passe

    consistant à lire un fichier et en écrire un autre

    Analyse lexicale, syntaxique, sémantique et génération de code

    intermédiaire peuvent être regroupées en une seule passe

    La réduction du nombre de passes accélère le traitement

  • Groupement en Passes

    Passes d’un compilateur :

    — Une collection de phases se fait une seule fois (passe simple) ou plusieurs fois (multipasses)

    – Passe simple : nécessite généralement que tout soit défini avant d'être utilisé dans le programme source

    – Multipasses : le compilateur peut conserver toute la représentation du programme en mémoire

  • 52

    Implications

    Doit reconnaître les programmes correctes (et se manifestent contre ceux qui sont incorrectes)

    Doit générer du code qui est correct

    Doit gérer le stockage de toutes les variables

    Doit inter-opérer avec l’OS & linker sur le format cible

    Source Objet Front End Back End

  • 53

    Plus d’Implications

    Besoin d’une Représentation Intermédiaire (RI)

    Partie frontale transforme le code source en RI

    Partie arrière transforme la RI en code machine cible

    Source Cible Front End Back End

  • Analyseur Lexical

    Analyseur Syntaxique

    Analyseur Sémantique

    Générateur de Code

    intermédiaire

    Optimiseur du Code

    Dépendent-Machine

    Générateur de Code

    Optimiseur du Code

    Dépendent-Machine

    Flux de caractères

    Code objet-machine

    Suite de tokens

    Arbre syntaxique

    Arbre syntaxique décoré

    Représentation intermédiaire

    code objet -machine-

    Représentation intermédiaire

    code objet -machine-

    Table des

    Symboles

    Phases d’un

    Compilateur

  • Les phases de la compilation

    programme cible

    gestion de la

    table des symboles

    programme source

    analyseur lexical

    gestion des erreurs

    analyseur syntaxique

    analyseur sémantique

    générateur de code intermédiaire

    "optimiseur" de code

    générateur de code cible

  • 56

    Structure Standard d’un Compilateur

    Code Source

    (suite de caractères) Analyse Lexicale

    Analyse syntaxique

    Suite de Tokens

    Arbre syntaxique Abstrait

    Génération de Code Intermédiaire

    Code Intermédiaire

    Optimization

    Code generation

    Code Assembleur

    Code Intermédiaire

    Partie Frontale

    (indépendante de

    la machine)

    Partie Arrière

    (indépendante de

    la machine)

  • La Structure d’un Compilateur

    Analyseur

    Lexical

    Analyseur

    Syntaxique

    Routines

    Sémantiques

    Générateur

    de Code

    Optimiseur

    Programme

    Source Tokens

    Syntaxique

    Structure

    Table

    Des Symboles

    (Utilisée par toutes les phases du

    compilateur)

    (Suite de

    Caractères ) Représentation

    Intermédiaire

    Code machine cible

  • Structure d’un compilateur

    1. analyse lexicale

    2. crible

    3. analyse syntaxique

    4. analyse sémantique

    5. optimisations

    6. allocation mémoire

    7. génération de code

    8. optimisations propres à la cible

    avant

    arr

    ière

    reconnaître les « mots »

    reconnaître les « phrases »

    vérifier les types, etc.

    élimination de code inutile, etc.

    choisir la place des variables

    instructions machine

    séquence plus efficaces

  • 59

    Front End

    > Split into two parts

    — Scanner: Responsible for converting character stream to token stream

    – Also strips out white space, comments

    — Parser: Reads token stream; generates IR

    > Both of these can be generated automatically

    — Source language specified by a formal grammar

    — Tools read the grammar and generate scanner & parser (either table-driven or hard coded)

    Scanner Parser source tokens IR

  • Place de l’analyse lexicale

    Analyseur

    lexical Texte source

    = caractères « mots »

    = lexèmes

    générateur

    d’analyseur

    lexical

    Expressions régulières

    Automate fini

  • Pourquoi une Représentation Intermédiaire

    Partie frontale, RI et Partie arrière doivent

    encoder les informations nécessaires pour toutes

    les nm combinaisons!

    61

  • 62

    Problème M*N vs M+N

    F1

    F2

    F3

    FM

    B1

    B2

    B3

    BN

    Exige M*N compilateurs

    F1

    F2

    F3

    FM

    B1

    B2

    B3

    BN

    Langage Intermédiaire Universel

    LI U

    niverse

    l

    Exige M Parties frontales et N parties arrières

    M+N compilateurs

  • 63

    Traitement des Erreurs

    Erreurs peuvent être détectées durant toutes les phases de la compilation.

    — Erreurs détectées durant la compilation sont appelées erreurs statiques (ou erreurs de temps de compilation).

    — Erreurs détectées durant l’exécution sont appelées erreurs dynamiques (ou erreurs de temps d’exécution).

    Les compilateurs doivent détecter, signaler et récupérer des erreurs trouvées dans les programmes sources

    Les gestionnaires d'erreurs sont différents dans les différentes phases du compilateur

  • 64

    Quelques Structures de Données

    Table des Symboles

    Table littérale

  • 65

    Table des Symboles

    Identificateurs sont des noms de variables, constantes, fonctions, types de données, etc.

    Sauvegarder les informations associées aux identificateurs

    — Informations associées aux différents types d’identificateurs peuvent être différentes

    • Informations associées aux variables sont noms, type, adresse, taille (pour les tableaux), etc.

    • Informations associées aux fonctions sont noms, type des valeurs retournées, paramètres, adresses, etc.

  • 66

    Table des Symboles

    Accédée à toutes les phases des compilateurs

    — Les analyseurs lexical, syntaxique et sémantique mettent les noms d'identificateurs dans la table des symboles.

    — L'analyseur sémantique stocke plus d'informations (par exemple les types de données) dans la table.

    — Le générateur de code intermédiaire, l'optimiseur de code et le générateur de code utilisent les informations de la table de symboles pour générer le code approprié.

    Utilise principalement la table de hachage pour plus d'efficacité.

  • 67

    Table littérale

    Conserver les constantes et les chaînes utilisées dans le programme

    — Réduire la taille de la mémoire en réutilisant des constantes et des chaînes

    Peut être combinée avec une table de symboles

  • Partie Frontale

    • Reconnaître le code légal

    • signaler les erreurs

    • produire RI

    Une grande partie de la construction frontale peut être

    automatisée 68

  • La Structure d’un Compilateur

    69

    Analyseur

    Lexical

    Analyseur

    Syntaxique

    Analyse

    Sémantique

    Générateur

    de Code

    Optimiseur

    Programme

    Source Tokens

    Syntaxique

    Structure

    Symbol and

    Attribute

    Tables

    (Used by all

    Phases of

    The Compiler)

    Analyseur lexical L’analyseur lexical commence l’analyse du programme

    source par la lecture de l’entrée, caractère par caractère,

    et groupe les caractères en mots et symboles individuels

    (tokens)

    ER (Expression Régulières )

    AFN (Automate Fini Non-déterministe )

    AFD(Automate Fini Non-déterministe )

    LEX

    (Suite de

    Caractères) Représentation

    Intermédiaire

    Code machine cible

  • Analyseur Lexical

    • Transforme les caractères (lexèmes) en tokens

    • La valeur de la chaîne de caractères pour un jeton

    est un lexème

    • Elimine les espaces (blancs)

    x = x + y = +

    70

  • Le rôle Analyseur Lexical

    、Interaction de analyseur lexical avec l’analyseur syntaxique

    Analyseur

    Lexical Analyseur

    Syntaxique

    Table des

    Symboles

    Programme

    Source

    token

    Avoir le

    token suivant

  • Place de l’Analyse Lexicale

    Analyseur

    lexical Texte source

    = caractères « mots »

    = lexèmes

    générateur

    d’analyseur

    lexical

    Expressions régulières

    Automate fini

  • La Structure d’un Compilateur

    73

    Analyseur

    Lexical

    Analyseur

    Syntaxique

    Analyse

    Sémantique

    Générateur

    de Code

    Optimiseur

    Programme

    Source Tokens

    Syntaxique

    Structure

    Symbol and

    Attribute

    Tables

    (Used by all

    Phases of

    The Compiler)

    (Suite de

    Caractères) Représentation

    Intermédiaire

    Code machine cible

    Analyseur Syntaxique Etant donnée une spécification syntaxique formelle (une

    grammaire algébrique [grammaire à contexte-libre GCL] ),

    l’analyseur syntaxique lit les tokens et les regroupent en

    unités comme il était spécifié par les productions de la

    GCL.

    Comme la structure syntaxique est reconnue, le parseur

    appelle directement les routines sémantiques

    correspondantes ou construit un arbre de syntaxe GCL (Grammaire à Contexte-Libre)

    FBN (Forme de Backus-Naur)

    Analyseurs LL, LR, SLR, LALR

    YACC

  • Analyseur Syntaxique (Parser)

    • Reconnaître la syntaxe à contexte libre

    • Produire des messages d'erreur significatifs

    • Tentative de correction des erreurs

    Les générateurs d'analyseurs syntaxique automatisent

    une grande partie du travail

    74

  • Grammaires à Contexte-Libre

    1. :=

    2. :=

    3. |

    4. := nombre

    5. | id

    6. := +

    7. | -

    Syntaxe à Contexte-

    libre est spécifiée

    avec une grammaire,

    généralement dans la

    forme Backus-Naur

    (BNF)

    Un grammaire G = (S,VN,VT,P)

    • S est l’axiome symbole-de départ

    • VN est l’ensemble des symboles non-terminaux

    • VT est l’ensemble des symboles terminaux

    • P est l’ensemble des productions — P: N (N T)*

    75

  • La Structure d’un Compilateur

    76

    Analyseur

    Lexical Analyseur

    Analyse

    Sémantique

    Générateur

    de Code

    Optimiseur

    Programme

    Source Tokens

    Syntaxique

    Structure

    Symbol and

    Attribute

    Tables

    (Used by all

    Phases of

    The Compiler)

    (Suite de

    Caractères) Représentation

    Intermédiaire

    Code machine cible

    Analyse Sémantique Effectuer deux fonctions

    Vérifier la sémantique statique de chaque construction

    Le cœur d'un compilateur

    Traduction Dirigée par la Syntaxe

    Techniques de traitement sémantique

    RI (Représentation intermédiaire

  • La Structure d’un Compilateur

    77

    Analyseur

    Lexical Analyseur

    Analyse

    Sémantique

    Générateur

    de Code

    Optimiseur

    Programme

    Source Tokens

    Syntaxique

    Structure

    Symbol and

    Attribute

    Tables

    (Used by all

    Phases of

    The Compiler)

    (Suite de

    Caractères) Représentation

    Intermédiaire

    Code machine cible

    Optimiseur Le code RI généré par les routines sémantiques est

    analysé et transformé en code fonctionnellement

    équivalent mais une RI améliorée

    Cette phase peut être très complexe et lente

    Optimisation de boucle, allocation de registre,

    ordonnancement du code

  • La Structure d’un Compilateur

    78

    Analyseur

    Lexical Analyseur

    Analyse

    Sémantique

    Générateur

    de Code

    Optimiseur

    Programme

    Source Tokens

    Syntaxique

    Structure

    Symbol and

    Attribute

    Tables

    (Used by all

    Phases of

    The Compiler)

    (Suite de

    Caractères) Représentation

    Intermédiaire

    Code machine cible

    Générateur de Code Génération de code d'interprétation

  • La Structure d’un Compilateur

    79

    Scanner [Lexical Analyzer]

    Parser [Syntax Analyzer]

    Semantic Process [Semantic analyzer]

    Code Generator [Intermediate Code Generator]

    Code Optimizer

    Tokens

    Arbre

    syntaxique

    abstrait

    Arbre syntaxique abstrait décoré

    Non-optimized Intermediate Code

    Optimized Intermediate Code

    Code Optimizer

    Target machine code

  • Arbre d’Analyse

    Une analyse peut être représentée

    par un arbre appelé arbre

    syntaxique.

    80

  • Arbre Syntaxique Abstrait

    les compilateurs utilisent un arbre syntaxique abstrait (ASA).

    81

  • Lex — Générateur de scanner

    1975 développé aux laboratoires Bell

    • génère un scanner en forme de AEFD

    • A l’origine un outil de Unix, aujourd'hui aussi pour Windows

    • A l’origine pour C, Aujourd’hui aussi pour Java

    • Coopère généralement avec Yacc

    Histoire

    Versions actuelles

    flex version GNU de Lex (pour C)

    http://www.gnu.org/software/flex/

    JLex version Java ;

    incompatible avec Bison ou Byacc

    http://www.cs.princeton.edu/~appel/modern/java/JLex/

    CsLex version C# , dérivé de JLex

    http://www.cybercom.net/~zbrad/DotNet/Lex

    Utilisation

    sample.l Lex sample.yy.c

    C-Compiler sample.o sample.y Yacc sample.tab.c

    include

  • Fonctionnement des générateurs de compilateurs

    Ils génèrent les parties d’un compilateur à partir d’une spécification concise (Parties générées : analyseur lexical, analyseur syntaxique et sémantique, générateur de

    code , ...)

    Générateur

    De compilateurs

    Spécification de l’analyseur lexical Ex. expressions régulière)

    générateur

    d’analyseur

    lexical

    Analyseur lexical

    Spécification sémantique (Ex. grammaire d’attribut)

    générateur

    de

    l’analyseur

    syntaxique

    Analyseur

    syntaxique Classes utilisateur

    • Table des symboles

    • Générateur de code

    • Programme principal

    • ...

    compilateur

    & éditeur de

    liens

    Compilateur

    Exemples

    Yacc générateur d’analyseur syntaxique et sémantique pour C et Java

    Lex générateur d’analyseurs lexicaux pour C, Java et C#

    Coco/R générateur d’analyseur lexical et syntaxique pour Java.