Haskell 在没有堆栈的情况下实现?

Posted

技术标签:

【中文标题】Haskell 在没有堆栈的情况下实现?【英文标题】:Haskell implemented without a stack? 【发布时间】:2011-12-30 21:59:31 【问题描述】:

来自How does a stackless language work?

Haskell (as commonly implemented) does not have a call stack; 
evaluation is based on graph reduction.

真的吗?这很有趣,因为虽然我自己从未体验过,但我读到如果你不使用严格版本的折叠函数然后强制评估无限折叠,你会得到堆栈溢出。当然,这表明存在堆栈。谁能澄清一下?

【问题讨论】:

让我道歉;我写了那个答案,有时我会编造一些听起来不错的废话​​:) 从那以后我了解到 Spineless Tagless G-machine 并不意味着 Stackless。 【参考方案1】:

我绝不是这方面的专家,但我认为您引用的答案并不完全准确。 Haskell 没有大多数命令式语言所具有的那种简单的堆栈,您可以在其中跟踪通过程序的调用路径。由于其惰性,评估基于图形缩减,您可以阅读有关 here 的信息,但调用最终仍放置在堆栈中。根据this page,“GHC 执行引擎中的“堆栈”与词法调用堆栈几乎没有相似之处。”所以是的,有一个堆栈,但它与您在命令式语言中找到的堆栈非常不同,它是使用图形缩减创建的。

【讨论】:

Because of its laziness, evaluation is based on graph reduction - 真的吗?懒惰需要减少图形吗?或者这只是 Haskell 运行时 一些 实现中的设计决策? the haskell wikibook 中有很多关于此的内容。我认为没有必要,但似乎这是最好的方法。 无堆栈haskell是否意味着不会出现堆栈溢出问题?【参考方案2】:

Haskell 不是“无堆栈”或类似的东西。从 Haskell 源代码生成的代码仍然有某种符号,并且执行会显示一些堆栈跟踪,但它们与源代码的关系非常松散。以下是有关尝试简化调试/跟踪/分析的一些信息:

http://www.haskell.org/wikiupload/9/9f/HIW2011-Talk-Marlow.pdf

【讨论】:

以上是关于Haskell 在没有堆栈的情况下实现?的主要内容,如果未能解决你的问题,请参考以下文章

安全执行不受信任的 Haskell 代码

Haskell趣学指南

工具rest:Haskell的REST开源框架

为 haskell 堆栈项目编写静态 cpp 库

用sublime text 3编译haskell

-bash: ghci: 找不到命令(Haskell 交互式 shell,Haskell 安装)