código de três endereços - Three-address code
Em informática , o código de três endereços (muitas vezes abreviado para TAC ou 3AC) é um código intermediário usado por optimização compiladores para ajudar na aplicação de transformações de melhoramento de código . Cada instrução TAC tem no máximo três operandos e é tipicamente uma combinação de atribuição e um operador binário. Por exemplo, t1 := t2 + t3
. O nome deriva do uso de três operandos nestas declarações, embora instruções com menos operandos podem ocorrer.
Desde código de três endereços é usado como língua intermediária dentro de compiladores, os operandos provavelmente não vai ser endereços concretas de memória ou registradores do processador , mas endereços em vez simbólicos que serão traduzidos em endereços reais durante a alocação de registradores . Também não é incomum que os nomes operando são numerados sequencialmente desde código de três endereços é normalmente gerado pelo compilador.
Um refinamento do código de três endereços é A-forma normal (ANF).
Exemplos
No código de três endereços, este seria dividido em várias instruções separadas. Estas instruções traduzir mais facilmente a linguagem assembly . É também mais fácil de detectar sub-expressões comuns para encurtar o código. No exemplo a seguir, um cálculo é composto por vários pequenos:
# Calcular uma solução para o [equação [quadrática]]. x = (-b + sqrt (b ^ 2-4 * uma * c)) / (2 * a)
|
t1: = b * b t2: = 4 * um t3: = T2 * C t4: = t1 - t3 t5: = sqrt (T4) T6: = 0 - b T7: = t5 + t6 t8: = 2 * um T9: = T7 / T8 x: = T9
|
Código de três endereços podem ter saltos e métodos de acesso de memória condicionais e incondicionais. Ele também pode ter métodos de funções de chamada, ou pode reduzir estes para saltos. Desta maneira, o código de três endereços pode ser útil em análise de controlo de fluxo . No seguinte exemplo, C-like, um circuito armazena os quadrados dos números entre 0 e 9:
...
for (i = 0; i < 10; ++i) {
b[i] = i*i;
}
...
|
t1: = 0; inicializar i L1: se t1> = 10 Goto L2; salto condicional t2: = t1 * t1; quadrado de i t3: = t1 * 4; endereço de palavra-align t4: = b + t3; dirigir para armazenar i * i * T4: = t2; armazenar através ponteiro t1: = t1 + 1; aumentar i Goto L1; loop de repetição L2:
|
Veja também
- linguagem intermediária
- computador conjunto de instruções reduzido
- Forma de atribuição única estático (SSA)
Referências
- ^ V., Aho, Alfred (1986). Compiladores, princípios, técnicas e ferramentas . Sethi, Ravi., Ullman, Jeffrey D., 1942-. Reading, Mass .: Addison-Wesley Pub. Co. p. 466. ISBN 0201100886 . OCLC 12285707 .