Трехадресный код

редактировать

В информатике, трехадресный код (часто сокращенно 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:
См. также
  • icon Портал компьютерного программирования
Ссылки
  1. ^V., Aho, Alfred (1986). Составители, принципы, методы и инструменты. Sethi, Ravi., Ullman, Jeffrey D., 1942-. Reading, Mass.: Addison-Wesley Pub. Co., стр. 466. ISBN 0201100886. OCLC 12285707.
Последняя правка сделана 2021-06-11 10:50:14
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте