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