rpr*_*rpr 187 terminology procedure function
一般来说,我们都听说过编程语言中的函数或过程.但是,我发现我几乎可以互换地使用这些术语(这可能是非常错误的).
所以,我的问题是:
它们的功能,用途和用途有何不同?
一个例子将不胜感激.
Too*_*the 280
函数返回一个值,一个过程只执行命令.
名称功能来自数学.它用于根据输入计算值.
过程是一组可以按顺序执行的命令.
在大多数编程语言中,甚至函数都可以有一组命令.因此,差异仅在于返回值部分.
但是如果你想保持一个功能干净,(只看功能语言),你需要确保一个功能没有副作用.
jpa*_*cek 40
这取决于具体情况.
在类似Pascal的语言中,函数和过程是不同的实体,不同的是它们是否返回值.他们表现得与众不同.语言语法(例如,过程调用表单语句;您不能在表达式中使用过程调用,而函数调用不会形成语句,您必须在其他语句中使用它们).因此,Pascal-bred程序员区分它们.
在类C语言和许多其他当代语言中,这种区别已经消失; 在静态类型语言中,过程只是具有有趣返回类型的函数.这可能是他们互换使用的原因.
在函数式语言中,通常没有程序这样的东西 - 一切都是函数.
小智 16
C中的示例:
// function
int square( int n ) {
return n * n;
}
// procedure
void display( int n ) {
printf( "The value is %d", n );
}
Run Code Online (Sandbox Code Playgroud)
虽然你应该注意C标准不讨论程序,只讨论函数.
小智 6
SELECT
以及DML( ,INSERT
,UPDATE
)DELETE
在其声明,而功能只允许SELECT
声明它.SELECT
语句中使用,而函数可以嵌入SELECT
语句中.WHERE
(或一个HAVING
或多个SELECT
)块中的任何位置的SQL语句中使用,而函数可以.JOIN
与其他表的块中使用.JOIN
块和其他Rowset操作中使用.更严格的是,如果x = y,函数f服从f(x)= f(y)的属性,即每次用相同的参数调用它时计算相同的结果(因此它不会改变状态系统.)
因此,rand()或print("Hello")等不是函数而是程序.虽然sqrt(2.0)应该是一个函数:没有可观察到的效果或状态改变,无论多少次调用它,它总是返回1.41和一些.
这是一个众所周知的老问题,但我想分享一些关于现代编程语言研究和设计的更多见解。
传统上(在结构化编程的意义上)和非正式地,过程是一种可重用的结构构造,具有“输入”并执行一些可编程的操作。当需要在过程中完成某事时,您可以在源代码中编码的过程调用中为过程提供(实际)参数(通常是一种表达式),以及在过程体中编码的动作(提供在过程的定义中)将通过将参数替换为主体中使用的(形式)参数来执行。
甲函数超过因为程序的返回值也可以被指定为在体内的“输出”。函数调用与过程调用或多或少相同,除了您还可以在语法上使用函数调用的结果(通常作为某个其他表达式的子表达式)。
传统上,过程调用(而不是函数调用)用于指示必须没有输出感兴趣,并且必须有副作用以避免调用是空操作,因此强调命令式编程范式。许多像 Pascal 这样的传统编程语言都提供了“过程”和“函数”来区分这种有意的风格差异。
(需要说明的是,上面提到的“输入”和“输出”是基于函数句法特性的简化概念。许多语言还支持通过引用/共享将参数传递给参数,以允许用户在调用过程中传输参数中编码的信息.这样的参数甚至可以被称为“输入/输出参数”。这个特性是基于调用中传递的对象的性质,它与过程/函数的特性的特性是正交的。)
但是,如果不需要函数调用的结果,则可以(至少在逻辑上)忽略它,并且函数定义/函数调用应该以这种方式与过程定义/过程调用保持一致。类似 ALGOL 的语言,如 C、C++ 和 Java,都以这种方式提供了“函数”的特性:通过将结果类型编码void
为看起来像传统过程的函数的特例,不需要提供“过程”的特性。 “ 分别地。这可以防止语言设计中的一些膨胀。
既然提到了SICP,那么还值得注意的是,在R n RS指定的Scheme 语言中,一个过程可能需要也可能不需要返回计算结果。这是传统“函数”(返回结果)和“过程”(不返回任何内容)的结合,本质上与许多类似 ALGOL 的语言的“函数”概念相同(实际上共享更多保证,例如对调用前的操作数)。然而,即使在像SRFI-96这样的规范性文件中,老式的差异仍然存在。
我对分歧背后的确切原因知之甚少,但正如我所经历的那样,现在似乎没有规范膨胀的语言设计者会更快乐。也就是说,作为独立功能的“过程”是不必要的。像void
类型这样的技术已经足以标记应该强调副作用的用途。这对于具有类似 C 语言经验的用户来说也更自然,这些语言已经流行了几十年。此外,它避免了像 R n RS这样的尴尬,在这种情况下,“过程”实际上是更广泛意义上的“功能”。
理论上,一个函数可以指定一个指定的单元类型作为函数调用结果的类型,以表明该结果是特殊的。这将传统程序(对调用结果不感兴趣)与其他程序区分开来。语言的设计有不同的风格:
#inert
)的值也有效。void
ALGOL 类语言中的类型正是这种技术的一个例子。ISO C11_Noreturn
是一种类似但更微妙的类型。作为源自数学的传统概念,有很多大多数人都懒得知道的黑魔法。严格来说,你不太可能按照你的数学书把事情搞清楚。CS 书籍也可能不会提供太多帮助。
关于编程语言,有几个注意事项:
{{{}}, {}}
......)一样荒谬.