Código de três endereços

Na ciência da computação , o código de três endereços ( TAC ou 3AC ) é um tipo de linguagem intermediária usada por compiladores como o Clang - LLVM . Cada instrução TAC tem no máximo três operandos e geralmente é 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 nessas instruções, embora possam ocorrer instruções com menos operandos.

Como o código de três endereços é usado como uma linguagem intermediária em compiladores, é improvável que os operandos sejam endereços de memória concretos ou registradores de processador , mas sim endereços simbólicos que serão traduzidos em endereços reais ao alocá-los . Também não é incomum que os nomes dos operandos sejam numerados sequencialmente, já que o código de três endereços geralmente é gerado pelo compilador.

Exemplos

Em três códigos de endereço, isso seria dividido em várias instruções separadas. Essas instruções são mais facilmente traduzidas para a linguagem assembly. Também é mais fácil detectar subexpressões comuns para encurtar o código. No exemplo a seguir, um cálculo é composto de vários outros menores:

# Cálculo de uma solução de uma [[Equação quadrática]]. x = (-b + sqrt (b ^ 2 - 4 * a * c)) / (2 * a) t1: = b * b t2: = 4 * a t3: = t2 * c t4: = t1 - t3 t5: = sqrt (t4) t6: = 0 - b t7: = t5 + t6 t8: = 2 * a t9: = t7 / t8 x: = t9

O código de três endereços pode ter saltos condicionais e incondicionais e métodos de acesso à memória. Ele também pode ter métodos de chamada de funções. Desta forma, o código de três endereços pode ser útil na análise de fluxo de controle. No exemplo de tipo C a seguir, um loop armazena os quadrados de números entre 0 e 9:

... for (i = 0; i < 10; ++i) { b[i] = i*i; } ... t1: = 0; Inicialização de i L1: se t1> = 10 vá para L2; Salto condicional t2: = t1 * t1; Cálculo do quadrado de i t3: = t1 * 4; Definição de endereço t4: = b + t3; Endereço para armazenar i ao quadrado * t4: = t2; Armazenamento de informações por meio do ponteiro t1: = t1 + 1; Incremento i goto L1; Repetição de loop L2:

Veja também

Notas e referências

  1. Aho, Alfred V. (Sethi, Ravi., Ullman, Jeffrey D., 1942-), Compiladores, princípios, técnicas e ferramentas , Reading, Mass., Addison-Wesley Pub. Co,1986, 466  p. ( ISBN  0201100886 , OCLC  12285707 , leia online )