Aujourd'hui, Allocation de registres est un sujet qui suscite un grand intérêt et un grand débat dans la société. De nombreuses personnes se sont engagées à rechercher Allocation de registres pour mieux comprendre son importance dans nos vies. Dans cet article, nous explorerons différents aspects liés à Allocation de registres, de ses origines à son impact aujourd'hui. Nous discuterons également de diverses perspectives et opinions sur Allocation de registres, dans le but de fournir une vue complète et équilibrée. Quelle que soit la position adoptée sur cette question, il est indéniable que Allocation de registres joue un rôle crucial dans notre société et mérite une réflexion sérieuse et attentive.
Dans un compilateur, l'allocation de registres est une étape importante de la génération de code. Elle vise à choisir judicieusement dans quel registre du processeur seront enregistrées les variables durant l'exécution du programme que l'on compile.
Les registres sont des mémoires internes au processeur, généralement capables de contenir un mot machine. Les opérations sur des valeurs rangées dans des registres sont plus rapides que celles sur des valeurs en mémoire vive, quand ce ne sont pas les seules possibles. Mais un processeur compte rarement plus de quelques dizaines de registres, bien trop peu pour toutes les variables d'un programme. Il est donc crucial de choisir avec pertinence les variables qui doivent résider dans les registres à chaque étape de l'exécution. Cela étant difficile dans les premières étapes de la compilation, on commence par faire comme si l'on disposait d'un nombre illimité de registres, puis l'on attribue à ces registres virtuels des registres réels ou des emplacements en mémoire.
L'une des méthodes classiques d'allocation de registres consiste à ramener le problème à la coloration du graphe d'interférence des variables. Les sommets de ce graphe sont les variables du programme, et deux sommets sont reliés par une arête si les variables correspondantes interfèrent.
On dit que deux variables interfèrent lorsque l'une est définie pendant que l'autre est active (c'est-à-dire susceptible d'être utilisée dans la suite de l'exécution). Deux variables qui interfèrent ne peuvent pas être placées dans le même registre — à une nuance technique près : sur certains processeurs, les registres ne sont pas équivalents. On étend donc aux registres la relation d'interférence, en convenant qu'ils interfèrent tous entre eux, et qu'une variable interfère avec les registres qui lui sont interdits. Ainsi, on ne peut colorer avec le même registre deux variables qui sont voisines dans le graphe d'interférence. Attribuer registres aux variables équivaut à colorer avec couleurs le graphe d'interférences.
Le problème de la -coloration est NP-complet (pour ) et pour un graphe quelconque. Comme pour n'importe quel graphe il est possible de créer un programme dont le graphe d'interférences est , le problème d'allocation de registres est aussi NP-complet. Aussi on utilise en général une heuristique qui fournit de bons résultats pratiques. Elle consiste à supprimer du graphe les sommets faciles à colorer : on cherche dans le graphe un sommet de degré strictement inférieur à . On est certain de pouvoir colorer ce sommet puisque ses voisins utiliseront au plus couleurs. Ainsi on le supprime du graphe et on le garde de côté. Si on arrive à colorer récursivement le graphe simplifié, alors on pourra le réinsérer et le colorer.
Si tous les sommets ont au moins pour degré , plusieurs stratégies sont possibles :