Compilation
Génération de code
Génération de code
La partie la plus difficile de la compilation
À partir du code intermédiaire, il fautrer de
l'assembleur:
choisir les instructions
choisir où stocker les variables (registre ou mémoire)
Choix d'instructions
On choisit les instructions assembleurs utilisées, mais en
laissant les noms de variables comme paramètres.
Version simple:
pour chaque instruction ou nœud d'expression, on choisit
l'instruction ou les instructions les plus rapides qui réalisent
le calcul demandé (c'est là qu'on choisit entre calage de bits
et division par deux)
si ce choix dépend des valeurs, on peut essayer de voir si on a
un indice sur les valeurs prises par les variables (indice de
tableau, cas d'un switch, type énumé)
Choix d'instructions
En pratique, une instruction d'assembleur effectue
plusieurs nœuds à la fois:
leal 3(%eax,%ebx,4),%ecx: %ecx = %eax+4*%ebx+3
On cherche un recouvrement de poids minimum des
arbres des expresions et des instructions du langage
intermédiaire
Comme ce problème est NP-complet, on doit choisir une
heuristique, par exemple gloutonne.
Attribution des registres
Cette étape choisit quelles variables on va stocker dans
un registre. Le reste sera stoc en mémoire
Pour cela, ontermine la zone de vie des variables
(rien à voir avec le scope), c'est-à-dire la portion de code
pendant laquelle la variable doit être mémorisée
La zone commence à l'affectation de la variable, et
termine à sa dernre utilisation
1 / 9 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !