编程语言中尾递归的检测

Detection of tail recursion in programming langs

问题有部分答案 here and here,这似乎隐含地暗示 javascript 和 python 导致 'infinite recursion'。

背景

最近我一直在涉足尾递归,据我目前的理解,编程风格(*通常)具有等效迭代解决方案的性能优势和可读性 - 本质上使其成为最好的两个世界。

例子

我注意到,如果要在 .NET 或 Java 中执行此操作:

while(true) {...}

最终 Windows 会弹出一个对话框,允许机器用户更改上述可执行文件的状态:

问题

由于尾递归(*实际上)不必在这里处理 Whosebug 异常,我是否错误地假设 Java 或 C# 会:

  1. 触发"Foo.exe not responding"对话框
  2. 导致无限递归

此外,我假设此运行时 'exception' 将由语言的解释器处理是正确的吗?

Since tail recursion (*practically) doesn't have to deal with the Whosebug exception here, am I incorrect to assume that Java or C# would either ...

这包含一个不正确的假设。

尾递归只是源代码中的一种模式。

尾递归优化将递归代码变成了迭代代码......在幕后。需要编译器进行优化1.

当前一代 Hotspot 实现中的 Java 编译器(字节码和 JIT)进行尾递归优化。这有与安全相关的原因。


但忽略了:

Am I incorrect to assume that Java or C# would either:

  1. Trigger the "Foo.exe not responding" dialog
  2. Result in infinite recursion

还有第三种情况。它可能会进入无限循环 而不会 触发 "not responding" 警报。我的理解是,只有当 OS 检测到应用程序在特定秒数内没有 "consumed" 或 "responded to" 未决 GUI 事件时才会显示该警报。

我希望在以下情况下出现第三种情况:

  • 测试应用程序没有 GUI
  • 测试应用程序不运行事件线程上的递归测试
  • 用户未尝试以任何方式与测试应用程序 GUI 交互

Additionally, I am correct in assuming that this runtime 'exception' would be handled by the language's interpreter?

如果 Java 中有 "stack overflow" 事件,那么 JVM 运行time 会将它变成 WhosebugError 异常。是解释器还是 "something else" 执行此操作取决于......代码当时是否正在被解释。

应用程序本身抛出异常 "handle" ... 或忽略。


1 - 为了学究气,您可以在源代码级别手动执行优化,但是您的源代码不是递归的...