根据维基百科,从λ演算到组合逻辑的转换是微不足道的。串联式编程语言可以仅依赖堆栈进行内存分配。
那么,GHC为什么不将Haskell转换为串联式编程语言,如组合逻辑,然后简单地为所有内容使用堆栈分配呢?
这种转换是否可行,从而消除对Haskell和OCaml等语言的垃圾回收?这样做有哪些缺点?
根据维基百科,从λ演算到组合逻辑的转换是微不足道的。串联式编程语言可以仅依赖堆栈进行内存分配。
那么,GHC为什么不将Haskell转换为串联式编程语言,如组合逻辑,然后简单地为所有内容使用堆栈分配呢?
这种转换是否可行,从而消除对Haskell和OCaml等语言的垃圾回收?这样做有哪些缺点?
我无法在评论中表达所有想法,所以我在这里写下它们。
基于堆栈的分配语言并没有什么神奇之处。你仍然需要知道何时你的数据是相关的,并在不需要它们时将其删除。
想象一下你有一个单独的堆栈,你的函数可以控制它推入和弹出数据。首先,现在没有自动内存管理了,即函数终止后数据不会被自动释放。其次,如果你的函数分配了一些内存,以支持例如列表计算等操作,那么所有这些东西都会与要返回的列表混杂在一起。你没有机会释放未使用的内存(其他列表、树等),因为你只有推入和弹出操作。如果你有其他操作,那么堆和堆栈有什么区别呢?
多个堆栈怎么样?
你需要在某个地方分配它们,管理它们的增长并有时将它们取回。那些堆栈是你需要手动管理的单独结构。没有自动内存管理。
基于堆栈的语言还好,但是忘记了大量使用“从某处获取内存”和“将内存放回”的概念发明的算法,例如哈希映射、红黑树和链表。当然,我们可以在堆栈上分配所有这些结构体,但如果它们不再需要,我们无法释放它们的部分。
那么“平凡”的λ演算转换成图灵机呢?
当然,如果你的资源是无限的,那就很平凡。数学理论并没有阐明这种转换的时间和内存复杂度,它只证明了这两个模型是等价的,我们可以用图灵机说出λ演算所能表达的一切,反之亦然。但不能保证它可以在现实生活中的限制下工作。
C
具有堆分配,但没有垃圾回收器。因此,这个答案完全忽略了问题,问题并不是询问是否需要堆,而是询问是否(或为什么)需要垃圾回收。 - Holger