Sie sind auf Seite 1von 5

Tcnicas de asignacin de

registros en un compilador
Primera Parte
Esteban Meneses y Francisco Torres

emeneses@artinsoft.com
torres@ic-itcr.ac.cr

Se presenta la descripcin del teorema de los cuatro colores, cuestionante que gener muchas
discusiones en matemticas y que impuls algunas tcnicas de coloreo de mapas. Adems, se
hace un recorrido por el algoritmo de Gregory Chaitin para la asignacin de registros por
medio del coloreo de grafos. Esta tcnica resulta bastante sencilla y muy poderosa a la vez,
pues logra integrar la asignacin de registros y el vaciado de los mismos en un solo proceso.
Palabras clave: compiladores, optimizacin, asignacin de registros, vaciado de registros,
coloreo de grafos, grafos de interferencia.

ara representar los problemas y las soluciones a los mismos, los programadores utilizan los lenguajes de programacin. Una herramienta indispensable, sin lugar a dudas. Sin embargo, para poder aprovechar el poder de
los lenguajes, se necesita un chasis que soporte la velocidad de los mismos.
Esta estructura, que subyace en cualquier lenguaje, la conforman los compiladores y los
intrpretes.
Cualquiera de estos dos programas tiene una funcin bien definida: traducir un
cdigo de un lenguaje a otro. La mayor parte de los casos, la compilacin traduce un
lenguaje de alto nivel (el fuente o front-end) a otro de un nivel menor (el destino o backend, que probablemente es el lenguaje de una mquina, virtual o fsica). El compilador
es entonces, un fantasma necesario en la mansin de los lenguajes. Pero el diseo de este
actor silencioso requiere mucho trabajo. De hecho, especificar y desarrollar un lenguaje
es en realidad construir todo un motor de compilacin mediante el cual este lenguaje
tendr utilidad en alguna mquina [1].
Paralelo al concepto de utilidad est presente otro de igual importancia: eficiencia.
En su manera ms sencilla, la eficiencia es la mejora del tiempo de un trabajo sin que
empeore su calidad. El cdigo generado por un compilador debe ser eficiente, para que
los usuarios del sistema sean igualmente eficientes. Una manera de incrementar la
eficiencia del cdigo generado es mejorando muchos de los procesos que estn insertos
dentro de todo el programa. Estas mejoras se llaman optimizaciones (aunque el trmino
sea discutible).
Existe una gran cantidad de tales optimizaciones [6], entre ellas: eliminacin de
operaciones innecesarias (como eliminacin de sub-expresiones comunes, identificacin
de cdigo inalcanzable, optimizacin de saltos), determinacin de operaciones costosas
(uso de instrucciones menos costosas, operacin y propagacin de constantes, sustitucin
de cdigo), calendarizacin de instrucciones (que es un problema NP-completo [2]),
1
asignacin y vaciado de registros .
La asignacin de registros juega un papel preponderante en toda la familia de
mejoras al cdigo generado por un compilador.

Qu relacin
hay entre un
mapa de
Inglaterra que
deba ser
coloreado en
1852 y tcnicas
modernas de
asignacin de
registros en un
compilador?

Abril 2001

Los trminos en ingls para estos procesos son register allocation y register spilling, respectivamente.

La traduccin que hace un compilador


