You are on page 1of 2

¿Qué es un GDA?

Es un grafo dirigido en el que no existen ciclos, esto es que no existen
caminos cerrados donde se repita un nodo inicial-final. Estos se usan
cuando se modela un problema en el que no tiene sentido que un nodo
tenga un camino directo a el mismo. A estos grafos también se les
llama arboles, en el caso de que sean conexos, sin embargo son mas
generales que un árbol, pero menos generales que un grafo arbitrario. Si
no son conexos también se les conoce como bosques.
Algunos ejemplos de problemas que es conveniente modelar con los
GDA son: varias tareas que se deben ordenar en secuencia, algoritmos
de ordenamiento topológico, modelaje de datos o información que fluyen
en una sola dirección a través de una red de procesadores.
¿Cómo se pueden usar los GDA para optimizar los bloques de código?
En bloques de código resultan útiles ya que estos son secuencias de
instrucciones consecutivas con flujo de control que entra al principio y
sin hacer saltos, llega al final. Esta estructura coincide con el tipo de
problema que puede ser modelado con un GDA. El grafo representaría el
flujo de control del programa.
Para optimizar los bloques de código se hace una reconstrucción del
código intermedio a partir de ciertas reglas.
Por ejemplo, si un nodo no tiene ascendentes y no tiene variables
activas, se elimina. Si un nodo tiene como descendientes a hojas con
etiquetas constantes, se cambia el nodo por una hoja cuya etiqueta
debe ser calculada a partir de las variables activas y las constantes.
También se debe tomar en cuenta que se realiza una reconstrucción con
orden topológico, esto es que solo se genera código para un operador y
sus hijos cuando todos los hijos ya hayan sido analizados.
Si un nodo contiene mas de una variable, se toman en cuenta las
variables activas para contener los valores de la expresión. Si el nodo no
contiene variables se crea una variable temporal. No se genera código
para etiquetas repetidas.
Para casos en los que se debe seguir un orden específico, este orden se
debe reflejar en el GDA.
Al respetar estas reglas, el código que se obtiene no va a contener
subexpresiones comunes, no hay instrucciones de copia eliminables, no
habrá código inútil y permite obtener cualquier orden de instrucciones.

simplemente se utiliza este y no se crea otro. Esta reescritura se basa en el ordenado de operandos. La equivalencia de un par de expresiones no siempre se puede determinar directamente por la forma en la que se escriben. el grafo se usa de una forma análoga a como se usa un árbol en una expresión. . Se debe considerar primero las constantes.¿Cómo se pueden usar los GDA para optimizar expresiones? En este caso. Lo que diferenciará al grafo del árbol es el hecho de que un nodo del grafo puede tener varios padres. En este caso ese nodo representa una subexpresión común a dichos padres que representan una expresión. Determinando las coincidencias de expresiones se procede a verificar que no haya un nodo que represente dicha expresión antes de crear el nuevo nodo. de esta forma se optimiza la cantidad de expresiones. Si se determina que hay una equivalencia se analiza si resulta conveniente hacer una sustitución de la expresión por una variable que contenga el valor resultante. se pueden representar las expresiones de una forma más breve que con los arboles y proporciona facilidades a la hora de la compilación. Esto implica que se debe buscar instancias idénticas de alguna expresión. Al no crearse una replicación del nodo para cada subexpresion. Si el nodo ya existe. después las variables con un orden alfabético. En ocasiones puede que dos expresiones que se escriben de forma distinta puedan ser reescritas y resulten ser idénticas. luego las variables indexadas y por ultimo las subexpresiones. Las hojas del GDA corresponderán a operandos atómicos y códigos interiores que corresponden a los operadores. esto es que al evaluarlas tengan un mismo valor. La optimización se logra con la eliminación de subexpresiones comunes.