Разработка промежуточного представления для компилятора - PullRequest
6 голосов
/ 06 января 2011

Я смотрю на дизайн компилятора. Я прошел один семестровый курс по этому вопросу в университете и читал Современный дизайн компилятора Грюна и др., Книга, кажется, поддерживает аннотированное абстрактное синтаксическое дерево в качестве промежуточного кода, и это то, что мы используется в курсе.

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

Является ли хорошей идеей просто нацелиться на уже существующее низкоуровневое представление, такое как LLVM, и использовать его в качестве промежуточного представления?

Ответы [ 3 ]

5 голосов
/ 07 января 2011

Если ваш язык достаточно сложный, вы в любом случае получите последовательность слегка отличающихся промежуточных представлений. И не имеет значения, какое представление будет вашей конечной целью - llvm, C, нативный код, CLR, JVM, что угодно. Это не должно влиять на дизайн и архитектуру вашего компилятора.

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

1 голос
/ 06 января 2011

AST и низкоуровневый псевдокод - это две разные абстракции программы в пути, который компилятор берет от языка высокого уровня к объектному коду.

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

Например, проще проводить семантический и синтаксический анализ в AST. Планирование инструкций для псевдокода проще.

Разработчикам внешних интерфейсов компиляторов обычно нравятся AST. Бэкэнд-разработчикам нравится псевдокод.

0 голосов
/ 06 января 2011

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

Обычно ваш парсер может создать AST, который будет, в ожидании этого, абстрактным представлением вашего кода. Он не содержит пробелов или семантических ароматов, таких как скобки, скобки и т. Д. Он также разрешает любую двусмысленность в вашем коде.

AST позволит очень легко производить из него icode. Этот код является в основном кодом инструкции на вашем языке. Он будет содержать элементарные операции, такие как перемещение, переход и т. Д.

Процесс будет идти Код -> AST -> ICode. Затем ICode может быть запущен через виртуальную машину.

Я не вижу ничего плохого в создании ICode для другой платформы.

Обновление

Я перечитал вопрос еще раз и понял, о чем сейчас говорят. Он говорит, что вместо создания представления icode оставляет аннотированное синтаксическое дерево. Мне любопытно, если бы вы создали свой собственный компьютер, который обрабатывал бы аннотированное синтаксическое дерево, или это дерево затем было преобразовано в другой хорошо известный промежуточный код?

Я бы предположил, что дизайн движка для обработки синтаксического дерева был бы более сложным, чем если бы он был в промежуточном формате, представляющем основы, такие как mov, goto и т. Д.

Мне нужно забрать эту книгу. Я узнал все из книги о драконах и искал через ANTRL, yacc, byson и пользовательские токенизаторы и парсеры.

...