渣翻——Function、Method、Procedure和Subroutine的区别
2017-07-30 20:25
260 查看
原文链接:What are the main differences between a function, a method, a procedure and a subroutine?
在c语言和其他允许函数副作用的语言中,void返回类型表示函数没有返回值,而其他可能会产生的副作用包括输出到终端或写入文件。一个既没有任何返回值也没有副作用的的函数是没有任何用处的。
在Haskell和其他函数式语言中,函数没有副作用。这意味着,只要每次的输入都相同,对同一个函数的每一次调用,都能返回相同的结果。
在其他语言中,函数是第一类对象【first-class object,见维基百科】,这表示函数和其他变量被同等对待,也可以像字符串和数字一样在程序中传递。这在支持函数式编程的语言中是很典型的。Python支持第一类函数,但是java不支持。(java8函数式编程呢?)
一个数学函数的形式可能是这样的
而在C语言中,它的形式是这样的
举个例子:
subroutine是函数和程序之间的桥梁。每个subroutine都应该包含一组计算函数结果的指令集合,并且每个subrutine在执行完成之后都必须有一个返回状态。这也是subroutine区别于纯粹的程序而与函数类似的原因。subroutine应该总是包含访问函数参数和返回结果的指令。在高级语言中,这些必须的指令是隐藏的,因为编译器会保证这些指令的存在;但是函数的机器码或者汇编码必须包含这些指令。
对于之前的例子F(x),其对于的subroutine如下:
method也是编程语言层面的概念,只存在于面向对象语言中,是function在面向对象语言中的表述;
procedure是语言层面的概念,包括编程语言和现实语言;它是一些列操作指令的集合(不限于机器指令),可能(只是可能)有输入或输出。
subroutine是机器指令的概念,是一些列机器码或汇编码指令的集合;
函数(function)
函数可以接收参数作为输入,并且产生预定的输出(可以是一个返回值,也可以是一些其他的副作用【见:函数副作用】)。它是计算机科学和数学中的一个理论概念。在可以执行函数的高级语言或机器出现之前,计算机科学家只能对函数进行推演,比如λ演算(lambda calculus)。现在,每一种高级语言都拥有自己的一套规则从语法、调用规范、可允许的副作用、以及返回值上来决定如何执行、使用函数。作为程序员在使用时的工具,这些特殊的实现与纯理论的定义相似,但必然有一定的区别。这里总结了不同语言在处理function时的一些区别:在c语言和其他允许函数副作用的语言中,void返回类型表示函数没有返回值,而其他可能会产生的副作用包括输出到终端或写入文件。一个既没有任何返回值也没有副作用的的函数是没有任何用处的。
在Haskell和其他函数式语言中,函数没有副作用。这意味着,只要每次的输入都相同,对同一个函数的每一次调用,都能返回相同的结果。
在其他语言中,函数是第一类对象【first-class object,见维基百科】,这表示函数和其他变量被同等对待,也可以像字符串和数字一样在程序中传递。这在支持函数式编程的语言中是很典型的。Python支持第一类函数,但是java不支持。(java8函数式编程呢?)
一个数学函数的形式可能是这样的
F(x) = (x+5) / 2
而在C语言中,它的形式是这样的
int F(int x) { return (x+5) / 2; }
方法(method)
方法是面向对象语言中的一个概念。在面向对象语言中,方法是属于某个类的简单函数。方法可以认为是包含一个隐藏的this指针作为额外参数的函数,这是编译器在编译时自动添加的。程序(procedure)
程序是执行某个任务的一系列指令。不同于函数来源于数学理论,但是程序来源于一种为机器编程来完成实用任务的实践。程序只有在指令能被解释并执行的情况下才有意义。函数式程序的一种,但是程序可能不是一个函数,因为程序可能没有输入或输出。一个不是函数的程序在大多数情况下是无用的。举个例子:
SAY "Why did the chicken cross the road?" WAIT 5 SECONDS SAY "To GOTO the other side!" PLAY "laughter.mp3"
subroutine
子程序?子例程?感觉怎么翻译都不合适……subroutine是函数和程序之间的桥梁。每个subroutine都应该包含一组计算函数结果的指令集合,并且每个subrutine在执行完成之后都必须有一个返回状态。这也是subroutine区别于纯粹的程序而与函数类似的原因。subroutine应该总是包含访问函数参数和返回结果的指令。在高级语言中,这些必须的指令是隐藏的,因为编译器会保证这些指令的存在;但是函数的机器码或者汇编码必须包含这些指令。
对于之前的例子F(x),其对于的subroutine如下:
F: # X is stored in first argument, $a0. add $t0, $a0, 5 # add 5 to X and store in temporary register $t0 div $v0, $t0, 2 # divide $t0 by 2 and store in return register $v0 jr $ra # return back to the caller
F: # X is stored in first argument, $a0. add $t0, $a0, 5 # add 5 to X and store in temporary register $t0 div $v0, $t0, 2 # divide $t0 by 2 and store in return register $v0 jr $ra # return back to the caller
个人总结
function是编程语言层面的概念,它来源于数学理论,是一个有输入和输出的计算机操作行为的集合;method也是编程语言层面的概念,只存在于面向对象语言中,是function在面向对象语言中的表述;
procedure是语言层面的概念,包括编程语言和现实语言;它是一些列操作指令的集合(不限于机器指令),可能(只是可能)有输入或输出。
subroutine是机器指令的概念,是一些列机器码或汇编码指令的集合;
相关文章推荐
- MySQL和Oracle Procedure和Function的区别
- method 与 function的区别
- 方法(method)和函数(function)有什么区别?
- 区别method和function
- Oracle 存储过程(procedure)和函数(Function)的区别
- abap 中:module ,form, method ,function, define 的区别和联系
- MySQL 的存储过程 procedure 与 函数 function 的区别和使用方法
- PHP的method_exists,function_exists,is_callable的区别
- Oracle 存储过程(procedure)和函数(Function)的区别
- oracle 存储过程 PROCEDURE和 FUNCTION区别:
- 【PHP】function_exists , method_exists 与 is_callable的区别
- Oracle 存储过程(procedure)和函数(Function)的区别(转载)
- 在 DELPHI 中 procedure 型变量与 method 型变量的区别
- oracle中 procedure(存储过程)和function(函数)本质区别
- __FUNCTION__ 和__METHOD__区别
- function_exists, method_exists, is_callable的区别
- FUNCTION和PROCEDURE的区别
- function_exists 、 method_exists 和 is_callable 的区别
- 我所理解的Python里method和function的区别(关键词:method/方法/function/函数)
- scala之method和function的区别