Code à trois adresses
En informatique, le code à trois adresses[1] (TAC ou 3AC) est un type de langage intermédiaire utilisé par les compilateurs comme Clang-LLVM. Chaque instruction TAC a au plus trois opérandes et est généralement une combinaison d'affectation et d'un opérateur binaire. Par exemple, t1: = t2 + t3. Le nom dérive de l'utilisation de trois opérandes dans ces instructions même si des instructions avec moins d'opérandes peuvent se produire.
Pour les articles homonymes, voir TAC.
Étant donné que le code à trois adresses est utilisé comme langage intermédiaire dans les compilateurs, les opérandes ne seront probablement pas des adresses mémoire concrètes ou des registres de processeur, mais plutôt des adresses symboliques qui seront traduites en adresses réelles lors de l'allocation des registres. Il n'est pas rare non plus que les noms d'opérandes soient numérotés séquentiellement, car le code à trois adresses est généralement généré par le compilateur.
Exemples
En code à trois adresses, cela serait décomposé en plusieurs instructions distinctes. Ces instructions se traduisent plus facilement en langage d'assemblage. Il est également plus facile de détecter des sous-expressions courantes pour raccourcir le code. Dans l'exemple suivant, un calcul est composé de plusieurs plus petits :
# Calcul d'une solution d'une [[Équation du second degré]]. 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 |
Le code à trois adresses peut avoir des sauts conditionnels et inconditionnels et des méthodes d'accès à la mémoire. Il peut également avoir des méthodes d'appel de fonctions. De cette façon, le code à trois adresses peut être utile dans l'analyse de flux de contrôle. Dans l'exemple de type C ci-après, une boucle stocke les carrés des nombres entre 0 et 9:
...
for (i = 0; i < 10; ++i) {
b[i] = i*i;
}
...
|
t1 := 0 ; Initialisation de i L1: if t1 >= 10 goto L2 ; Saut conditionnel t2 := t1 * t1 ; Calcul du carré de i t3 := t1 * 4 ; Définition de l'adresse t4 := b + t3 ; Adresse pour stocker i au carré *t4 := t2 ; Stockage de l'information via le pointeur t1 := t1 + 1 ; Incrémentation de i goto L1 ; Répétition de la boucle L2: |
Notes et références
- Aho, Alfred V. (Sethi, Ravi., Ullman, Jeffrey D., 1942-), Compilers, principles, techniques, and tools, Reading, Mass., Addison-Wesley Pub. Co, , 466 (ISBN 0201100886, OCLC 12285707, lire en ligne )
- Portail de l’informatique