Почему большинство компиляторов используют AST, вместо этого генерируют IR напрямую? - PullRequest
1 голос
/ 26 марта 2020

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

Но я думаю, что компилятор может генерировать IR напрямую, как C4 project .

Если я использую AST, когда я заканчиваю анализ синтаксиса sh и анализ семантики c, мне нужно сканировать AST с начала для генерации IR. Это дополнительный шаг, поэтому я думаю, что он медленный.

Каковы преимущества использования AST? Лучшая читаемость или лучшая переносимость?

Не могли бы вы дать мне несколько советов? Спасибо за ваше время.

1 Ответ

1 голос
/ 28 марта 2020

Вам, вероятно, нужно более одного AST. Ваш первый AST, созданный парсером, вероятно, полон лишних вещей, всего синтаксического сахара, который делает ваш исходный язык простым в использовании. Перед тем, как вы начнете генерировать IR, вам нужно удалить эту избыточность, иначе ваш шаг генерации кода станет повторяющимся образцом.

В данном случае - if оператор. У вас есть две формы - одна с ветвью true, а другая с ветвями true и false. Первое является особым случаем второго, поэтому имеет смысл сделать обход вашего AST, заменив все однорукие операторы if на двухрукие фиктивной веткой false. Тогда ваша процедура генерации ИК будет иметь дело только с одним видом if.

Еще одним важным соображением является набор текста. Это проще сделать на дереве, чем на каком-то плоском IR, для подавляющего большинства систем типов.

Кроме того, рассматривайте ваш плоский IR как еще одну форму AST и относитесь к нему так же. Преобразование сложного AST в какой-нибудь низкий и простой внутренний AST (или IR, называйте его как хотите) небольшими шагами намного проще, чем делать все за один огромный проходной шаблон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...