2.2.3 Triplos
En la historia de los compiladores han sido utilizadas una
amplia variedad de representaciones intermedias como lo es la siguiente clase
de representación de código intermedio de un árbol de 3 direcciones,2 para los
operandos y una para la ubicación del resultado. esta clase incluye un amplio
número de representaciones diferentes entre las cuales encontramos cuadruplos y
triples. la principal diferencia entre estas notaciones y la notación postfija
es que ellos incluyen referencias explicitas para los resultados de los cálculos
intermedios, mientras que la notación posfija los resultados son implícitos al
representarlos en una pila.
§ La diferencia
entre triples y cuadruplos es que con los triples es referenciado el valor
intermedio hacia el número del triple que lo creo, pero en los cuádruplos
requiere que ellos tengan nombres implícitos.
§ Los triples
tienen una ventaja obvia de ser más consistente, pero ellos dependen de su
posición, y hacen que la optimización presente cambios de código mucho más
compleja.
Para evitar tener que introducir nombres temporales en la
tabla de símbolos, se hace referencia a un valor temporal según la posición de
la proposición que lo calcula. Las propias instrucciones representan el valor
del nombre temporal. La implementación se hace mediante registros de solo tres
campos (op, arg1, arg2).
§ En la notación
de tripletes se necesita menor espacio y el compilador no necesita generar los
nombres temporales. Sin embargo, en esta notación, trasladar una proposición
que defina un valor temporal exige que se modifiquen todas las referencias a
esa proposición. Lo cual supone un inconveniente a la hora de optimizar el
código, pues a menudo es necesario cambiar proposiciones de lugar.
§ Una forma de
solucionar esto consiste en listar las posiciones a las tripletas en lugar de
listar las tripletas mismas. De esta manera, un optimizador podría mover una
instrucción reordenando la lista, sin tener que mover las tripletas en si.
Comentarios
Publicar un comentario