suele no llevarse a cabo en un solo
paso. De esta forma, el cdigo fuente es
traducido a una representacin intermedia (IR), parecida a los byte-code de
Java o a los P-code de Visual Basic. En
este pseudo-lenguaje se puede suponer
que hay un nmero infinito de registros. As pues, en pasos siguientes el
compilador toma ese cdigo en IR y lo
traduce a un lenguaje que corresponda
con alguna arquitectura particular, con
un nmero finito de registros. Y aqu
est el dilema, finito o no finito. El
cambio en la cardinalidad del conjunto
de registros de los lenguajes destino e
intermedio es lo que da vida al
problema del cual se va a tratar en este
artculo: asignacin y vaciado de
registros.
Ahora, por qu preocuparse tanto
por el buen uso de los registros? acaso
en las mquinas de hoy no existe
suficiente memoria? La respuesta a
estas preguntas est en las dos caractersticas del conjunto de registros. Este
conjunto, primero que todo, es pequeo
(no se tiene infinita cantidad de los
mismos) y adems los registros son
rpidos, ms que la memoria. De
manera que los registros son uno de los
recursos crticos de las arquitecturas
computacionales.
Mientras desarrollaba el primer
compilador de FORTRAN, John Backus sugiri una idea, que al traducirla
al diseo de ahora, pudiera decirse as:
Durante la optimizacin, imagine que
tiene un conjunto infinito de registros;
trate la asignacin de registros como
un problema separado [4]. Sin
embargo, como toda arquitectura tiene
un nmero determinado de registros,
entonces se debe usar la asignacin de
registros. Esta actividad, puede ser
desarrollada en varios niveles: sobre
expresiones, en bloques bsicos completos (secuencias de instrucciones
donde no existen ni etiquetas ni saltos a
otras posiciones), sobre rutinas enteras
o entre una coleccin de rutinas.
Cuando se habla de la asignacin de
registros, se est tratando con los
rangos de vida. Por ejemplo, en la
expresin X=Y+1, tenemos una defini10

cin de X y un uso de Y. Un rango de


vida de una variable empieza cuando
sta es definida y recorre todos los usos
de la misma hasta el ltimo de ellos.
Desafortunadamente, la asignacin
de registros es difcil. Los detalles
idiosincrticos de la mquina complican an los asignadores ms simples.
Empero, se han dado muchas estrategias para resolver el problema. Una
de ellas es el coloreo de grafos, que
ofrece una abstraccin bastante simple.
Construyendo un grafo, que representa
la interferencia entre los rangos de vida
de las variables, se puede establecer un
algoritmo para el mapeo de registros.
El coloreo de grafos ha tenido una
buena aceptacin entre los implementadores de compiladores. Pero tambin
otros autores[8] piensan que esta tcnica es un poco ambiciosa, en el sentido
de que trata de resolver un problema
que no es indispensable para el compilador (es decir, es una optimizacin
ms).
El creador de la estrategia de
coloreo de grafos para resolver el
problema de la asignacin de registros
es Gregory Chaitin, quien fund toda
una escuela de seguidores que fueron
mejorando su propuesta y que generaron todo un abanico de posibilidades
para este problema. La tcnica de
Chaitin se basa en el coloreo de grafos
que pudo estar vinculado con la
resolucin de un problema matemtico
muy importante que fue resuelto por
esas fechas [3][7].
En el resto del artculo, se supondr
que el asignador trabaja en un cdigo
intermedio de bajo nivel, parecido a un
ensamblador. Antes del asignador, el
cdigo intermedio puede referenciar un
nmero ilimitado de registros (registros
virtuales o simblicos), que en adelante
se llamarn simplemente variables. El
objetivo de la asignacin es reescribir
el cdigo intermedio, de manera que se
usen slo los registros que estn
disponibles en la mquina de destino
(los registros reales, fsicos o de la
mquina).
En las siguientes pginas se har una
emocionante ciruga al fantasma de los
compiladores. No hay por qu temer, la

operacin est llena de acotaciones


sencillas pero bastante ingeniosas.

El problema de los cuatro


colores
Uno de los antecedentes que pudo
tener la propuesta de Gregory Chaitin
es la resolucin de uno de los problemas matemticos ms famosos. Existen
muchos de estos problemas que toman
aos en ser resueltos. Quizs el ms
popular de ellos es el ltimo Teorema
de Fermat, probado hace algunos aos
por el matemtico ingls Andrew J.
Wiles de la Universidad de Princeton.
Otro problema, no tan famoso es el de
los cuatro colores.
Planteado hace aproximadamente
125 aos, el problema de los cuatro
colores despert curiosidad en casi
todos los matemticos, haciendo que se
le dedicarn tesis y meses completos de
trabajos para tratar de resolverlo. El
enunciado [3], muy simple por cierto,
estipula lo siguiente:
Cuatro colores son suficientes para
colorear un mapa dibujado en un
plano o una esfera, de manera que no
existan dos regiones que sean vecinas
(comparten una frontera) y que estn
pintadas del mismo color.
La historia de este problema incluye
a muchos grandes matemticos, de la
altura de Augustus DeMorgan (el de
las leyecitas), Sir William Rowan
Hamilton, Arthur Cayley y August
Ferdinand Mbius. Todo empez
cuando con un hombre llamado Francis
Guthrie, hizo el descubrimiento mientras coloreaba regiones en un mapa de
Inglaterra, alrededor de Octubre de
1852. Tiempo despus se lo coment a
su hermano Frederick y ste le dijo a su
profesor de matemticas, DeMorgan.
Este ltimo contact a Hamilton y de
all en adelante la fama se extendi por
todo el mundo matemtico. DeMorgan
supona (erradamente) que bastaba
demostrar, para probar la conjetura de
los cuatro colores, que no se poda
construir un mapa en donde se tengan
cinco pases, tales que cada uno com-

