您的位置:首页 > 理论基础

渣翻——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?

函数(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是机器指令的概念,是一些列机器码或汇编码指令的集合;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  函数 计算机科学