所以我以前读过很多次,从技术上讲,.NET确实支持尾调用优化(TCO),因为它有相应的操作码,只是C#没有生成它。
我不确定为什么需要一个操作码来实现TCO或者它会做什么。据我所知,能够进行TCO的要求是递归调用的结果不与当前函数作用域中的任何变量结合。如果你没有这个要求,那么我不明白一个操作码如何使你无需保留堆栈帧。如果您具备该要求,那么编译器是否总是可以将其轻松编译成迭代形式?
那么操作码的作用是什么呢?显然我缺少了一些知识。在可能进行TCO的情况下,编译器不总是可以在编译时处理,而不是操作码级别上处理吗?有哪些例外呢?