Traduction des langages

Transcription

Traduction des langages
Traduction
des langages
Eduardo Sanchez
Ecole Polytechnique Fédérale de Lausanne
La traduction d’un langage
♦ La conversion d’un programme d’un langage vers un autre
s’appelle une traduction
♦ Le programme dans sa forme originale est le programme
source. La version traduite est le programme objet
♦ Le processus de traduction se décompose en trois phases:
• analyse lexicale
• parsing
• génération de code
programme
programme
source
source
Page 2
analyseur
analyseur
lexical
lexical
parser
parser
générateur
générateur
de
de code
code
Eduardo Sanchez
Ecole Polytechnique Fédérale de Lausanne
programme
programme
objet
objet
♦ L’analyseur lexical doit reconnaître dans le programme source
les chaînes de symboles qui forment une entité
♦ Une fois l’entité identifiée, elle est classée selon son type
(valeur numérique, mot, opérateur arithmétique, etc)
♦ L’unité est représentée ensuite par un motif de bits appelé
token, transférée au parser
♦ Le parser voit donc le programme comme une suite d’unités
lexicales (tokens) plus que comme une suite de symboles. Et le
parser groupe ces unités en phrases
♦ La fonction du parser est d’identifier la structure grammaticale
du programme et de reconnaître le rôle de chaque composant
Page 3
Eduardo Sanchez
Ecole Polytechnique Fédérale de Lausanne
♦ Dans les langages modernes, à format libre, la structure du
programme doit être identifiée indépendamment de
l’espacement utilisé dans le programme source
♦ Pour cela, les langages utilisent des symboles de ponctuation
pour marquer la fin d’une phrase et des mots clés (if, while,
etc) pour marquer le début d’une phrase. Les mots clés sont
des mots réservés, que l’on ne peut pas utiliser à d’autres
fins dans le programme
♦ Le processus de parsing se base dans un ensemble de règles
de syntaxe, qui définissent la syntaxe du langage de
programmation
Page 4
Eduardo Sanchez
Ecole Polytechnique Fédérale de Lausanne
♦ Les règles de syntaxe peuvent être exprimées sous la forme
de diagrammes syntaxiques
♦ Exemple: diagramme syntaxique de la phrase if-then-else
if
if
expression
expression
booléenne
booléenne
then
then
phrase
phrase
else
else
phrase
phrase
♦ Dans ces diagrammes, les termes utilisés tels quels dans le
langage apparaissent à l’intérieur des ovales, tandis que les
termes qui demandent une description additionnelle
apparaissent à l’intérieur des rectangles
♦ Les premiers termes sont appelés terminaux; les seconds
sont appelés non terminaux
Page 5
Eduardo Sanchez
Ecole Polytechnique Fédérale de Lausanne
♦ Exemple:
+
+
phrase
phrase
expression
terme
terme
--
+
+
terme
terme
terme
facteur
facteur
facteur
xx
aa
bb
cc
Page 6
Eduardo Sanchez
Ecole Polytechnique Fédérale de Lausanne
♦ L’analyse qui montre si une certaine chaîne respecte un
ensemble de diagrammes syntaxiques peut se représenter
sous la forme d’un arbre de parsing
♦ Exemple: déterminer si la chaîne
a+bxc
respecte les diagrammes syntaxiques précédents
Page 7
Eduardo Sanchez
Ecole Polytechnique Fédérale de Lausanne
expression
expression
terme
terme
+
facteur
facteur
a
expression
expression
terme
terme
facteur
facteur
x
b
terme
terme
facteur
facteur
c
Page 8
Eduardo Sanchez
Ecole Polytechnique Fédérale de Lausanne
♦ Faire le parsing d’un programme revient à faire l’arbre de
parse du programme source
♦ Les règles syntaxiques d’un langage ne peuvent pas
permettre plus d’un arbre de parse pour la même chaîne:
cela pourrait conduire à des ambiguïtés dans le programme
♦ Exemple: faire l’arbre de parse pour la phrase
if B1 then if B2 then S1 else S2
d’après le diagramme syntaxique donné précédemment pour
la phrase if-then-else
Page 9
Eduardo Sanchez
Ecole Polytechnique Fédérale de Lausanne
phrase
phrase
if
expression
expression
booléenne
booléenne
then
phrase
phrase
else
B1
S2
if
expression
expression
booléenne
booléenne
then
B2
Page 10
phrase
phrase
Eduardo Sanchez
Ecole Polytechnique Fédérale de Lausanne
phrase
phrase
S1
phrase
phrase
if
expression
expression
booléenne
booléenne
then
phrase
phrase
B1
if
expression
expression
booléenne
booléenne
then
B2
Page 11
Eduardo Sanchez
Ecole Polytechnique Fédérale de Lausanne
phrase
phrase
S1
else
phrase
phrase
S2
♦ Les deux solutions sont différentes. Les deux interprétations
pourraient être distinguées sans ambiguïté grâce à
l’utilisation des parenthèses:
• if B1
then (if B2 then S1)
else S2
• if B1
then (if B2 then S1
else S2)
Page 12
Eduardo Sanchez
Ecole Polytechnique Fédérale de Lausanne
♦ La phase finale de la traduction est la génération du code objet
♦ Une partie importante de la génération du code est son
optimisation
♦ Exemple: la traduction ligne à ligne du code
x = y + z;
w = x + z;
conduirait à un code non optimal. En effet, le générateur de
code doit voir que, après l’exécution de la première phrase, les
valeurs de x et z se trouvent déjà dans les registres du
processeur
Page 13
Eduardo Sanchez
Ecole Polytechnique Fédérale de Lausanne
Linking et loading
♦ Le programme objet généré par la traduction, bien qu’en
langage machine, peut rarement être exécuté directement
par le processeur
♦ L’une des raisons de cette impossibilité est l’utilisation des
modules traduits séparément
♦ En plus, le programme fait souvent des demandes au
système d’exploitation
♦ Un programme objet est donc un programme en langage
machine contenant des bouts de programme qui doivent être
liés entre eux et à d’autres programmes objets pour obtenir
un programme exécutable
♦ Ces connexions sont faites par un programme appelé linker
Page 14
Eduardo Sanchez
Ecole Polytechnique Fédérale de Lausanne
♦ Le programme exécutable, généré par le linker, est souvent
appelé un module de chargement. Les modules de
chargement sont stockés sous forme de fichiers dans la
mémoire de masse du système
♦ Finalement, pour exécuter le programme, le module de
chargement doit être placé dans la mémoire. Cette fonction
est l’oeuvre d’un programme appelé loader, qui fait partie du
système d’exploitation
programme
source
Page 15
traduction
traduction
programme
objet
link
link
module
de charge
Eduardo Sanchez
Ecole Polytechnique Fédérale de Lausanne
load
load
programme
exécutable