Tiempo Compartido

parta una frontera con los otros cuatro.


Pero an probando esto, no queda claro
si de all se puede seguir la demostracin de la conjetura de los cuatro
colores. Por cierto, Mbius se diverta
asignndole este problema a sus alumnos, sabiendo que no era posible construir un mapa con esas caractersticas.
Los primeros intentos no esperaron
mucho y la primera prueba fue
publicada por un joven matemtico,
llamado A.B. Kempe. La prueba de
este seor estuvo en boga por 11 aos,
hasta que otro matemtico, Heawood,
descubri un error en ella. Aunque
Kempe era un matemtico amateur, su
solucin no es amateur, pues l introdujo tcnicas que todava se utilizan en
la actualidad para el coloreo de mapas.
Por otro lado, el mismo Heawood
modific la pseudoprueba de Kempe
para demostrar que cinco colores son
suficientes para colorear un mapa.
Para no aburrir a nadie, en el
verano de 1976, Kenneth Appel y
Wolfgang Haken de la Universidad de
Illinois anunciaron que haban resuelto
el problema de los cuatro colores. Las
sofisticadas tcnicas que usaron Appel
y Haken parecen haber tenido xito en
la prueba del problema de los cuatro
colores. Sin embargo, su prueba caus
toda una ola de polmica, dado que su
prueba incluye un anlisis facilitado
por computadora de 1936 casos especiales y esta parte requiri varios aos
de revisin.[3] Adems de aclarar el
panorama, con la generacin de ejemplos y ciertos datos estadsticos, las
computadoras pueden hacer un trabajo
realmente brutal, como el que hizo la
mquina usada por Appel y Haken, la
que tuvo que realizar, entre otras cosas,
1010 operaciones separadas en sus
circuitos de alta velocidad y ms de
1200 horas de clculos.
Algo importante de mencionar es que
todas las tcnicas que se utilizan para
colorear mapas se pueden adaptar para
colorear grafos planos y estas ltimas
tcnicas sirven de base para generar
algoritmos de coloreo para grafos ms
generales. Si el lector quiere profundizar en este tema, puede consultar [7].

Abril 2001

Cabe resaltar que el problema de


colorear un grafo (as como el de
asignacin de registros) tambin es NPcompleto, o sea, no se conoce un algoritmo que en tiempo polinomial pueda
resolver el problema de forma ptima.
Sin embargo existen varias tcnicas
heursticas que pueden dar una solucin aceptable para este desafo.
Para los lectores incrdulos, se presentar a continuacin el 4-coloracin
(o sea, con 4 colores) de una seccin de
Europa. Ntense dos cosas. Primero, no
existen pases vecinos que tengan el
mismo color. Segundo, el mar o todo
lo que rodea los pases tambin debe
tener un color asignado (gris claro).
Aquellos que quieran impresionar a sus
amigos tal vez pueden presentarles una
4-coloracin del mapa de los cantones
de nuestro pas.

