为什么 .NET/C# 不优化尾调用递归?

2024-04-26

I found 这个问题 https://stackoverflow.com/questions/340762/which-languages-support-tail-recursion-optimization关于哪些语言优化尾递归。为什么 C# 尽可能不优化尾递归?

对于具体情况,为什么不将此方法优化为循环(Visual Studio 2008 http://en.wikipedia.org/wiki/Microsoft_Visual_Studio#Visual_Studio_200832 位,如果重要的话)?:

private static void Foo(int i)
{
    if (i == 1000000)
        return;

    if (i % 100 == 0)
        Console.WriteLine(i);

    Foo(i+1);
}

JIT 编译是一种棘手的平衡行为,既不花太多时间进行编译阶段(从而大大减慢短期应用程序的速度),又不进行足够的分析以通过标准提前编译保持应用程序的长期竞争力。 。

有趣的是NGen https://en.wikipedia.org/wiki/Native_Image_Generator编译步骤并不是为了更积极地进行优化。我怀疑这是因为他们根本不希望出现错误,其中行为取决于 JIT 还是 NGen 是否负责机器代码。

The CLR https://en.wikipedia.org/wiki/Common_Language_Runtime本身确实支持尾调用优化,但是特定语言的编译器必须知道如何生成相关的opcode https://learn.microsoft.com/en-us/previous-versions/windows/silverlight/dotnet-windows-silverlight/56c08k0k(v=vs.95)?redirectedfrom=MSDNJIT 必须愿意尊重它。F#'s https://en.wikipedia.org/wiki/F_Sharp_(programming_language)fsc 将生成相关的操作码(尽管对于简单的递归,它可能只是将整个事情转换为while直接循环)。 C# 的 csc 没有。

See 这篇博文 https://learn.microsoft.com/en-us/archive/blogs/davbr/一些细节(考虑到最近的 JIT 变化,现在很可能已经过时了)。请注意,4.0 中的 CLR 发生了变化x86、x64 和 ia64 将尊重它 https://learn.microsoft.com/en-us/archive/blogs/clrcodegeneration/tail-call-improvements-in-net-framework-4.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 .NET/C# 不优化尾调用递归? 的相关文章

随机推荐

  • 如何从 FinalBuilder 输出将被 TeamCity 捕获的消息?

    我正在运行 TeamCity Professional 4 5 3 和 FinalBuilder Pro 6 TeamCity 使用命令行任务运行 FinalBuilder 项目 如何让 FinalBuilder 将消息打印到构建日志中 以
  • 如何限制素材输入中的特殊字符

    我有一个材料输入控件 我在用户输入时限制了特殊字符 但是当在任何编辑器中键入一些单词并复制并粘贴带有特殊字符的单词时 这是不起作用的 我已经为此编写了指令以防止特殊字符 但是可以在复制粘贴中提供更好的解决方案限制 应用程序组件 html
  • 强连通分量有什么用?

    我发现了几种可以解释的算法how在有向图中找到强连通分量 但没有解释why你会想要这样做 强连通分量有哪些应用 您应该查看 Coursera 上 Tim Roughgarden 的算法简介课程 对于他所讨论的每一种算法 他都会解释其一些应用
  • 使用 Active Directory 验证 Sharepoint?

    只需要找到一种简单的方法来让 AD 进行身份验证作为 Sharepoint 站点的登录名 这相当快速和简单地开始吗 Thanks 对于 SharePoint 2007 请参阅此article http technet microsoft c
  • 更改 R 中函数的默认参数

    我正在跟进这个答案 https stackoverflow com a 62946040 7223434 我想知道是否有办法设置参数的默认值rug to FALSE和论证multiline to TRUE在生成的图中library effe
  • 在 :before 和 :after 上为每个元素声明“content”属性是否会带来巨大的性能问题?

    您可能知道 如果您愿意使用 before and or after伪元素没有在其中设置文本 您仍然需要声明content 使它们可见 我刚刚将以下内容添加到我的基本样式表中 before after content 所以我不必再进一步声明了
  • 移动设备上的全屏画布

    我创建了一个小型画布游戏 希望它能够在 PC 和移动设备上运行 在 PC 上 画布区域可以按预期工作 但在为移动设备设计时就会出现问题 有没有一种方法 CSS 或 javascript 可以让用户双击网站内的画布区域时变成全屏 除非画布足够
  • 如何有效地使用 python 中的空数据填充文件?

    我需要创建不包含数据的任意大小的文件 它们可能相当大 虽然我可以循环遍历并写入一个空字符 直到达到文件大小 但这看起来很难看 with open filename wb as f what goes here 执行此操作的有效 Python
  • 如何获取特定CSS列的内容

    对不起我的英语不好 我正在使用 css 多列布局 有没有办法获取特定列的内容 或者如何找到分隔列的字符串的索引 div class foo div
  • 读取列标题中具有多个分隔符的文件并在末尾跳过一些行

    我是新来的Python我想用pandas用于读取数据 我已经做了一些搜索和努力来解决我的问题 但我仍然在挣扎 提前感谢您的帮助 我有一个如下所示的 txt 文件 skip1 A1 A2 A3 A4 A5 A6 A7 A8 A9 1 2 3
  • 在 SIMD 操作上下文中,非压缩指令和压缩指令有什么区别?

    在 SIMD 操作上下文中 非压缩指令和压缩指令有什么区别 我正在阅读一篇关于优化 SSE 代码的文章 http www cortstratton org articles OptimizingForSSE php batch http w
  • M1 MacBook Pro 上的 Android Studio 无法使用 ABI armeabi-v7a 模拟系统映像

    我的 M1 Macbook Pro 上的 Android Studio 可以很好地模拟 ABI arm64 v8a 的所有系统映像 API 24 29 30 31 但是 它无法使用 ABI armeabi v7a 运行所有映像 例如 API
  • 使用 jquery 从 html 表格生成 Excel 工作表

    我想在用户单击按钮后生成 Excel 工作表 基本上我想做的正是这里讨论的 如何将 html 表格值传递到 Excel 工作表单元格 https stackoverflow com questions 6517106 how to pass
  • 电源外壳。编辑字符串使其成为驼峰命名法和帕斯卡命名法

    我的目标是知道这种文本如何 var1 my name is 转换为驼峰命名法 myNameIs 还有这个类型 var2 my Name is 转换为帕斯卡命名法 MyNameIs 不知道该怎么做 您可能会使用 NETTextInfo ToT
  • “子查询返回超过 1 个值”错误

    SELECT schoolname AS combinationschools CASE WHEN schoolname LIKE THEN SELECT value FROM dbo Split 6 9E 9M END AS school
  • 将字母与空格字符异或

    为什么将任何字母与空格字符进行异或会改变字母的大小写 是否有历史原因 即 a 异或 A F 异或 f 等 或者这只是巧合 假设字符是 ASCII 或 unicode 编码的 我确信通过改变一个位就可以改变这种情况是故意的 这将使早期的软件更
  • 将 const char* 转换为 NSString * 并转换回来 - _NSAutoreleaseNoPool()

    我正在尝试将 const char 转换为 NSString 然后将其转换回来 它有效 但我得到 NSAutoreleaseNoPool Object 0x100550a40 of class NSCFArray autoreleased
  • iOS6 中 UIButton 不显示文本

    我正在使用 iOS6 和 Xcode 4 5 我遇到了一些 UI 问题UIButton 一些按钮标题没有显示在我的视图中 在旧版本的 iOS 中 一切都按预期运行 请看下图 在模拟器上执行时不显示文本 按钮 我有一个类似的案例 我刚刚解决了
  • Pod 副本如何相互同步 - Kubernetes?

    我有一个带有 3 个副本的 MySQL 数据库 Pod 现在我正在一个 Pod 中进行一些更改 Pod 数据 而不是 Pod 配置 假设我要添加一张表 该更改将如何影响 Pod 的其他副本 我正在使用带有 3 个工作节点的 kubernet
  • 为什么 .NET/C# 不优化尾调用递归?

    I found 这个问题 https stackoverflow com questions 340762 which languages support tail recursion optimization关于哪些语言优化尾递归 为什么