Трехадресный код - Three-address code
В Информатика, трехадресный код[1] (часто сокращенно TAC или 3AC) - это промежуточный код использован оптимизация компиляторов для помощи в реализации преобразования, улучшающие код. Каждая инструкция TAC имеет не более трех операндов и обычно представляет собой комбинацию присваивания и бинарного оператора. Например, t1: = t2 + t3
. Название происходит от использования трех операндов в этих операторах, хотя могут встречаться инструкции с меньшим количеством операндов.
Поскольку трехадресный код используется в качестве промежуточного языка в компиляторах, операнды, скорее всего, не будут конкретными адресами памяти или регистры процессора, а скорее символические адреса, которые будут преобразованы в фактические адреса во время распределение регистров. Также нередко имена операндов нумеруются последовательно, поскольку трехадресный код обычно генерируется компилятором.
Уточнение трехадресного кода А-нормальная форма (ANF).
Примеры
В трехадресном коде это было бы разбито на несколько отдельных инструкций. Эти инструкции легче перевести на язык ассемблера. Также легче обнаружить общие подвыражения для сокращения кода. В следующем примере одно вычисление состоит из нескольких более мелких:
# Вычислить одно решение [[квадратного уравнения]]. X = (-b + sqrt (b ^ 2 - 4 * a * c)) / (2 * a)
| t1: = b * bt2: = 4 * at3: = t2 * ct4: = t1 - t3t5: = sqrt (t4) t6: = 0 - bt7: = t5 + t6t8: = 2 * at9: = t7 / t8x: = t9
|
Трехадресный код может иметь условные и безусловные переходы и способы доступа к памяти. Он также может иметь методы вызова функций или может сводить их к прыжкам. Таким образом, трехадресный код может быть полезен в анализ потока управления. В следующем примере, подобном C, цикл хранит квадраты чисел от 0 до 9:
...за (я = 0; я < 10; ++я) { б[я] = я*я; }...
| t1: = 0; инициализировать iL1: если t1> = 10 перейти к L2; условный переход t2: = t1 * t1; квадрат i t3: = t1 * 4; адрес с выравниванием слов t4: = b + t3; адрес для хранения i * i * t4: = t2; хранить через указатель t1: = t1 + 1; увеличить i goto L1; повторить цикл L2:
|
Смотрите также
Рекомендации
- ^ В., Ахо, Альфред (1986). Компиляторы, принципы, методы и инструменты. Сетхи, Рави., Ульман, Джеффри Д., 1942–. Ридинг, Массачусетс: Addison-Wesley Pub. Co., стр.466. ISBN 0201100886. OCLC 12285707.