我正在使用Haskell实现一种简单的惰性函数语言,并使用LLVM作为其后端。我已经阅读了Simon Peyton Jones写的两本书(“实现函数式编程语言”以及“实现函数式语言:教程”),并基于此实现了G-Machine编译器和解释器。
我现在遇到了一个问题,就是如何从G-Machine指令生成LLVM IR代码。主要问题是G-Machine是一个栈机器,而LLVM IR是一个寄存器机器。因此,为了将G-Machine转换为LLVM IR,我必须在LLVM IR中维护某种运行时堆栈(如果我理解错了,请纠正我)。我考虑使用LLVM IR指令在LLVM堆栈上分配后续堆栈节点,但这样我就必须以链表方式创建该堆栈,其中每个堆栈元素都有一个指向前一个元素的指针,第一个元素有一个空指针。然而,这种方法不是很优化,在G-Machine的“Push n”操作的情况下,它将具有O(n)的复杂度,而不是首选的O(1)。另一个想法可能是分配整个内存块而不是单个单元格。
我的问题是,您是否看到解决我的问题的更好/不同的方法。
我现在遇到了一个问题,就是如何从G-Machine指令生成LLVM IR代码。主要问题是G-Machine是一个栈机器,而LLVM IR是一个寄存器机器。因此,为了将G-Machine转换为LLVM IR,我必须在LLVM IR中维护某种运行时堆栈(如果我理解错了,请纠正我)。我考虑使用LLVM IR指令在LLVM堆栈上分配后续堆栈节点,但这样我就必须以链表方式创建该堆栈,其中每个堆栈元素都有一个指向前一个元素的指针,第一个元素有一个空指针。然而,这种方法不是很优化,在G-Machine的“Push n”操作的情况下,它将具有O(n)的复杂度,而不是首选的O(1)。另一个想法可能是分配整个内存块而不是单个单元格。
我的问题是,您是否看到解决我的问题的更好/不同的方法。