渣翻——Function、Method、Procedure和Subroutine的区别

原文链接: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是机器指令的概念,是一些列机器码或汇编码指令的集合;

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Fortran中,SUBROUTINEFUNCTION都可以用来定义子程序,但它们之间有一些区别。 1. 返回值类型 FUNCTION可以返回一个值,而SUBROUTINE不返回任何值。因此,FUNCTION的定义中必须包含返回值的类型,而SUBROUTINE则不需要。 例如,以下是一个返回整数类型的函数定义: ``` FUNCTION add(a, b) RESULT(c) INTEGER :: a, b, c c = a + b END FUNCTION ``` 而以下是一个不返回任何值的子程序定义: ``` SUBROUTINE print_hello() PRINT *, "Hello, world!" END SUBROUTINE ``` 2. 调用方式 调用SUBROUTINE时,使用CALL语句来调用,而调用FUNCTION时,可以直接将其当作一个表达式来使用。因此,调用FUNCTION时,不需要使用CALL语句。 例如,以下是调用SUBROUTINE的语句: ``` CALL print_hello() ``` 而以下是调用FUNCTION的语句: ``` result = add(2, 3) ``` 3. 参数传递 在Fortran中,SUBROUTINEFUNCTION都支持值传递和引用传递两种参数传递方式。但是,由于FUNCTION需要返回一个值,因此通常情况下,它需要使用引用传递来返回值。 例如,以下是一个使用值传递的子程序定义: ``` SUBROUTINE swap(a, b) INTEGER :: a, b, temp temp = a a = b b = temp END SUBROUTINE ``` 而以下是一个使用引用传递的函数定义: ``` FUNCTION max(a, b) RESULT(c) INTEGER :: a, b, c IF (a > b) THEN c = a ELSE c = b END IF END FUNCTION ``` 在调用SUBROUTINEFUNCTION时,使用不同的语法来传递参数。例如,以下是调用使用值传递的子程序的语句: ``` CALL swap(a, b) ``` 而以下是调用使用引用传递的函数的语句: ``` result = max(a, b) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值