大多数编程语言被设计成函数只有一个返回值是因为从本质上说,因为图灵机只有一个返回值(或者说状态)。有一个返回值就能达到图灵完备,不需要两个返回值。
一、为什么大多数编程语言被设计成函数只有一个返回值
大多数编程语言被设计成函数只有一个返回值是因为从本质上说,因为图灵机只有一个返回值(或者说状态)。有一个返回值就能达到图灵完备,不需要两个返回值。
另外,多个返回值就需要多个寄存器,既浪费又不利于编译器优化。从我们的直觉来看,你得到的两个返回值,它们一定能在某个层级上被抽象为一个东西,这在程序中的表现就是返回抽象体的指针(或引用)。
假设我们设计了一个语言叫C-,函数的参数和返回值都只能是一个,那么在C-里,一个多参数多返回值的函数的定义和使用过程就是这样的:struct Para…;//define a parameter struct
struct Ret…;//define a return struct
Ret func(Para p){
…
}
Para para = XXX;
Ret ret;
ret = func(para);为了使用这个函数,我们需要定义数据结构Para和Ret,是不是很麻烦?如果能去掉会省很多事。好了,那么问题就变成了:为什么编程语言大多去掉了Para而不是Ret?这和函数本身的行为有关。一个函数的行为如下图:<img src=”https://pic1.zhimg.com/50/76bf2b95ddf4be66f08be12f17f01568_720w.jpg?source=1940ef5c” data-rawwidth=”546″ data-rawheight=”101″ class=”origin_image zh-lightbox-thumb” width=”546″ data-original=”https://picx.zhimg.com/76bf2b95ddf4be66f08be12f17f01568_r.jpg?source=1940ef5c”/>大家看出什么问题没?参数可以看做是函数的属性,因为Para这个结构可能只在函数内使用(大多数情况下)。因此,我们为这个函数定义Para结构的行为,其实就是函数定义过程中的一个步骤。既然如此,那么把Para的定义放到函数定义里就好了嘛。把下面的代码:struct Para{
int a;
int b;
}
int func(Para p)
…变成:int func(int a, int b)
…
是不是变得简单清晰易读了?那为什么Ret的结构不放在函数定义中呢?因为Ret是函数的产出,别的地方肯定也要用。一个公用的数据结构放在函数定义里显然不是合理的设计。当然,很多情况下我们也可能会给函数传入一个自己定义的作为参数。不过这大多是因为这个数据结构本来就是要到处用的(比如用结构(x,y)来代表平面上的一个点)。一般而言,我们不会为了表达一个函数的结构,而单独地定义一个数据结构。因此参数结构就内化为了的属性。
延伸阅读:
编程语言选用原则
综合思考软件运行过程中所处的硬件环境
如果在硬件环境中。更新效率相对偏高,一旦硬件环境出现一定转变,将会使计算机编程预算无法快速地和硬件环境相迎合。使得程序编程带来一定影响。所以,程序人员在程序编程的过程中,需要对软件调整内容加以综合思考。并且注重适当地减少软件调整难度。
全面思考平台支撑性
在开展程序编程工作的过程中,应该思考应用平台给编程语言带来的影响,结合编程语言自身特性对应用平台实施科学调整,从而实现工作水平的提升,将编程语言自身作用充分发挥。
思考程序编程实际问题
在进行程序编程的过程中,综合思考上述两个问题时。还要对编程实际情况进行全面思考。所以,在进行计算机编程语言选择的过程中,要求编程人员对编程语言特性有所了解。编程人员在对特殊性软件开发过程中。应该选用较为专业的计算机编程语言.专业性编程语言能够有效提升软件开发的规范性。