En informática , el código de tres direcciones [1] (a menudo abreviado como TAC o 3AC) es un código intermedio utilizado por los compiladores optimizadores para ayudar en la implementación de transformaciones que mejoran el código . Cada instrucción TAC tiene como máximo tres operandos y normalmente es una combinación de asignación y un operador binario. Por ejemplo t1 := t2 + t3
,. El nombre se deriva del uso de tres operandos en estas sentencias, aunque pueden aparecer instrucciones con menos operandos.
Dado que el código de tres direcciones se utiliza como lenguaje intermedio dentro de los compiladores, lo más probable es que los operandos no sean direcciones de memoria concretas o registros de procesador , sino direcciones simbólicas que se traducirán en direcciones reales durante la asignación de registros . Tampoco es infrecuente que los nombres de los operandos se numeren secuencialmente, ya que el compilador suele generar el código de tres direcciones.
Un refinamiento del código de tres direcciones es una forma normal (ANF).
Ejemplos de
En el código de tres direcciones, esto se dividiría en varias instrucciones separadas. Estas instrucciones se traducen más fácilmente al lenguaje ensamblador . También es más fácil detectar sub-expresiones comunes para acortar el código. En el siguiente ejemplo, un cálculo se compone de varios más pequeños:
# Calcule una solución para la [[Ecuación cuadrática]].x = (-b + raíz cuadrada (b ^ 2 - 4 * a * c)) / (2 * a)
| t1: = b * bt2: = 4 * at3: = t2 * ct4: = t1 - t3t5: = raíz cuadrada (t4)t6: = 0 - bt7: = t5 + t6t8: = 2 * at9: = t7 / t8x: = t9
|
El código de tres direcciones puede tener saltos condicionales e incondicionales y métodos para acceder a la memoria. También puede tener métodos para llamar a funciones, o puede reducirlas a saltos. De esta manera, el código de tres direcciones puede ser útil en el análisis de flujo de control . En el siguiente ejemplo en forma de C, un bucle almacena los cuadrados de los números entre 0 y 9:
...para ( i = 0 ; i < 10 ; ++ i ) { b [ i ] = i * i ; }...
| t1: = 0; inicializar yoL1: si t1> = 10 pasa a L2; salto condicional t2: = t1 * t1; cuadrado de i t3: = t1 * 4; dirección de alineación de palabras t4: = b + t3; dirección para almacenar i * i * t4: = t2; almacenar a través del puntero t1: = t1 + 1; aumentar yo goto L1; repetir bucleL2:
|