Eduardo Sanchez
Ecole Polytechnique Fédérale de Lausanne
Traduction des langages
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 analyseuranalyseur parser générateurgénérateur programmeprogramme
♦ 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 auparser
♦ Le
parser
voit donc le programme comme une suite d’unitéslexicales (
tokens
) plus que comme une suite de symboles. Et leparser
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♦ 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 deprogrammation
♦ Les règles de syntaxe peuvent être exprimées sous la forme de diagrammes syntaxiques
♦ Exemple: diagramme syntaxique de la phrase if-then-else
♦ 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
ifif expression thenthen elseelse
booléenne expression
booléenne phrasephrase phrasephrase
♦ Exemple:
--
terme terme
phrase phrase
++
xx
facteur facteur
terme terme
++
bb aa expression
terme
facteur
♦ 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
expression expression
expression expression
terme terme
facteur
facteur termeterme
facteur facteur terme
terme
facteur facteur
a
+
b
x
♦ Faire le
parsing
d’un programme revient à faire l’arbre deparse
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 S2d’après le diagramme syntaxique donné précédemment pour la phrase if-then-else
phrase phrase
phrase phrase expression
booléenne expression booléenne
B1
if then else phrasephrase
S2 phrase phrase expression
booléenne expression
booléenne then if
B2 S1
phrase phrase
phrase phrase expression
booléenne expression booléenne
B1 if then
phrase phrase else
S2 phrase
phrase expression
booléenne expression
booléenne then if
B2 S1
♦ 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)
♦ 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
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
♦ Le programme exécutable, généré par le
linker
, est souvent appelé un module de chargement. Les modules dechargement 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
traduction
traduction linklink loadload
programme
source programme
objet module
de charge programme
exécutable