Трехадресный код
В информатике трехадресный код [1] (часто сокращенно TAC или 3AC) — это промежуточный код , используемый оптимизирующими компиляторами для помощи в реализации преобразований, улучшающих код . Каждая инструкция TAC имеет не более трех операндов и обычно представляет собой комбинацию присваивания и бинарного оператора. Например, t1 := t2 + t3
. Название происходит от использования трех операндов в этих операторах, хотя могут встречаться инструкции с меньшим количеством операндов.
Поскольку трехадресный код используется в качестве промежуточного языка в компиляторах, операндами, скорее всего, будут не конкретные адреса памяти или регистры процессора , а скорее символические адреса, которые будут преобразованы в фактические адреса во время выделения регистров . Также нередко имена операндов нумеруются последовательно, поскольку трехадресный код обычно генерируется компилятором.
Уточнением трехадресного кода является А-нормальная форма (АНФ).
Примеры [ править ]
В трехадресном коде это будет разбито на несколько отдельных инструкций. Эти инструкции легче переводятся на язык ассемблера . Также легче обнаружить общие подвыражения для сокращения кода. В следующем примере одно вычисление состоит из нескольких более мелких:
# Calculate one solution to the [[Quadratic equation]]. 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 ; initialize i L1: if t1 >= 10 goto L2 ; conditional jump t2 := t1 * t1 ; square of i t3 := t1 * 4 ; word-align address t4 := b + t3 ; address to store i*i *t4 := t2 ; store through pointer t1 := t1 + 1 ; increase i goto L1 ; repeat loop L2:
|
См. также [ править ]
Ссылки [ править ]
- ^ В., Ахо, Альфред (1986). Составители, принципы, методы и инструменты . Сетхи, Рави, Ульман, Джеффри Д., 1942-. Ридинг, Массачусетс: Паб Addison-Wesley. Ко стр. 466 . ISBN 0201100886 . OCLC 12285707 .
{{cite book}}
: CS1 maint: несколько имен: список авторов ( ссылка )