Language agnostic 为什么要区分返回值的方法和不返回值的方法;T

Language agnostic 为什么要区分返回值的方法和不返回值的方法;T,language-agnostic,programming-languages,language-design,Language Agnostic,Programming Languages,Language Design,为什么有些语言区分返回值的方法和不返回值的方法 i、 在Oracle的PL/SQL中,函数和过程之间的主要区别在于函数必须返回值,而过程不能返回值 同样地,对于不需要的语言,为什么不呢 编辑:我发现了一个相关的问题,阅读此问题的人可能会感兴趣: 在纯效果或效果类型的设置中存在着巨大的差异,因为“不返回任何内容”的方法显然只对其副作用有用 这类似于表达式和语句之间的区别,它可以分离一种语言并消除一类通常错误的程序(当然,这就是为什么C不这么做;) 举一个小例子,当您清楚地区分表达式和语句时,

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

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

同样地,对于不需要的语言,为什么不呢


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


在纯效果或效果类型的设置中存在着巨大的差异,因为“不返回任何内容”的方法显然只对其副作用有用

这类似于表达式和语句之间的区别,它可以分离一种语言并消除一类通常错误的程序(当然,这就是为什么C不这么做;)

举一个小例子,当您清楚地区分表达式和语句时,
if(x=3)
,而不是
if(x==3)
在语法上是不正确的(用于在需要表达式的地方使用语句),而不仅仅是类型错误(用于在需要布尔值的地方使用整数)。这样做的好处是,在赋值为具有右操作数值的表达式的上下文中,基于类型的规则允许
if(x=true)

在使用单子封装效果的语言中,重要的区别在于:

  • 返回
    ()
    的函数是纯函数,只能返回一个名为
    ()
    或发散的无用空值
  • 返回
    IO()
    (或某些其他monad中的单位)的函数,这些函数除了IO(或任何一个)monad中的效果外,没有“结果”

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

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

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

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

    所以,除了封装和参数,它们实际上没有概念上的联系

    真正的问题是:“那么多开发人员怎么会认为他们是一样的?”

    答案是C

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


    void指针就这样诞生了,在C语言占领了整个编程世界之后,随之而来的是一种误解,即这种硬件/操作系统实现工件(尽管在几乎所有后续平台上都是如此)与语言语义相同。

    请原谅我回答一个两年前的问题,特别是我自己的语言Felix的独特之处,但无论如何,这里有:)

    在Felix中,函数和过程是根本不同的,不仅仅是过程有副作用并在语句中调用,而函数没有副作用并在表达式中使用(因为Felix还有生成器,它们是具有副作用的函数……)

    不,执行模型从根本上是不同的,主要是出于性能原因,但并非完全不同。模型是:

    • 函数将其返回地址和返回值放在机器堆栈上
    • 过程使用堆上的链接列表。程序代码是扁平的,它不使用机器堆栈
    这通常是低效的,那么为什么要这样做呢?答案是:Felix程序都是潜在的联合例程(纤维)。他们可以通过访问通道将控制切换到另一个过程。这会导致控制权的交换

    • 出于性能原因,无法在控制交换上复制计算机堆栈
    • 出于内存管理的原因,交换堆栈指针也不是一个选项
    操作系统通常为线程交换堆栈指针,这相当快,但在线性地址机上有一个基本问题:要么将堆栈的最大大小限制在一个小得离谱的值,要么将线程数限制在一个小得离谱的值。在32位机器上,甚至没有足够的地址空间来考虑这个解决方案。在64位机器上,堆栈交换具有更大的潜力,但当然,用户需求总是在硬件发布3天后增长到超过硬件的水平:)

    Felix只交换一个指向基于堆的堆栈的指针,因此上下文切换速度非常快,浪费的地址空间非常少。当然,成本是过程调用的堆分配

    在编译器中,理论模型的许多架构都是在“似乎”的基础上进行优化的,因此实际性能和实现