Я занимаюсь созданием инструкций mips для C-подобного языка из работы школы дизайна компиляторов. Из компьютерной архитектуры становится понятно, что mips - это набор команд на основе регистров, который явно управляет 32 или около того регистрами общего назначения. Поскольку я программировал весь путь от лексического анализа, построения AST до генерации реального кода, я обнаружил, что инструкции на основе регистров довольно сложно придумать. Поскольку я в настоящее время следую за дизайном компиляторной части интерпретатора Python, я нахожу его основанный на стеке байт-код довольно простым для понимания и реализации. Тем не менее, курс, который я выбираю, требует трехадресного промежуточного кода и, наконец, изменения кода.
Вот причины, по которым я нахожу простой код на основе стека, а жесткий на основе регистров:
- Код, основанный на стеке, в основном просто выталкивает операнды, извлекает их, вычисляет и возвращает результат обратно. Не нужно беспокоиться о распределении регистров.
- Код на основе стека имеет стек, который может увеличиваться и уменьшаться, в отличие от ограниченного числа регистров, которые можно использовать в коде на основе регистров.
Вот мои вопросы: с учетом AST (как в Python) и таблицы символов, как можно
- сгенерируйте 3-адресный промежуточный код, затем преобразуйте в mips-код
- генерирует основанный на стеке код, затем преобразует его в 3-адресный код, наконец, в mips-код.
Подойдет любая рабочая схема.
Редактировать: Что я действительно хочу знать, так это как генерировать код MIPS, а не конвертировать из других форм.