por medio del coloreo de grafos. Tienen relacin esos dos temas? Claro que
s, y ah reside precisamente la belleza
de esta propuesta. En general, la idea
es colorear un grafo de dependencias de
los rangos de vida de las variables que
aparecen en la representacin intermedia (IR). Los rangos de vida se refieren
a los lapsos en que est viva una
variable. Por ejemplo, en un programa
en IR, la variable X (que en este caso
sera un registro simblico) se define
en la quinta instruccin: X=6+Y. Luego,
la variable X es usada varias veces,
hasta que en la vigsima instruccin se
utiliza por ltima vez: Z=X2. Entonces
todo ese lapso de la quinta a la
vigsima instruccin es el rango de
vida de X, porque X en ese lapso tiene
sentido para el programa, est viva!
Despus del ltimo uso de X, sta
pierde la importancia y por ende
no tiene caso considerarla ms. Ahora,
si dos variables interfieren, es decir
hay una instruccin donde ambas
estn vivas, no pueden ser asignadas
al mismo registro
real porque esto claramente entorpecera la corrida del
Figura 1: 4-coloracin de una seccin de Europa
programa.
Entonces, el primer paso que se debe seguir en el
procesamiento de un programa escrito
La propuesta de Chaitin
en IR, debe ser el de usar las bien
Las ideas de Gregory Chaitin forman la conocidas tcnicas de anlisis de flujo
columna vertebral de muchas investi- de datos [5]. Este anlisis consiste en
gaciones que se han hecho al respecto saber cuando empieza y cuando terde la asignacin de registros. La gran mina cada uno de los rangos de vida de
virtud de su propuesta es que logra variables en IR.
El paso que sigue es la construccin
integrar el problema de la asignacin y
del
grafo de interferencia G. Los nodos
el vaciado de registros en un algoritmo
en
G
representan los rangos de vida de
sencillo.[4] Chaitin y su equipo desalas
variables
y los arcos representan
rrollaron el asignador como parte de un
interferencia.
As,
hay un arco en G del
compilador para PL8 en el laboratorio
nodo
i
al
nodo
j
si
y slo si los rangos
de investigacin de IBM en Yorktown
de
vida
que
representan
los nodos
Heights, NY. Presentaron sus ideas en
interfieren;
esto
es,
estn
vivos
en el
los inicios de los ochentas.
mismo
momento
y
por
ende
no
pueden
Como se adelant, el algoritmo de
Chaitin consiste en asignar registros ocupar el mismo registro fsico. Los
11

(a)

(b)

(c)

(d)

ria (por ello aparece coloreado con


rayas).

El asignador de Yorktown

Figura 2: Grafos de inferencia

rangos de vida que interfieren con un


rango de vida, se llaman los vecinos de
l; el nmero de vecinos de un nodo en
el grafo es llamado el grado de ese
nodo. Intuitivamente, se dice que dos
rangos de vida interfieren, si al ser
asignados esos dos rangos al mismo
registro fsico, el programa cambia de
sentido.
Entonces, tenemos hasta este
momento un nmero de rangos de vida
de variables (que no tiene cota) y un
nmero finito de registros de la
mquina (supngase que se tienen k).
Para encontrar una asignacin de
registros para el programa, el algoritmo
busca una k-coloracin del grafo de
interferencia. Como encontrar esta
coloracin es un problema NP-completo, el compilador utiliza una tcnica
heurstica para encontrar esa coloracin; no est garantizado que el
algoritmo encuentre una k-coloracin
para un grafo k-coloreable. Si no se
puede encontrar una k-coloracin, algunos rangos de vida son vctimas de
un vaciado, o sea, que se mantienen en
memoria en lugar de registros.
Y aqu est la analoga ms interesante. Asignar registros es: colorear
grafos. De esta forma habr tantos
nodos en el grafo como rangos de vida
en la rutina y tantos colores como registros fsicos de la mquina. Y colorear el grafo significa asignar registros
reales a variables.
A manera de ejemplo, supngase
que se analiz un programa y se
construy el grafo de interferencia, que
se observa en la figura 2(a). Resulta
que la arquitectura en la que se correr
12

ese programa tiene 3 registros reales.


