Как преобразовать основанную на стеке инструкцию в основанную на регистре инструкцию? - PullRequest
0 голосов
/ 14 ноября 2018

Я занимаюсь созданием инструкций mips для C-подобного языка из работы школы дизайна компиляторов. Из компьютерной архитектуры становится понятно, что mips - это набор команд на основе регистров, который явно управляет 32 или около того регистрами общего назначения. Поскольку я программировал весь путь от лексического анализа, построения AST до генерации реального кода, я обнаружил, что инструкции на основе регистров довольно сложно придумать. Поскольку я в настоящее время следую за дизайном компиляторной части интерпретатора Python, я нахожу его основанный на стеке байт-код довольно простым для понимания и реализации. Тем не менее, курс, который я выбираю, требует трехадресного промежуточного кода и, наконец, изменения кода.

Вот причины, по которым я нахожу простой код на основе стека, а жесткий на основе регистров:

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

Вот мои вопросы: с учетом AST (как в Python) и таблицы символов, как можно

  • сгенерируйте 3-адресный промежуточный код, затем преобразуйте в mips-код
  • генерирует основанный на стеке код, затем преобразует его в 3-адресный код, наконец, в mips-код.

Подойдет любая рабочая схема.

Редактировать: Что я действительно хочу знать, так это как генерировать код MIPS, а не конвертировать из других форм.

...