多个返回值的有效实现?

时间:2014-07-08 03:07:37

标签: language-agnostic programming-languages language-design

是否可以有效地实现(几乎没有运行时开销)返回多个vales /元组类型的函数?

用类似C语言的东西:

int, float f(int a) {
  return a*2 , a / 2;
}

为什么很少有静态编译的语言可以做到这一点?

4 个答案:

答案 0 :(得分:3)

是的,它可以很有效率。您可能需要泄漏寄存器,但这是可能的。

例如,GHC实现了"constructed product return"优化,即:

  

确定函数何时可以在寄存器中有效地返回多个结果。分析仅基于函数的定义,而不是基于其用途(因此可以轻松支持单独编译),分析结果可以通过单独转换函数定义来表示。

CPR对于返回小型结构(即元组,标记的工会)来说是一个巨大的胜利。

更多信息:

答案 1 :(得分:2)

我已经阅读的关于此主题的最佳论文是An Efficient Implementation of Multiple Return Values in Scheme (PDF)。虽然它是关于Scheme编程语言的,但它们用低机器级堆栈/注册表实现来解释这个问题。

这篇文章实际上让我觉得许多通常认为效率低下的高级功能是有效实现的解决问题,只是流行语言的惯性阻碍了。

答案 2 :(得分:1)

如果你的元组不适合单个寄存器(32位或64位,具体取决于你的架构,那么很可能),那么实现这个就会有实际的分配(最有可能在堆上)。

也就是说,很少有语言允许这种风格的原因不太可能与性能有关,因为它可能与语言中的风格问题有关(也就是说,有其他惯用的方法来实现同样的事情,例如作为返回结构)。在语言中引入新的原语可能很笨拙并引入不一致。例如,如果元组成为一等值,我可以在任何地方使用它们吗?我如何访问它们?我们是否强制执行不变性?我如何分配或取消分配它们?

具有更具表现力的类型系统的语言往往使得以原则方式添加这些语言特征变得更容易,这就是为什么你会发现元组(以及各种其他奇异生物)作为语言中的一流值的原因来自ML家族(以及其他人)。

答案 3 :(得分:0)

在C中,只需返回保存值的struct即可。当然,与int不同,结果不适合寄存器,因此它不如int返回有效,但如果{{1}它仍然有效是一个局部变量,因此在堆栈而不是堆上分配。