Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Language agnostic 多个返回值的高效实现?_Language Agnostic_Programming Languages_Language Design - Fatal编程技术网

Language agnostic 多个返回值的高效实现?

Language agnostic 多个返回值的高效实现?,language-agnostic,programming-languages,language-design,Language Agnostic,Programming Languages,Language Design,是否有可能高效地实现(几乎没有运行时开销)返回多个值/元组类型的函数 在类似C的语言中,如下所示: int, float f(int a) { return a*2 , a / 2; } 很少有静态编译语言会这样做,这是有原因的吗?如果元组不适合单个寄存器(最有可能是32位或64位,取决于您的体系结构),那么在实现这一点时将涉及实际分配(最有可能是在堆上) 也就是说,很少有语言允许这种风格的原因不太可能与性能相关,也不太可能与语言中的风格相关(也就是说,有其他惯用方法实现同样的功能,例如返

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

在类似C的语言中,如下所示:

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

很少有静态编译语言会这样做,这是有原因的吗?

如果元组不适合单个寄存器(最有可能是32位或64位,取决于您的体系结构),那么在实现这一点时将涉及实际分配(最有可能是在堆上)

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


具有更具表现力类型系统的语言倾向于更容易以原则性的方式添加这些类型的语言功能,这就是为什么在源自ML家族的语言中,元组(以及各种其他外来生物)是第一类值的原因,只需返回一个包含这些值的
struct
。当然,与
int
不同,结果不适合寄存器,因此它的效率不如
int
返回,但如果
struct
是一个局部变量,因此分配给堆栈而不是堆,那么它仍然是有效的。

我读过的关于这个主题的最好的文章是。虽然这是关于Scheme编程语言的,但他们从低机器级别堆栈/注册表实现的角度解释了这一问题


这篇文章实际上让我认为,许多通常被认为效率低下的高级功能在高效实现方面是一个已解决的问题,而流行语言的惯性正是其中的障碍。

是的,它可能是高效的。您可能需要溢出寄存器,但这是可能的

例如,GHC实施优化,即:

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

CPR对于返回小结构(即元组、标记的并集)来说是一个巨大的胜利

更多信息:

  • 在GHC
  • 更多关于