Перевод исходного кода G-Machine в LLVM IR

Я реализую простой ленивый функциональный язык с LLVM в качестве бэкэнда в Haskell. Я прочитал две книги, написанные Саймоном Пейтоном Джонсом («Реализация функциональных языков программирования», а также «Реализация функциональных языков: учебное пособие») и на их основе мне удалось реализовать компилятор и интерпретатор G-Machine .

Сейчас я застрял на проблеме генерации кода LLVM IR из инструкций G-Machine. Основная проблема заключается в том, что G-Machine является стековой машиной, тогда как LLVM IR - машиной регистров. Таким образом, чтобы преобразовать G- Машина в LLVM IR Мне нужно поддерживать какой-то стек времени выполнения в LLVM IR (поправьте меня, если я ошибаюсь). Я думал о выделении последующих узлов стека в стеке LLVM, используя его инструкции IR, но потом я d должен создать этот стек способом связанного списка, где каждый элемент стека имеет указатель на предыдущий, а первый имеет нулевой указатель. Однако этот подход не очень оптимален, и в случае операции «Push n» из G-Machine он будет иметь сложность O (n) вместо предпочтительного O (1). Другая идея может заключаться в выделении целых блоков памяти вместо отдельных ячеек.

Мой вопрос в том, видите ли вы лучший / другой способ решения моей проблемы.

7
задан pkaleta 29 July 2011 в 08:25
поделиться