De esta forma se debe colorear el grafo
con 3 colores (negro, blanco y gris; uno
por cada registro fsico). Se pintar el
grafo siguiendo de una manera
intuitiva el algoritmo de Chaitin. Primero que nada, se debe encontrar un
nodo con menos de 3 vecinos. Aparecen dos opciones: G y H. Se escoge uno
de ellos, G. Luego se introduce en una
pila y se elimina del grafo al nodo y a
todos los arcos incidentes en l. Seguidamente, se vuelve a buscar un nodo
con menos de 3 vecinos, solo hay una
opcin H. Se elimina de igual manera,
quedando la figura 2(b). Ahora, se
lleg a un punto donde todos los nodos
tienen al menos 3 vecinos. En este caso
se debe buscar uno de ellos para
guardarlo en memoria. Se escoge C
arbitrariamente y este nodo no se coloca en la pila. As se obtiene la figura
2(c). De all en adelante es sencillo
seguir seleccionando nodos y borrando
elementos del grafo. Supngase que el
resto de los nodos se elimin en el
siguiente orden D, A, B, E, F. Cuando
ya no hay ms nodos que eliminar del
grafo, se procede a colorear el grafo
original, sacando los nodos de la pila.
Se toma el primer nodo en la pila, F en
este caso, y se le asigna un color, por
ejemplo negro. Despus, se saca E y se
le asigna un color distinto al de sus
vecinos, que puede ser blanco. As se
prosigue sucesivamente hasta que el
grafo original queda totalmente coloreado, como en la figura 2(d). En ella
se puede notar que C no tiene ningn
color de los iniciales. Esto se debe a
que fue vctima de un vaciado a memo-

Ms formalmente, el asignador de
Yorktown (elaborado por Chaitin y
compaa, [4]) tiene varias fases, que
se pueden observar en la figura 3:
= Renumerar: encuentra todos los
rangos de vida en una rutina y les
asigna un nmero nico a cada uno.
= Construir: se construye el grafo de
interferencia.
2
= Fundir : el asignador remueve las
copias innecesarias, eliminando las
instrucciones de copia (estas instrucciones son las que tienen la forma x=y)
y combinando los rangos de vida del
fuente y del destino. Por ejemplo, supongamos que se tiene un rango de
vida de la variable x, luego el ltimo
uso de sta es una copia (y=x), de
manera que todas las apariciones de y
se pueden sustituir por x. Una copia
puede ser removida, si los rangos de
fuente y de destino no interfieren.
= Costo del spill: en la preparacin
para el coloreo, un costo de spill es
estimado para cada rango de vida.
= Simplificar: esta fase, junto con la
de seleccionar, ayuda a colorear el
grafo. La simplificacin examina repetidamente los nodos en el grafo G, removiendo aquellos nodos con grado
menor que k. Conforme cada nodo es
removido, sus arcos tambin se quitan
(decrementando el grado de sus vecinos) y es empujado en el tope de una
pila.
= Seleccionar: los colores son escogidos en el orden determinado por la
simplificacin. Por turnos, cada nodo
es sacado de la pila, reinsertado en el
grafo G, y se le da un color distinto al
de sus vecinos. El significado de la lnea punteada se discutir en la segunda
parte de esta entrega.
= Cdigo de spill: este cdigo es
insertado para cada rango de vida que
debe ser vctima de un spill.

La palabra original en ingls para este proceso es


register coalescing.

Tiempo Compartido

