将G-Machine源转换为LLVM IR

pka*_*eta 7 compiler-construction haskell translation llvm

我正在实现一个简单的惰性函数语言,LLVM作为Haskell的后端.我读过Simon Peyton Jones编写的两本书("函数式编程语言的实现",以及"实现函数式语言:教程"),并在此基础上设法实现了G-Machine编译器和解释器.

我现在正处于从G-Machine指令生成LLVM IR代码的问题上.主要问题是G-Machine是堆栈机器而LLVM IR是寄存器机器.因此,为了将G-Machine转换为LLVM IR,我必须在LLVM IR中维护某种运行时堆栈(如果我错了,请纠正我).我正在考虑使用其IR指令在LLVM堆栈上分配后续堆栈节点,但后来我必须以链表方式创建该堆栈,其中每个堆栈元素都有一个指向前一个堆栈元素的指针,第一个堆栈元素具有空指针.然而,这种方法不是非常理想的,并且在G-Machine的"Push n"操作的情况下,它将具有O(n)的复杂度而不是优选的O(1).其他想法可能是分配整块内存而不是单个单元.

我的问题是你是否看到了解决问题的更好/不同方式.

aug*_*tss 9

不要做链表堆栈,这太疯狂了.使用固定内存块.你可以使用指针堆栈和非指针堆栈,而指针我指的是指向堆的东西.然后很容易进行垃圾收集,因为所有的GC根都在指针堆栈上.

在LLVM寄存器中保留一些内容:堆指针,堆限制指针,两个堆栈指针.

如果幸运的话,LLVM优化器会将低效的堆栈操作转换为高效的寄存器操作.