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 tambin 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 tambin 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 topolgico, modelaje de datos o informacin que fluyen en una sola direccin a travs de una red de procesadores. Cmo se pueden usar los GDA para optimizar los bloques de cdigo? En bloques de cdigo 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 representara el flujo de control del programa. Para optimizar los bloques de cdigo se hace una reconstruccin del cdigo 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. Tambin se debe tomar en cuenta que se realiza una reconstruccin con orden topolgico, esto es que solo se genera cdigo 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 expresin. Si el nodo no contiene variables se crea una variable temporal. No se genera cdigo para etiquetas repetidas. Para casos en los que se debe seguir un orden especfico, este orden se debe reflejar en el GDA. Al respetar estas reglas, el cdigo que se obtiene no va a contener subexpresiones comunes, no hay instrucciones de copia eliminables, no habr cdigo intil y permite obtener cualquier orden de instrucciones.
Cmo se pueden usar los GDA para optimizar expresiones?
En este caso, el grafo se usa de una forma anloga a como se usa un rbol en una expresin. Las hojas del GDA correspondern a operandos atmicos y cdigos interiores que corresponden a los operadores. 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 subexpresin comn a dichos padres que representan una expresin. Al no crearse una replicacin del nodo para cada subexpresion, se pueden representar las expresiones de una forma ms breve que con los arboles y proporciona facilidades a la hora de la compilacin. La optimizacin se logra con la eliminacin de subexpresiones comunes. Esto implica que se debe buscar instancias idnticas de alguna expresin, esto es que al evaluarlas tengan un mismo valor. Si se determina que hay una equivalencia se analiza si resulta conveniente hacer una sustitucin de la expresin por una variable que contenga el valor resultante. La equivalencia de un par de expresiones no siempre se puede determinar directamente por la forma en la que se escriben. En ocasiones puede que dos expresiones que se escriben de forma distinta puedan ser reescritas y resulten ser idnticas. Esta reescritura se basa en el ordenado de operandos. Se debe considerar primero las constantes, despus las variables con un orden alfabtico, luego las variables indexadas y por ultimo las subexpresiones. Determinando las coincidencias de expresiones se procede a verificar que no haya un nodo que represente dicha expresin antes de crear el nuevo nodo. Si el nodo ya existe, simplemente se utiliza este y no se crea otro, de esta forma se optimiza la cantidad de expresiones.