Компилятор промежуточного кода генерации трехадресного кода fjump

Что означает FJUMP в этом контексте?

Ниже приведено промежуточное представление трехадресного кода (TAC) для машины регистра: оно содержит функцию с именем foo, который принимает целочисленный параметр n и параметр a который является массивом целых чисел. Запишите язык высокого уровня в Java-подобном псевдокоде.

label Foo:
    res = 1
    i = 1
label BAR:
    t1 = i LEQ n
    a[1] = res
    i = i ADD 1
    res = res MUL i
    JUMP BAR
label BAZ:

Я думал, что инструкция перехода в трехадресном коде - это что-то вроде "если x перейти к L"?

1 ответ

Соответствующий отрывок:

t1 = i LEQ n
FJUMP t1 BAZ

Что я имею в виду, если i меньше или равно n, прыгать, чтобы BAZ". Так FJUMP действительно, кажется, обозначает условный переход (когда вы читаете его, не стесняйтесь вставлять части "если" и "идти" самостоятельно!).

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


Кроме того, у меня есть ощущение, что студенты, изучающие теорию компиляторов, склонны слишком буквально читать свои учебники. Если вы посмотрите на несколько достаточно современных компиляторов, вы, вероятно, найдете повторяющиеся шаблоны, но они, как правило, довольно сильно различаются в деталях.

Другие вопросы по тегам