Compiler construction 是否有使用严格计算的Haskell编译器或预处理器?

Compiler construction 是否有使用严格计算的Haskell编译器或预处理器?,compiler-construction,haskell,lazy-evaluation,Compiler Construction,Haskell,Lazy Evaluation,我正在寻找一个Haskell编译器,它在默认情况下使用严格求值,而不是惰性求值。我只想使用OCaml,但是Haskell的语法比OCaml好得多(Haskell是纯的,并且有很酷的特性,比如类型类) 我真的不想经常放s和$在我的程序中到处都是。一个带有开关或预处理器的编译器来加入严格性注释会非常好。如果有一种方法可以在某些地方使用惰性评估,这也会很有帮助,以防我想要一个无限列表(我可能永远不会) 请不要试图说服我,懒惰的评估是更好的,我真的需要性能。IIRC,Simon Peyton Jones

我正在寻找一个Haskell编译器,它在默认情况下使用严格求值,而不是惰性求值。我只想使用OCaml,但是Haskell的语法比OCaml好得多(Haskell是纯的,并且有很酷的特性,比如类型类)

我真的不想经常放
s和
$在我的程序中到处都是。一个带有开关或预处理器的编译器来加入严格性注释会非常好。如果有一种方法可以在某些地方使用惰性评估,这也会很有帮助,以防我想要一个无限列表(我可能永远不会)


请不要试图说服我,懒惰的评估是更好的,我真的需要性能。IIRC,Simon Peyton Jones甚至说,懒惰的评估其实没有必要,它主要是为了防止他们让语言变得不纯洁。

过去有两次尝试严格评估Haskell:

  • 简·威廉·梅森酒店
  • 博士论文
但他们都专注于坚持Haskell的非严格语义,但使用了一种更严格的评估策略,而不是实际更改语义,而且两人都没有真正看到曙光


编辑:Martijn关于strict plugin的建议看起来非常适合您的目的,因为它实际上做了您想要的事情,而且作者仍然活跃在Haskell社区,我已经忘记了。

我认为Jan Willem Maessan的是/是严格的。下一个最接近的是罗伯特·恩纳尔(Robert Ennal)对ghc 5的推测性评估。spec_eval fork不是严格的,而是乐观的评估。我不知道它们是否仍然是最新的/可用的/等等。

另请参见中描述的示例

我真的不想经常放!s和美元!这都是我的节目


你做错了,如果你是这样编写Haskell:)你根本不需要这样做。使用GHC,使用-O2,适当时使用严格的数据类型,适当时使用惰性数据类型。不要以为懒惰会成为一个问题——它可以解决很多问题。

我感觉到你的痛苦。在我的日常编程中,我最大的心得就是处理这些!@$%^&(空间泄漏

然而,如果它有帮助的话,随着时间的推移,你确实学会了(艰难的方式)如何处理这个问题,而且它确实会变得更好。但我仍然在等待安迪·吉尔拿出他的神奇的空间泄漏探查器来解决我的所有问题。(我在上一次ICFP上向我发表了他的即席评论,他提出了这个很酷的想法,作为实现它的承诺。)

我不会试图让你相信惰性评估是世界上最好的东西,但它有一些优点。我有一些流处理程序,可以通过各种组合器快速生成惰性列表,这些组合器可以在千兆字节的数据上愉快地运行,同时只使用3.5 MB左右的内存(其中超过2MB的是GHC运行时).去年,一位比我聪明的人向我指出,作为一名典型的Haskell程序员,你会非常惊讶地发现,你在多大程度上依赖于懒惰的评估

但我们真正需要的是一本关于在现实世界中处理懒惰评估的好书(这与学术界没有太大区别,真的,除了他们根本没有发表论文,而且我们的客户拿着刀子追我们)这将适当地涵盖与此相关的大多数问题,更重要的是,让我们直观地了解什么会使我们的堆爆炸,什么不会爆炸


我不认为这是一件新鲜事;我相信其他语言和体系结构也经历过这种情况。毕竟,第一批程序员是如何处理硬件堆栈和所有这些问题的?我敢打赌,不太好。

如果你有一个Haskell编译器,它使用严格的计算,它不会编译Haskell。懒惰和不严格是它的一部分哈斯克尔规范

然而,还有其他选择

  • 试图创建Haskell的显式惰性变体,该变体支持破坏性更新,同时保留Haskell的所有其他优点。有一个问题:编译器目前仅处于α阶段,尽管它似乎至少可用

  • 学习使用Haskell“正确的方法”。如果你能将你的测试用例简化为可以公开显示的东西,你可以把它发布在网站上,人们可以在那里对这些关于不严格的影响的问题提供帮助


在任何地方使用nfdata和rnf都不是解决方案,因为这意味着重复遍历已经评估过的大型结构


Ben Lippmeier博士论文的导论章节(关于DDC)这是我见过的对哈斯克尔最好的批评——它讨论了懒惰、破坏性更新、monad transformers等问题。DDC有懒惰,但你必须明确要求它,它被认为是一种效果,由DDC的类型和效果系统跟踪和管理。

你显然已经决定了严格ev的价值评估,但我认为您缺少了使用Haskell的要点。Haskell的惰性评估允许编译器/解释器采用更灵活的优化策略。强制自己的严格性会覆盖优化器。最终,使用过度严格的评估将永远不会像自动优化那样有效。Try是GHCI中一个数字序列的折叠和,有惰性求值和没有惰性求值。你可以非常清楚地看到区别——在这种情况下,惰性求值总是更快。

我最近在这方面看到了一些工作:

您可以在SPJ的GHC状态更新中听到一些关于它的信息:

(链接从9点33分的相关片段开始)

还有一个,它的目标是在频谱的中间

Seqaid是一个GHC插件,提供非i