【发布时间】:2015-01-18 12:14:45
【问题描述】:
所以I've read many times before 从技术上讲,.NET 确实支持尾调用优化 (TCO),因为它有操作码,只是 C# 不生成它。
我不确定为什么 TCO 需要操作码或它会做什么。据我所知,能够做到 TCO 的要求是递归调用的结果不与当前函数范围内的任何变量相结合。如果您没有,那么我看不到操作码如何阻止您必须保持堆栈帧打开。如果你确实有,那么编译器不能总是很容易地将它编译成迭代的东西吗?
那么操作码的意义何在?显然,我缺少一些东西。在 TCO 完全可能的情况下,难道不能总是在编译器级别而不是操作码级别处理它吗?什么是不能的例子?
【问题讨论】:
-
我没有受过教育的猜测是,这个操作码更像是从高级编译器到 JITter 的提示,因此后者 - 将快速编译作为其关键特性之一 - 是从分析 IL 以查看尾调用优化在任何给定场景中是否实际可行的潜在耗时任务中解脱出来。
标签: c# .net theory cil tail-call-optimization