vaciado de registros. Sin embargo, descuida algunos aspectos tcnicos que pueden ocasionar perjuicios en el rendimiento. Algunas mejoras sobre
este algoritmo sern analizadas en la segunda parte de este
artculo. De manera que, el
lector no debe perderse la
Figura 3: Pasos del asignador de Yorktown
siguiente ciruga al compilador: un paciente ciertamente
El corazn del asignador de (porque ste elimina la mayor cantidad de difcil de dar de alta.
Yorktown es el algoritmo de coloreo. enlaces). Sin embargo existen varias
La tcnica heurstica desarrollada por frmulas para determinar la vctima. Una
Chaitin para el coloreo de grafos, tiene de ellas, tambin propuesta por Chaitin, Referencias
una eficiencia de O(n+e), donde n es el es vaciar el nodo que tenga la menor
[1] Aho, Alfred et al. Compiladores:
principios, tcnicas y herramientas. Mxico:
nmero de rangos de vida a ser razn de costo de spill sobre grado:
Addison Weley Iberoamericana, 1985.
coloreados y e es el nmero de arcos en
Mn = Coston / Gradon
[2] Appel, Andrew W. Compiling with
el grafo de interferencia. Chaitin de- Donde el costo del nodo n se calcula de
continuations. New York, Estados Unidos:
mostr que su procedimiento puede ser acuerdo a ciertos parmetros de la
Cambridge University Press, 1992.
usado para lograr tanto un coloreo del mquina. Una vez que un nodo (que
[3] Barnette, David. Poly-hedra and the
grafo como un vaciado de registros de representa un rango de vida L) ha sido
fourcolor problem. Estados Unidos: AMS,
1983.
una manera integrada.
escogido para ser vaciado a memoria,
Ahora, cmo trabaja este algoritmo? se debe insertar una grabacin hacia
[4] Briggs, Preston. Register allocation via
Graph Coloring. Ph.D. Disertation, HousBien, la fase de simplificacin repetida- memoria despus de cada definicin de
ton, Texas: Rice University, 1992: Sitio: csmente remueve nodos del grafo y los L y una carga antes de cada uso de L.
tr.cs.cornell.edu.
empuja en una pila. En la seleccin, los La condicin de que un nodo deba tener
[5] Chaitin, Gregory J. Register allocation
nodos son sacados de la pila y menos de k vecinos para ser coloreado
and spilling via graph coloring. ACM:
devueltos al grafo. Un nodo es remo- es un muy restrictiva y eso ayuda a que
SIGPLAN82 Symposium on Compiler
Construction.Volmen17(6):98-105,jun. 1982
vido del grafo a la pila, slo si su grado el algoritmo encuentre menos frecuen[6] Fischer, Charles y Richard LeBlanc Jr.
es menor que k (donde k es el nmero temente una coloracin ptima. Por
Crafting a Compiler with C. Redwood City,
de registros de la mquina). As pues, ejemplo, el grafo de la figura 2 puede
CA, Estados Unidos: The Benjamin/Cummings
cuando la seleccin mueve un nodo N ser coloreado totalmente con 3 colores
Publishing Co., 1991.
desde la pila al grafo, N tendr as (asgnele a C el color negro), sin
[7] Faaty, Thomas L. y Paul C Kainen. The
menos de k vecinos y claramente habr necesidad de utilizar el vaciado de
four-color problem: assaults and conquest.
New York, Estados Unidos: Mc-Graw Hill
un color disponible para N en el grafo. registros. A la par de este problema
1977
La etapa de simplificacin slo existen muchos otros que tratarn de
[8] Fraser, Christopher y David Hanson. A
remueve un nodo cuando se puede pro- ser cicatrizados en la prxima operaretargetable C compiler: design and
bar que al nodo se le podr asignar un cin a los compiladores, que se har en
implementation. Estados Unidos: Benjacolor en el grafo actual. Conforme cada la segunda parte de este artculo.
min/Cummings Publishing Company, 1995.
rango de vida (o nodo) se remueve del
grafo, el grado de sus vecinos se decreConclusiones
T Esteban Meneses es estudiante avanmenta. As, se va probando, en turnos,
zado de la carrera de Ingeniera en
que es posible asignarles un color a La asignacin de registros es una de las
Computacin del I.T.C.R. Actualmencada uno de ellos. En la etapa de selec- optimizaciones ms importantes que
te realiza su prctica de especialidad en
cin a los nodos se les asigna un color pueden hacerse al cdigo generado por
ArtInSoft.
en orden inverso al cual fueron remo- un compilador. Es un problema NPvidos.
completo y por ello se han propuesto T Francisco Torres es bachiller en
Cabe destacar, que de aquellos nodos muchas alternativas heursticas para Informtica de la U.C.R., Mster en
que no se hayan podido remover del resolverlo de una manera eficiente. El Ciencias de la Computacin de Georgia
grafo a la pila, algunos necesitan ser algoritmo propuesto por Chaitin y su Tech y Doctor en Ciencias de la Comvaciados a memoria. Cmo escoger el equipo de investigacin fue una de las putacin del Georgia Tech. Actualmennodo a vaciar en memoria? Chaitin primeras tcnicas serias en este campo. te labora como profesor e investigador
propuso un mtodo muy sencillo: esco- Tiene la ventaja de ser muy sencillo y del Instituto Tecnolgico de Costa
ger el nodo que tenga ms vecinos de abstraer tambin el problema del Rica.
Abril 2001

13

Das könnte Ihnen auch gefallen