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:
  1. l'argument de return est un appel à une autre fonction;
  2. 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 ?