这不是 Java 问题……它是 JVM 之一。Java只是JVM语言的grand-grand-ol'-pa。
制作 TCO 是在删除当前堆栈帧的同时跳转到下一个堆栈帧,在正在运行的程序和当前堆栈调用 vars 之间应该在其他地方... ;)
最好的方法是在其他帧中为跳转调用创建一个新的特殊调用操作码,以实现这些东西。他们已经为虚拟通话做到了。解释不是问题,JIT 可能会引发其他问题,JVM 已经够臃肿了。
在Java或其他语言中,由于没有合适的TCO,另一种方式是蹦床,但它增加了很多代码。或者使用特定的例外,但这会造成很多麻烦。它在您的代码中,但不在其他人的库中......
啊! 如果 Rich Hickey 添加了(重复...)东西(它不是函数),那是因为缺乏真正的 TCO,他不希望人们认为有一个。他可以很容易地在内部追尾电话中进行自动 TCO。它还有助于检测不在尾部位置的不良尾部调用。
还有一个用于外部 TCO 的(蹦床......)东西,但它很乱(作为蹦床),并且除了在糟糕的堆栈情况下完全不使用。
但是,是的,很多 VM 管理 TCO。我听说CLR会。我什至见过一个付费的 JVM 来管理它(前段时间,不记得了……)
js中的蹦床示例:https ://codeinjavascript.com/2020/06/13/tail-call-optimization-tco/
一篇关于 HotSpot VM 上的 TCO 的旧论文,带有帧覆盖:https ://ssw.jku.at/Research/Papers/Schwaighofer09Master/schwaighofer09master.pdf