Ресурсы по преобразованию синтаксического дерева в сборку? - PullRequest
5 голосов
/ 08 февраля 2011

Прежде всего, в качестве учебного упражнения, я пишу виртуальную машину, ассемблер и компилятор с нуля, в зависимости от отсутствия внешних инструментов.

Я считаю, что у меня есть приличное концептуальное понимание того, как виртуальная машинаи ассемблер будет работать, а также некоторые части компилятора.

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

(Давайте предположим, что существуют некоторые простые языковые конструкции, например if и while. Я ищу здесь минимальное и простое объяснение.)

Меня не особо интересуют сложные решения или решения, основанные на существующих инструментах.Скорее, я бы хотел что-то вроде 1-страничного, широкого описания идей перехода от синтаксического дерева к сборке.

Кто-нибудь знает такой ресурс?

Спасибо:)

1 Ответ

6 голосов
/ 09 февраля 2011

Обязательным ответом на вопрос компилятора является чтение книги Dragon (Компиляторы: принципы, методы и инструменты). Когда вы говорите, что превратили исходный код в синтаксическое дерево, что именно вы имеете в виду? Обычно первым этапом синтаксического анализа является создание абстрактного синтаксического дерева (AST). Следующим шагом обычно является атрибуция . Атрибуты - это свойства узлов в AST, которые не обязательно связаны с исходным языком, но необходимы для генерации кода. Обычно здесь проводится некоторая форма проверки типов, чтобы определить требования к объему памяти и, в объектно-ориентированных языках, какую функцию вызывать. Например, если ваш источник obj1 = obj2 + obj3, вы на самом деле не знаете, что делать со знаком плюс, пока не определите тип obj2.

Итак, чтобы дать шанс ответить на ваш вопрос. 1) Разобрать исходный код в AST. 2) Делать атрибуцию на АСТ. 3) Сгенерируйте промежуточный код (что вы называете сборкой).

В главах 5 и 6 книги «Дракон» это подробно описано. Действительно сложная задача - выяснить, какие атрибуты вам нужны для генерации кода. Кроме того, есть некоторые хитрые проблемы с утверждениями if. Например, если условие if не выполняется, вы знаете, что вам нужно перепрыгнуть через некоторый код, но, по крайней мере, на начальном этапе вы не знаете, как далеко. Обратное исправление является одним из решений этой проблемы.

...