Compilation 4 PDF
Compilation 4 PDF
Compilation 4 PDF
E → id E.code= id.nom
a 1 e1 bgt g 2 e1 ble
c 0 =; f 5 e2 bgt
e2 br ac4*2b*-=;
e1 : b 0 = ; e3 br
e2 : e2 : a b c 6 * + = ;
e3 br
e1 : a 0 = ;
e3:
s=0; s 0=;
for (i = 0 ; i<7 ; i++) i 0=;
if ( i % 2 == 0) e1 : i 7 e2 blt
s=s+i; e4 br
ce bout de code peut être écrit de la e2: i % 2 e3 bz
façon suivante : e5 br
s=0; e3: s s i + = ;
i = 0; e5: i i 1 + = ;
A : if (i = 0 ; i<7 ; i++) { e1 br
if ( i % 2 == 0) e4 :
s=s+i;
i = i+1;
Prof. M. BENADDY goto A; Compilation 5
}
Arbres abstraits
Une structure de l’arbre abstrait peut être considérée comme une
des formes intermédiaire, l’arbre syntaxique résultant de l’analyse
syntaxique dans le cas où une chaîne à analyser est dépourvue
d’erreur syntaxique.
Les nœuds de l’arbre sont constitués des symboles non-terminaux
de la grammaire qui accepte la chaîne d’entrée dans le code
intermédiaire, ces symboles ne présentent aucune nécessité. Il
serait plus commode de les éliminer. On obtient alors une
structure beaucoup plus économique appelée arbre abstrait.
Arbre syntaxique Arbre abstrait
w : a +b * c E +
/ | \ / \
E + E a *
| / | \ / \
a E * E b c
| |
Prof. M. BENADDY
bCompilation
c 6
Code à trois adresses
Le code à trois adresses est un code qui se rapproche du code
d’assembleur il est composé d’instruction qui contient en général 3
adresses, 2 pour les opérandes et un pour le résultat et un opérateur. Le
code est une séquence d’instruction de la forme x :=y op z où x, y, z
sont des variables ou des constantes.
Exemple : L’expression x+y*z peut être traduite par la séquence
suivante :
t1 = y*z
t2 = x + t1
t1 et t2 sont des variables temporaires introduites par le compilateur.
Une instruction à trois adresses est une forme abstraite du code
intermédiaire. Dans un compilateur les instructions peuvent être
implantées par des structures dont les champs contiennent les
opérateurs et les opérandes. On distingue trois types du code à trois
adresses ; les quadruplets, les triplets et les triplets indirectes.
Exemple : a = b * -c + d * -c
● Les contenus des champs arg1, arg2 et resultat sont des pointeurs vers les
entrées de la table des symboles des noms représentés par ses champs. Les
variables temporaires doivent être rangées dans la table des symboles
lorsqu'ils sont crées.
4 + 3 1
5 = a 4
Les sous expressions 4*i et 4*j sont communes aux affectations t7 et t10.
Elles étaient éliminées en utilisant t6 à la place de t7 et t8 à la place de
t10.
Prof. M. BENADDY Compilation 16
Elimination du code inutile
Un code est invariant à l’intérieur d’une boucle lorsque pour toutes les
itérations de la boucle son calcul ne varie pas.
Dans l’exemple ci-dessous, les valeurs répétitives de a et de b sont des
constantes, on peut donc déduire que le calcul des instructions x1=a-9 et
x5=b-12, ne changent pas lors des différentes itérations de la boucle.
Pour éviter de calculer à chaque itération de la boucle, et pour gagner le
temps d’exécution, il convient de déplacer ces instructions de l’itération,
créer un autre bloc former de ces deux instructions et le placer avant le
bloc de la boucle.
Exemple :
1 s=0 ; 1 s=0 ;
2 i=1 ; 2 i=1 ;
3 if (i<=n) goto 5 3 x2 = a -9;
4 goto 17 4 x5=b-12;
5 x1 = i*3; Optimisation 5 if (i<=n) goto 7
6 x2 = a -9; =========> 6 goto 17
7 x3=x10[x1]; 7 x1 = i*3;
8 x4=i*3; 8 x3=x10[x1];
9 x5=b-12; 9 x4=i*3;
10 x6=x11[x4]; 10 x6=x11[x4];
11 x7=x3*x6; 11 x7=x3*x6;
12 x8=s+x7; 12 x8=s+x7;
13 s=x8; 13 s=x8;
14 x9=i+1; 14 x9=i+1;
15 i=x6; 15 i=x6;
16 goto 3 16 goto 5
17 17
MOV R1, R2 ;
MOV A, R2 ; si A n’est pas un registre l’instruction occupera 2 mots contiguës 1
pour l’opération et 1 pour la valeur de A
MOV A, B ; où A et B ne sont pas des registres, cette instruction occupe 3 mots
contiguës 1 pour l’opération et les autres pour B et A
L’exécution d’une instruction se fait en deux étapes : le fetch et l’exécution
Le fetch consiste à charger l’instruction dans le registre d’instruction et de
l’interpréter. La 2ème étape consiste à l’exécution proprement dite. La première
étape est généralement plus lente que la deuxième si notre intérêt porte sur la
réduction du temps d’exécution il est recommandé de minimiser le nombre de
fetch, c-à-d le nombre de mots dans chaque instruction pour répondre à cet objectif.
Le processus de génération du code objet fera en sorte de produire des instructions
occupont le moins de mots et ceci en affectant le maximum de registres aux
instructions.
On définit le coût d’exécution d’un mot par 1, par conséquent le coût d’exécution
d’une instruction est la somme des coûts d’exécution des mots qu’ils l’occupent.
Exemple : B+C