language-agnostic - 为什么要区分返回值的方法和不返回值的方法?

标签 language-agnostic programming-languages language-design

为什么有些语言会区分返回值的方法和不返回值的方法?

即在 Oracle 的 PL/SQL 中,函数和过程之间的主要区别在于函数必须返回一个值,而过程则不能。

同样对于没有的语言,为什么不呢?

编辑:我发现了一个相关的问题,阅读这个问题的人可能会感兴趣:

  • Expression Versus Statement
  • 最佳答案

    因为在计算机科学理论和实践的原始概念中,函数和子程序几乎没有任何关系。

    FORTRAN 通常被认为是第一种实现了这两种语言并展示了区别的语言。 (早期的 LISP 在这方面也有一些相反的作用,但它在学术界之外几乎没有影响)。

    遵循数学传统(CS 在 60 年代仍然是其一部分),函数仅被视为参数化数学计算的封装,仅用于将值返回到更大的表达式中。你可以称之为“裸”(F = AZIMUTH(SECONDS))只是一个微不足道的用例。

    另一方面,子例程被视为一种命名一组旨在产生某种效果的语句的方式。参数极大地提高了它们的可用性,允许它们返回修改后的参数值的唯一原因是它们可以报告其状态而不必依赖全局变量。

    所以,除了封装和参数之外,它们真的没有概念上的联系。

    真正的问题是:“怎么会有这么多开发者认为它们是一样的?”

    答案是 C。

    当 K+R 最初为 PDP-11 设计他们的高级宏汇编类型语言时(可能是从 PDP-8 开始的?),他们没有硬件独立性的幻想。实际上,该语言的每个“独特”功能都反射(reflect)了 PDP 机器语言和体系结构(请参阅 i++ 和 --i)。其中之一是认识到函数和子例程在 PDP 中实现相同,只是调用者只是忽略了子例程的返回值(在 R0 [, R1] 中)。

    空指针就这样诞生了,在 C 语言接管了整个编程世界之后,随之而来的误解是这个 HW/OS 实现工件(尽管几乎在每个后续平台上都是如此)与语言语义相同。

    关于language-agnostic - 为什么要区分返回值的方法和不返回值的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1018281/

    相关文章:

    sql - 何时在 ORM 中使用复合主键模型进行 INSERT 或 UPDATE?

    计算相交盘数的算法

    language-agnostic - TRUE是否始终具有非零值?

    parsing - 为什么这个表达式没有被正确解析?

    programming-languages - x>y && z==5 - 这个表达式的部分是如何调用的?

    java - 为什么 Java 数组不可扩展?

    language-design - 高级项目的语言好用吗?

    performance - 十六进制编码或base64编码哪个更快?

    c - C中各种const声明的区别

    php - 在 PHP 中使用 $this 和 self::有什么意义?