Компилятор: преобразование переменных промежуточного представления в собственный код - PullRequest
0 голосов
/ 29 ноября 2018

В книгах, статьях, слайдах и учебных пособиях о промежуточном представлении, используемых в компиляторах, трехадресный код (TAC) является распространенным.Мой вопрос о следующих примерах TAC

t0 = a
t1 = a + b
a = t2

В этом примере у нас есть три строки с двумя переменными: a и b;и три временных: t0, t1 и t2.Например, при преобразовании таких TAC в сборку MIPS первым и последним может быть что-то вроде следующего:

lw t0, sp, a.offset
sw t2, sp, a.offset

Но я должен признать, что понятия не имею, как перевести средний TAC, посколькуMIPS (и многие другие процессоры RISC) не имеют инструкции, способной извлекать два операнда памяти одновременно.

Поэтому у меня следующие вопросы: (1) как можно перевести такой TAC в инструкцию RISC и;(2) почему такой TAC обычно используется, когда так много процессоров в настоящее время основаны на RISC?Является ли это наследием того времени, когда процессоры были в большей степени основаны на CISC и допускали множественные выборки из памяти?

ИЛИ

Возможно, у меня неверная интерпретация значения переменной на таких TAC.Если так, как я должен интерпретировать такие переменные в TAC?

1 Ответ

0 голосов
/ 29 ноября 2018

как можно перевести такой TAC в инструкцию RISC

Загрузить a в t1 (или переместить t0 в t1), загрузить b вкакой-то другой регистр, а затем добавить этот другой регистр в t1.

Я предположил, что временные объекты назначаются регистрам с тем же именем, а переменные хранятся в памяти, потому что это, кажется,предположение вы сделали.Вы не можете предположить, что в целом (по крайней мере, не первая часть, так как может быть больше временных значений, чем регистров - также обычно хранят переменные в регистрах, где это возможно, но, конечно, вам не нужно это делать), ноВопрос был не в распределении регистров, поэтому я не буду вдаваться в подробности.

Почему такой TAC обычно используется, когда сегодня так много процессоров основаны на RISC?

Наиболее распространенные архитектуры процессоров сегодня - это x86, x64 и ARM, каждая из которых может выполнять r1 = r2 + r3 в одной инструкции, поэтому ваше предположение не совсем точно.Но даже если бы это было так, основная цель TAC не состоит в том, чтобы как можно более точно отобразить сборку.

Вместо этого цель состоит в том, чтобы быть полезным форматом для оптимизаций и анализов, которые компиляторы обычно выполняют до этого.наконец, создание целевого кода.Делать код более сложным, добавляя дополнительные шаги в IR, не будет способствовать достижению этой цели, поэтому это не сделано.

...