语言类可编译为无堆运行时

时间:2015-03-09 03:56:46

标签: compiler-construction programming-languages computation-theory memory-model turing-complete

因此,在一般情况下,程序使用堆栈中的内存(自动管理)和堆(垃圾收集或手动管理)。

什么是可以编译为仅以类似堆栈的方式使用内存而没有堆分配的程序类?它是否仍然是图灵完全与其他一些权衡(例如代码爆炸)或它是一个较弱的语言类?

1 个答案:

答案 0 :(得分:4)

如果通过堆栈表示只能在顶部访问的抽象数据类型,那么您需要查看pushdown automata。确定性PDA只能处理确定性无上下文语言,非确定性PDA所有无上下文语言,因此它们不是图灵完备。

然而,"堆栈"在真正的计算机体系结构中并不是那样的。 分配和释放内存以LIFO方式发生,但所有分配的内存都是随机访问,因此这种无限堆栈将像任何RAM一样完整。当然,任何实际操作系统中的堆栈都是固定大小的,但是字大小和虚拟内存的限制是无关紧要的,它可以任意设置大,所以如果你调用堆分配图灵完成的计算机,你就不应该这样做。无法调用此机器图灵完成。

事实上,有些region systems非常接近这种方法。区域在概念级别与堆栈分配不同,但是当区域嵌套(letregion ρ in ...)时,它们有效地遵守堆栈规则。 (纯)区域系统的常见问题是内部碎片:只有当区域中的所有对象都死亡时才能释放区域,这导致某些程序的内存需求大大增加。所以没有代码爆炸,但内存爆炸。

最后,即使语言只提供一个堆栈,也可以获得一个"堆"就像从堆栈中分配一个大字节数组并在其上实现自己的,更灵活的内存管理一样简单。毕竟,这就是所有其他堆。