В информатике, трехадресный код (часто сокращенно TAC или 3AC) - это промежуточный код, используемый оптимизирующими компиляторами для помощи в реализации преобразований, улучшающих код. Каждая инструкция TAC имеет не более трех операндов и обычно представляет собой комбинацию присваивания и бинарного оператора. Например, t1: = t2 + t3
. Название происходит от использования трех операндов в этих операторах, хотя могут встречаться инструкции с меньшим количеством операндов.
Поскольку трехадресный код используется в качестве промежуточного языка в компиляторах, операнды, скорее всего, будут не конкретными адресами памяти или регистрами процессора, а скорее символическими адресами, которые будут преобразованы в фактические адреса при распределении регистров . Также нередко имена операндов нумеруются последовательно, поскольку трехадресный код обычно генерируется компилятором.
Уточнение трехадресного кода - A-нормальная форма (ANF).
В трехадресном коде это будет разбито на несколько отдельных инструкций. Эти инструкции легче перевести на язык ассемблера. Также легче обнаружить общие подвыражения для сокращения кода. В следующем примере одно вычисление состоит из нескольких более мелких:
# Вычислить одно решение [[квадратное уравнение]]. 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 |
Трехадресный код может иметь условные и безусловные переходы и методы доступа к памяти. Он также может иметь методы вызова функций или может сводить их к прыжкам. Таким образом, трехадресный код может быть полезен в анализе потока управления. В следующем примере, подобном C, цикл сохраняет квадраты чисел от 0 до 9:
... for (i = 0; i < 10; ++i) { b[i] = i*i; }... | t1: = 0; инициализировать i L1: if t1>= 10 goto L2; условный переход t2: = t1 * t1; квадрат i t3: = t1 * 4; адрес выравнивания слов t4: = b + t3; адрес для хранения i * i * t4: = t2; сохранить через указатель t1 : = t1 + 1; увеличить i goto L1; повторить цикл L2: |