Cuando el que genera el código para las expresiones aritméticas, el recopilador tiene que decidir a cuál es la mejor manera de traducir la expresión en términos de número de instrucciones usadas así como el número de registros necesarios para evaluar cierta sub-estructura (especialmente si es libre los registros son escasos). El algoritmo supuesto de Sethi-Ullman del (también conocido como enumeración de Sethi-Ullman del ) satisface la característica de producir el código que necesita el menos número de instrucciones posibles así como el menos número de referencias del almacenaje (debajo de la asunción que a lo más el Commutativity y el Associativity se aplican a los operadores usados, solamente del a distributivo de las leyes es decir * b + a * c = a * (b + c) no hace asimiento). Observar por favor que el algoritmo tiene éxito también si ni el Commutativity ni el asimiento de Associativity para las expresiones usadas, y por lo tanto las transformaciones aritméticas no puede ser aplicado.

Algoritmo simple de Sethi-Ullman

Los trabajos simples del algoritmo de Sethi-Ullman del como sigue (para un carga-almacenar la arquitectura ): Travesía del

el árbol de abstract syntax en

  • pre- o del postorder del
      Para cada nodo de hoja no-constante, asignar un 1 (es decir 1 registro es necesario llevar a cabo la variable/el campo/etc. Para cada nodo de hoja constante (lado derecho de una operación - los literales, los valores), asignar 0.
    1. Para cada non-leaf n del nodo, asignar el número de registros necesarios para evaluar las sub-estructuras respectivas del n . Si el número de registros necesarios en la sub-estructura izquierda ( l ) no es igual al número de registros necesarios en la sub-estructura derecha ( r ), el número de registros necesarios para el actual n del nodo es máximo (l, r) . Si el l == r, entonces el número de registros necesitó para el nodo actual es l + 1 .
    2. de
    Cifrar el de la emisión Si el número de registros necesarios para computar la sub-estructura izquierda del n del nodo es más grande que el número de registros para la sub-estructura derecha, después la sub-estructura izquierda se evalúa primero (puesto que puede ser posible que el un más registro necesario por la sub-estructura derecha para ahorrar el resultado hace que el izquierdo de la sub-estructura derrama ). Si la sub-estructura derecha necesita más registros que la sub-estructura izquierda, la sub-estructura derecha se evalúa primero por consiguiente. Si ambas sub-estructuras necesitan el igual tan mucha se coloca, después la orden de la evaluación es inaplicable.

    Ejemplo

    Para un a de la expresión aritmética = (b + c) * (d + 3), el árbol de abstract syntax parece esto:

    = /\ a * /\ /\ + + /\/\ b c d 3

    Para continuar con el algoritmo, necesitamos examinar solamente el de la expresión aritmética (b + c) * (d + 3), es decir tenemos que mirar solamente la sub-estructura derecha de la asignación “=”:

    * /\ /\ + + /\/\ b c d 3

    Ahora comenzamos a atravesar el árbol (en preorder para ahora), asignando el número de registros necesarios para evaluar cada sub-estructura (nota que el summand pasado en el de la expresión (b + c) * (d + 3) es un constante):

    2 del * /\ /\ 1 del 2 + de + /\/\ 0 del 1 3 del 1 d del c del 1 del b

    De este árbol puede ser visto que necesitamos 2 registros computar la sub-estructura izquierda del “*”, pero solamente 1 registro para computar la sub-estructura derecha. Por lo tanto comenzaremos a emitir el código para la sub-estructura izquierda primero, porque puede ser que funcionemos en la situación que hacemos solamente 2 registros dejar para computar la expresión entera. Si ahora computáramos la sub-estructura derecha primero (que necesita solamente 1 registro), entonces necesitaríamos un registro celebrar el resultado de la sub-estructura derecha mientras que computaban la sub-estructura izquierda (que todavía necesitaría 2 registros), por lo tanto necesitando 3 registros concurrentemente. La computación de la sub-estructura izquierda primero necesita 2 registros, pero el resultado se puede almacenar en 1, y puesto que la sub-estructura derecha necesita solamente 1 registro computar, la evaluación de la expresión puede hacer con solamente 2 registros dejados.

    Algoritmo avanzado de Sethi-Ullman

    En una versión avanzada del algoritmo de Sethi-Ullman del, las expresiones aritméticas primero se transforman, explotando las características algebraicas de los operadores usados.
  • Zenithic
  • Chasuble
    Random links:Parque de estado del Berlín-Ichthyosaur | Vishishtadvaita | Mikołaj Mielecki | El huevo de la serpiente (película) | Lista de deidades de Greyhawk

  • © 2007-2008 enciclopediaespana.com; article text available under the terms of GFDL, from en.wikipedia.org
    ="http://pagead2.googlesyndication.com/pagead/show_ads.js">