【发布时间】:2017-01-07 03:29:51
【问题描述】:
我正在开发这个工具,用户可以在其中定义并包含在 [config files |内容文本文件 |等]他们自己的“模板”(如小胡子等),这些可以引用其他人,所以他们可以诱导一个循环。就在我正要创建“最大循环”设置时,我用 runghc 意识到程序在一段时间后就退出了,只有<<loop>> 的告别消息。这对我来说实际上已经足够了,但引发了一些思考:
GHC 或运行时如何实际检测到它卡在一个循环中,它如何区分想要的长时间运行的操作和意外的无限循环?停止问题仍然是我上次检查的问题..
可以为编译器或运行时自定义设置的任何(时间或迭代)限制?
这是
runghc-only 还是存在于所有最终编译输出中?当构建版本禁用此明显的内置循环检测时,任何
-o(优化)标志是否会设置得更晚?
所有的东西我当然可以通过困难的方式弄清楚,但谁知道也许有人已经更详细地研究了这个..(对于"haskell" "<<loop>>" 很难用 google/ddg 搜索,因为它们会去掉尖括号,然后显示结果“如何在 Haskell 中循环”等)
【问题讨论】:
-
搜索 ghc loop 会得到一些相关结果,包括 Haskell program outputs `<<loop>>` 和 this Haskell Cafe message。
-
尽管存在停止问题,但显然可以在有限数量的情况下检测到非终止(即证明程序未终止或在有限数量的时间是可能的)。简而言之,
<<loop>>表示 GHC 在简化后找到了let x = x in x形式的表达式,并将其重写为throw ..其中..是一个特殊异常,它会产生您在评估时看到的消息 - 我不记得了这个异常叫什么,但你可能没有捕捉到它。 -
@user2407038 我不相信这是真的。我很确定
<<loop>>检测完全是在运行时进行的,它会根据自身检测值的任何情况,而不仅仅是被简单地定义为自身。 -
AFAIK GHC 在评估一个 thunk 时,只要发现它必须评估相同的 thunk 才能获得一个值,就会引发
<<loop>>。这比@user2407038 描述的更笼统。可以捕获许多未终止的情况,停止问题只是说我们无法捕获所有。