语言 class 可编译为无堆运行时
Language class compilable to heapless runtime
所以在一般情况下,程序会同时使用堆栈(自动管理)和堆(垃圾收集或手动管理)中的内存。
有哪些 class 程序可以编译为仅以类似堆栈的方式使用内存而不进行堆分配?它仍然是图灵完备的,但有一些其他的权衡(例如代码爆炸)还是一种较弱的语言class?
如果堆栈是指只能在顶部访问的抽象数据类型,那么您正在查看 pushdown automata。确定性 PDA 只能处理确定性上下文无关语言,非确定性 PDA 所有上下文无关语言,因此它们不是图灵完备的。
然而,在真实的计算机体系结构中"stack"并不是这样的。
分配和释放内存以后进先出的方式发生,但所有分配的内存都是随机访问的,因此这种无界堆栈将与任何 RAM 一样图灵完备。当然,任何实际操作系统中的堆栈都是固定大小的,但是不受字大小和虚拟内存的限制,它可以设置为任意大,所以如果你调用一台具有堆分配图灵完备的计算机,你不应该无法将此机器称为图灵完备。
事实上,一些region systems非常接近这种方法。区域在概念层面上不同于堆栈分配,但当区域嵌套时 (letregion ρ in ...
),它们有效地遵守堆栈规则。 (纯)区域系统的常见问题是内部碎片:只有当区域中的所有对象都已死亡时,区域才能被释放,这会导致某些程序的内存需求大大增加。所以没有代码爆炸,但内存爆炸。
最后,即使该语言只提供了一个堆栈,获得一个 "heap" 也很简单,只需从堆栈中分配一个大字节数组并在其上实现您自己的更灵活的内存管理。毕竟,这就是所有其他堆所做的。
所以在一般情况下,程序会同时使用堆栈(自动管理)和堆(垃圾收集或手动管理)中的内存。
有哪些 class 程序可以编译为仅以类似堆栈的方式使用内存而不进行堆分配?它仍然是图灵完备的,但有一些其他的权衡(例如代码爆炸)还是一种较弱的语言class?
如果堆栈是指只能在顶部访问的抽象数据类型,那么您正在查看 pushdown automata。确定性 PDA 只能处理确定性上下文无关语言,非确定性 PDA 所有上下文无关语言,因此它们不是图灵完备的。
然而,在真实的计算机体系结构中"stack"并不是这样的。 分配和释放内存以后进先出的方式发生,但所有分配的内存都是随机访问的,因此这种无界堆栈将与任何 RAM 一样图灵完备。当然,任何实际操作系统中的堆栈都是固定大小的,但是不受字大小和虚拟内存的限制,它可以设置为任意大,所以如果你调用一台具有堆分配图灵完备的计算机,你不应该无法将此机器称为图灵完备。
事实上,一些region systems非常接近这种方法。区域在概念层面上不同于堆栈分配,但当区域嵌套时 (letregion ρ in ...
),它们有效地遵守堆栈规则。 (纯)区域系统的常见问题是内部碎片:只有当区域中的所有对象都已死亡时,区域才能被释放,这会导致某些程序的内存需求大大增加。所以没有代码爆炸,但内存爆炸。
最后,即使该语言只提供了一个堆栈,获得一个 "heap" 也很简单,只需从堆栈中分配一个大字节数组并在其上实现您自己的更灵活的内存管理。毕竟,这就是所有其他堆所做的。