主要问题:我认为尾部调用优化(TCO)最重要的应用是将递归调用转换为循环(在递归调用具有特定形式的情况下)。更准确地说,当翻译成机器语言时,这通常会翻译成某种类型的跳转。一些编译为本机代码(例如SBCL)的Common Lisp和Scheme编译器可以识别尾递归代码并执行此转换。基于JVM的Lisp,比如Clojure和ABCL,很难做到这一点。JVM作为一台机器,是什么阻止或使这一点变得困难的?我还是不明白。显然,JVM在循环方面没有问题。编译器必须弄清楚如何实现TCO,而不是它编译到的机器。
相关问题: Clojure可以将看似递归的代码转换为循环:如果程序员将对函数的尾部调用替换为关键字recur
,它的行为就像是在执行总体拥有成本。但是,如果可以让编译器识别尾部调用--例如,SBCL和CCL就是这样做的--那么为什么Clojure编译器不能弄清楚,它应该像处理recur
一样处理尾部调用
(对不起--这无疑是一个常见问题,我确信上面的评论表明我的无知,但我没有成功地找到前面的问题。)
https://stackoverflow.com/questions/19462314
复制相似问题