Traduction
Licence Informatique 3ème année --- TD 9
Dans ce TD on va voir quelques exemples d'optimisations de code
possibles à la compilation.
Exercice n°1 :
Proposer différentes solutions en p-code pour traduire
l'instruction
switch suivante:
switch(a){
case 1: ...
case 2: ...
case 3: ...
case 4: ...
default:
}
Selon vous, comment choisir l'une ou l'autre de ces solutions ?
En supposant qu'il existe une instruction JUMP qui admet une
adresse de branchement dynamique, proposer une optimisation adaptée.
Exercice n°2 :
Traduire le code suivant en p-code:
for(i=0; i<2; i++){
t[i] = get();
}
On suppose que i t et get sont définis précédemment.
Écrire maintenant le code obtenu en déroulant la boucle.
Dans quels cas une telle optimisation est-elle intéressante ?
Exercice n°3 :
Comment tirer parti des situations suivantes lorsqu'on génère le
p-code d'une fonction:
-
l'argument de return est un appel à une autre fonction;
-
l'unique instruction dans la fonction est un return.
Exercice n°4 :
On suppose qu'un compilateur fait préceder la génération du code d'une
fonction d'un saut vers l'instruction qui suit la définition de cette
fonction (afin que le code de la fonction ne soit pas exécuté avant
qu'elle ne soit appelée). Quelle optimisation générale du code
permet de gérer de façon satisfaisante la déclaration consécutive de plusieurs
fonctions ? Cette optimisation est-elle restreinte au cas particulier des
déclarations de fonctions ou est-elle plus générale ?