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 …
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.