我有一个问题,当我们在基于寄存器的编译器(例如DVM)中编写递归函数时,是否会对性能造成影响?我知道在深度有限的编译器(例如python的编译器)中不建议使用递归。
答案 0 :(得分:2)
基于寄存器对递归函数没有帮助,它们仍然存在相同的问题:从概念上讲,每个调用都会创建一个新的堆栈框架。如果从字面上实现,则递归调用本质上比循环要慢一些,并且也许更重要的是,它会消耗有限的资源,因此递归深度受到限制。基于寄存器的代码表示没有操作数堆栈的概念,但是该概念与调用堆栈的概念几乎是不相交的,后者仅对于具有通用子例程仍然是必需的。如果禁止递归,则子例程可以在没有调用堆栈的情况下实现,在这种情况下,不需要重新进入子例程,因此可以静态分配局部变量和保存返回地址的变量。
通过蹦床可以快速返回到一个特殊的调用程序,然后继续调用该堆栈,从而解决了堆栈增长的问题,因为在创建新框架之前,旧框架已被释放,因此递归根本不会增加堆栈。它增加了更多的运行时开销。通过将调用重写为跳转来消除尾部调用可以达到类似的效果,但是通过重用同一帧且相关开销较少,这需要VM的显式支持。
这两种技术都同样适用于基于堆栈和基于寄存器的代码表示,顺便说一句,这主要是代码存储格式的差异,并且无需反映代码实际执行方式的差异。 :JIT编译器可以将它们两者转换为计算机所需的任何形式。