为什么有些语言会区分返回值的方法和不返回值的方法?
即在Oracle的PL/SQL中,函数和过程之间的主要区别在于函数必须返回一个值,而过程不能.
同样对于那些没有的语言,为什么不呢?
编辑:我发现了一个相关的问题,人们可能会对阅读这个问题感兴趣:
表达与陈述
RBarryYoung.. 26
因为在最初的计算机科学理论和实践概念中,函数和子程序几乎没有任何关系.
FORTRAN通常被认为是实现这两者的第一语言,并证明了区别.(早期的LISP在这方面也有一些相反的作用,但它在学术界之外几乎没有影响).
根据数学传统(CS仍然是60年代的一部分),函数仅被视为参数化数学计算的封装,仅用于将值返回到更大的表达式.你可以称之为"裸"(F = AZIMUTH(SECONDS))仅仅是一个微不足道的用例.
另一方面,子程序被视为命名一组意图产生一些效果的语句的方法.参数极大地提高了它们的可用性,并且允许它们返回修改后的参数值的唯一原因是它们可以报告它们的状态而不必依赖全局变量.
因此,除了封装和参数之外,它们实际上没有概念上的联系.
真正的问题是:"这么多开发人员是如何看待它们一样的?"
答案就是C.
当K + R最初为PDP-11设计他们的高级宏汇编程序类型语言时(可能已经开始使用PDP-8?),他们没有硬件独立性的妄想.实际上,该语言的每个"独特"功能都反映了PDP机器语言和架构(参见i ++和--i).其中之一是实现功能和子程序可以(并且始终是)在PDP中相同地实现,除了调用者忽略了子程序的返回值(在R0 [,R1]中).
因此诞生了void指针,并且在C语言接管了整个编程世界之后,对这个HW/OS实现工件(尽管在几乎每个后续平台上都是正确的)的误解与语言语义相同.
因为在最初的计算机科学理论和实践概念中,函数和子程序几乎没有任何关系.
FORTRAN通常被认为是实现这两者的第一语言,并证明了区别.(早期的LISP在这方面也有一些相反的作用,但它在学术界之外几乎没有影响).
根据数学传统(CS仍然是60年代的一部分),函数仅被视为参数化数学计算的封装,仅用于将值返回到更大的表达式.你可以称之为"裸"(F = AZIMUTH(SECONDS))仅仅是一个微不足道的用例.
另一方面,子程序被视为命名一组意图产生一些效果的语句的方法.参数极大地提高了它们的可用性,并且允许它们返回修改后的参数值的唯一原因是它们可以报告它们的状态而不必依赖全局变量.
因此,除了封装和参数之外,它们实际上没有概念上的联系.
真正的问题是:"这么多开发人员是如何看待它们一样的?"
答案就是C.
当K + R最初为PDP-11设计他们的高级宏汇编程序类型语言时(可能已经开始使用PDP-8?),他们没有硬件独立性的妄想.实际上,该语言的每个"独特"功能都反映了PDP机器语言和架构(参见i ++和--i).其中之一是实现功能和子程序可以(并且始终是)在PDP中相同地实现,除了调用者忽略了子程序的返回值(在R0 [,R1]中).
因此诞生了void指针,并且在C语言接管了整个编程世界之后,对这个HW/OS实现工件(尽管在几乎每个后续平台上都是正确的)的误解与语言语义相同.