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 faut générer 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 dé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éré)
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 stocké en mémoire
●Pour cela, on détermine 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 dernière 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 l'interface ou les textes ? Ou savez-vous comment améliorer l'interface utilisateur de StudyLib ? N'hésitez pas à envoyer vos suggestions. C'est très important pour nous!