将G-Machine源代码翻译成LLVM IR

7
我正在使用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)。另一个想法可能是分配整个内存块而不是单个单元格。
我的问题是,您是否看到解决我的问题的更好/不同的方法。

1
有没有不实现STG机器的原因呢?不用说,已经有一个从STG到LLVM的编译器了,你可以参考一下。 - SK-logic
1
嗯,G机器很好而且简单。它是一个经典。 - augustss
2个回答

10

不要使用链表来实现栈,这太疯狂了。使用固定的内存块。您可以使用指针栈和非指针栈,其中指针是指指向堆内存的东西。然后,进行垃圾回收就很容易,因为所有GC根都在指针栈上。

保持一些LLVM寄存器中: 堆指针、堆限制指针、两个栈指针。

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


4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接