Язык ассемблера для разработки компиляторов

Я попытался создать небольшой компилятор и закончил Lexer и Parser. И теперь мне нужно создать часть этого Генератора кода сборки. Так что у меня проблемы!

На самом деле я хорошо умею C, и я изучил сборку NASM для этой задачи. Теперь я могу создавать некоторые программы с помощью NASM. Но я не могу понять, как реализовать сборку для компилятора, я имею в виду часть генерации сборки.

  • Нужно ли мне для этого владеть языком ассемблера?
  • Или для этого есть учебники? (Разработка компилятора <-> Сборка реализации)

Спасибо ^-^

1 ответ

Решение

Следующий шаг зависит от целей разработки, текущего формата компилируемой программы и исходного языка.

Сразу после синтаксического анализа формат компилируемой программы, вероятно, представляет собой какое-то абстрактное синтаксическое дерево и не более того. В этом случае вы захотите сгенерировать таблицы для различных целей - например, может быть, таблица типов для отслеживания имени и определения любых определенных пользователем типов (а также структур и классов?); и таблица символов для отслеживания имен, квалификаторов ("const", "final", "volatile", что угодно) и типов функций / методов и переменных.

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

Как только у вас есть соответствующие таблицы; вы, вероятно, могли бы сгенерировать язык ассемблера (или, лучше, необработанный машинный код) прямо из "абстрактного синтаксического дерева + таблиц". Чаще вы должны оптимизировать и упростить содержимое абстрактного синтаксического дерева, затем преобразовать абстрактное синтаксическое дерево в другую промежуточную форму (например, статическое одиночное присваивание), чтобы его можно было оптимизировать намного больше, а затем преобразовать в другую промежуточную форму более низкого уровня, которая ближе к инструкциям целевой машины, затем выполните дополнительную оптимизацию (выделение регистров, глазок, планирование инструкций), затем преобразуйте это в окончательный язык ассемблера (или необработанный машинный код).

Нужно ли мне для этого владеть языком ассемблера?

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

Или для этого есть учебники?

Всегда есть учебное пособие (например, хитрая ерунда, навязанная невежественным человеком, и / или основная вводная информация).

Не знаю, есть ли хороший учебник, но сомневаюсь, что это возможно. Требуется слишком много информации, чтобы охватить все (все различные исходные языки и языковые особенности, все разные целевые языки, все возможные методы и т. Д.); так что любой "хороший учебник" будет настолько большим, что станет полноценной книгой (ами) (а не учебным пособием).

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