Suite du cours de compilation
1
Interpréteurs
Un interprète, ou interpréteur, est un outil ayant pour
tâche d'analyser, de traduire et d'exécuter les programmes
écrits dans un langage informatique. On qualifie les langages
dont les programmes sont généralement exécutés par un
interpréteur de langages interprétés.
Un interpréteur se distingue d’un compilateur par le fait que,
pour exécuter un programme, les opérations d’analyse et de
traductions sont réalisées à chaque exécution instruction par
instruction du programme (par un interpréteur) plutôt
qu’une fois pour toutes (par un compilateur).
2
Interpréteurs
On différencie un programme dit script, d'un programme
dit compilé, par:
- Un programme script est exécuté à partir du fichier source via un
interpréteur de script ;
- Un programme compilé est exécuté à partir d'un bloc en langage
machine issu de la traduction du fichier source.
Le cycle d'un interprète est le suivant :
- lire et analyser une instruction (ou expression) ;
- si l'instruction est syntaxiquement correcte, l'exécuter (ou
évaluer l'expression) ;
- passer à l'instruction suivante.
3
Interpréteurs
Certains traducteurs ne possèdent pas de phase de génération
de code en langage machine.
Ils s’arrêtent à la production de code intermédiaire(on peut
penser par exemple à java qui produit un fichier binaire dans
un format propriétaire avec l’extension .class).
L’exécution du programme source consiste en une
interprétation du code intermédiaire par un programme
appelé interprète ou interpréteur.
Dans le cas où le code interprété est de type binaire, on parle
alors de runtime ou environnement d’exécution.
4
Interpréteurs
Pour l’exemple de Java: un programme en java est d’abord
traduit en code intermédiaire (.class) par un traducteur et
puis interprété par une machine java virtuelle (JVM).Le code
(.class) intermédiaire est indépendant de la machine, il peut
être interprété sur n’importe quelle machine disposant d’une
JVM.
5 17/05/2024
Différents types de traducteurs
Assembleurs: le langage source des assembleurs utilise une
représentation symbolique des instructions machine. Un
assembleur traduit une instruction symbolique en une
instruction machine.
Compilateurs: le langage source des compilateurs est de haut
niveau. Une instruction du langage source est souvent
traduite en un nombre important d’instructions du langage
objet de bas niveau. Lorsque le langage produit n'est pas
destiné à la machine sur laquelle tourne le compilateur, on
parle de cross-compilateur.
6 17/05/2024
Différents types de traducteurs
Préprocesseur: est un programme qui procède à des
transformations sur un code source, avant l'étape de
traduction proprement dite (compilation ou interprétation).
Le nom de préprocesseur s’explique par le fait que le rôle est
d’effectuer un pré-traitement dont le résultat est destiné à un
autre traducteur.
- Le langage source et langage objet sont de haut niveau
- Il y a 2 types de préprocesseurs:
7 17/05/2024
Différents types de traducteurs
1. Il y a ceux qui fournissent à l’utilisateur un sur-ensemble
d’un langage donné en ajoutant certaines fonctionnalités
absentes du langage. C’est le cas par exemple des
préprocesseurs TBL, EQN et PIC utilisés avec le formateur
TROFF sous Unix. Ils sont destinés à traduire des macro-
instructions de pré-traitement et leurs arguments en code
source troff standard. Le programme tbl est un
préprocesseur de tableaux, eqn gère les équations et les
mathématiques en général, et enfin pic est un préprocesseur
d'images
8 17/05/2024
Différents types de traducteurs
2. Il y a ceux qui agissent en tant qu’outils de macro-expansion,
comme avec le cas de TEX, C, postscript.
- Le mécanisme des macros est fréquemment utilisé en C
pour définir de petits extraits de code qui seront réutilisés à
divers endroits du programme.
Décompilateurs et désasembleur: le langage source des
désasembleurs est de plus bas niveau que le langage objet. En
général, ces outils servent à regénérer un prog source à partir
d’un prog objet. Ils sont utilisés par exemple pour l’étude
des virus dans la recherche de leur signature et leurs
mécanismes d’activation
9 17/05/2024
Compilateurs & interpréteurs
Langage Cible O
Langage Source S Traducteur
ou objet
Langage hôte ou
d’implémentation
T-diagramme pour un traducteur
10 17/05/2024
Compilateurs & interpréteurs
On caractérise un traducteur par 3 langages:
1. Le langage source S qu’il traduit
2. Le langage cible ou objet vers lequel produit le code
3. Le langage hôte dans lequel il se présente
On représente ces 3 langages dans un diagramme en T appelé T-
diagramme en raison de sa forme.
11 17/05/2024
Compilateurs & interpréteurs
Un T-diagramme est noté aussi par:
S traducteur O
I
T-diagramme pour un traducteur
12 17/05/2024
Compilateurs & interpréteurs
Exemple: La compilation C de test.c sur une machine SUN3
avec un processeur 68000 sera notée par le T-diagramme:
Test.c C CC code 68000 [Link]
code
68000
T-diagramme pour un traducteur
13 17/05/2024
Auto-amorçage ou Bootstrapping
Les compilateurs C sous linux sont écrit en C. ceci soulève 2
questions:
Comment fut compilé le 1er compilateur?
Comment coder un compilateur d’un langage donné dans
son propre langage?
14 17/05/2024
Auto-amorçage ou Bootstrapping
Le fait de coder un compilateur dans son propre langage est
connu sous le nom « bootstrapping » ou « auto-amorçage ».
Les techniques et idées sont connues depuis le milieu des
années 50.
Les avantages de l’auto-amorçage:
- Démonstration de force pour un nouveau langage qui
constitue son utilisation pour générer son propre
compilateur
- La portabilité entre différents environnements: le même
programme se compile correctement et fait la même chose
sur différents types de machines
15 17/05/2024
Auto-amorçage ou Bootstrapping
Exemple de Pascal: Prenons l’exemple du 1er compilateur Pascal
(1962) sur une machine CDC (Control data) par WIRTH,
créateur du langage. il a commencé par écrire un compilateur
d’un sous ensemble de Pascal que nous appellerons ici Pascal 1 en
code CDC produisant du code CDC.
Question: Ecrire le T-diagramme associé.
Pascal1 compilateur PAS1 code CDC
code
CDC
16 17/05/2024
Auto-amorçage ou Bootstrapping
Il développa, ensuite, plus facilement un compilateur en
langage Pascal1, qui en plus de ce qu’il faisait son 1er
compilateur PAS1, incluait des fonctionnalités absentes du
Pascal1.
La compilation de ce nouveau programme par son 1er
compilateur PAS1 donna un nouveau compilateur plus
performant en respectant l’équation:
LSM + SNP = LPM (à detailler)
17 17/05/2024
Détail de l’exemple
Ecriture d’un programme Pascal qui faisait la même chose
que son premier compilateur. De plus, il inclua dans son
programme des fonctionnalités absentes de Pascal-1. La
compilation de ce programme par son premier compilateur
donna un nouveau compilateur plus performant
18 17/05/2024
Détail de l’exemple:
Donner la chaîne notée par l'imbrication des T-diagrammes.
19 17/05/2024
Compilateurs croisés: cross-compiler
Lorsque WIRTH voulu porter son compilateur sur une
machine ICL, il a réécrit sur une machine CDC un
Compilateurs
compilateur en Pascal générant du code [Link] travail
n’était pas très difficile puisqu’il l’avait fait pour les machines
CDC. En le compilant avec le compilateur Pascal du CDC, il
a construit un compilateur croisé ou (cross-compiler)
Question: produire le compilateur croisé pour des machines
ICL
Faites une dernière compilation qui produit un compilateur
fonctionnant sur des machine ICL et produisant du code ICL
20 17/05/2024
Compilateurs croisés: cross-compiler
Question 1: produire le compilateur croisé pour des machines ICL
21 17/05/2024
Compilateurs croisés: cross-compiler
Faites une dernière compilation qui produit un compilateur
fonctionnant sur des machine ICL et produisant du code ICL
22 17/05/2024
Structure d’un compilateur
La structure général d’un compilateur se compose de:
Analyse lexicale
Analyse syntaxique
Analyse sémantique
Génération du code intermédiaire (pseudo code)
Génération du code final
23 17/05/2024
Structure d’un compilateur
Un compilteur est un prog complexe divisé en phases. On
peut imaginer que chaque phase communique avec les phases
précédentes et suivantes d’une façon appropriée.
On peut mettre en évidence les phases suivantes:
La phase frontale ou « analyse ». Elle comprend:
- Analyse lexicale (ou linéaire): son rôle est de reconnaitre dans
le flux de caractères formant le programme source, les mots
élémentaires du langage appelés unité lexicales ou tokens tels
que les identificateurs, les mots clés, les opérateurs,…Les
mots reconnu sont présentés à la phase suivante.
24 17/05/2024
Structure d’un compilateur
- Analyse syntaxique ou hiérarchique ou grammaticale: son rôle
est de reconnaitre le flux de tokens fourni par l’analyseur
lexical et le regrouper en une collection imbriquée ayant une
signification collective. C’est une phase qui vérifie la syntaxe
du langage et elle fournit en résultat une représentation en
arbre de vérification ou arbre de syntaxe qui sera utilisé par
les phases suivantes.
25 17/05/2024