子程序、子例程、过程、函数、方法 的异同

都是代码抽象,不同的名词其实只是不同语言设计理念不同罢了。

子程序subprogram和过程procedure

程序的任意一段的顺序指令或语句可称之为subprogram或者过程procedure。
在许多计算机领域的中文翻译书中,subprogram被翻译为子程序,procedure被翻译为过程。

子例程subroutine,过程procedure和函数function

1949年一台叫做EDSAC的计算机带来了最早的汇编语言、最早的编程教材等等。
在函数调用上,EDSAC首次明确提出了subroutine的概念。将一段代码从复杂代码中抽象出来,允许程序执行过程中跳转到subroutine的地址,subroutine执行完再跳转回某个地址继续之前的程序。此时还没有返回值的概念。

如果将function翻译成函数,显然体现了一种数学思想。
1955年,LISP为了更好地描述数学计算过程,提出了一种思想——程序由expression(通常翻译为表达式)组成,每个表达式都返回一个值。表达式有返回值使得表达式和表达式可以嵌套组合成新的表达式。 就像在数学中书写算式一样。
Lisp第一个提出了类似现在我们使用的function的代码抽象机制,但仍称之为procedure,Lisp将procedure中最后一个表达式的值作为返回值,每个procedure都有个返回值。procedure可以作为表达式参与构成表达式,这很符合人工计算的习惯。
Lisp的procedure之所以不叫function,是因为,数学中的function作用仅仅是将输入映射到一个值,是不会改变参数变量的值的。而procedure仍有可能改变输入参数的值,或有其他作用。
所以Lisp的procedure作用是返回一个值,除了返回值以外的作用称为副作用(Side Effects)。

但对于那些不需要返回值的东西,比如循环、赋值、定义、返回等等,强行给他搞成表达式然后返回一个空值,有些多此一举。
所以,Fortran I由表达式(expression)和语句(statement)组成。表达式和语句的区分扩散到它们两者的后继语言。
在LISP之后,FORTRAN II开始支持subroutine和function。区分了function和subroutine,究竟本身是不是一个好的设计暂且不说。
FORTRAN为了符合数学定义,使用function有一个“不成文的规定”,就是:“传递给函数的参数,只要读取它的数值就好了,不要去改变它的数据”。虽然在语法上可以改变输入它的数据,但如果想要改变输入的参数时,最好使用subroutine,而不是使用函数来完成这个工作。

BASIC中的代码抽象机制叫做subroutine,Pascal中的代码抽象机制叫做procedure和function。

C语言把有返回值和没返回值的过程片段统称为function。C语言定义不返回值的function,这时用关键字 void 说明“返回值类型”。这种写法很别扭,是 C语言把没返回值的procedure和有返回值的function用同一形式写出而带来的副作用。unix是用C开发的,所以unix的程序有返回值,返回值可以用来表示程序运行情况,这也影响了后来的操作系统的设计。

VB 中的代码抽象机制分为Function Procedure和Sub Procedure。

在计算机领域中,通常将子程序分为两类:执行最后产生返回值的称为function(通常翻译为函数),只完成一些操作不产生返回值的称为procedure(通常翻译为过程)。过程以过程调用语句的形式使用,过程不能作为表达式使用,函数只能在表达式里使用。函数的作用是返回值。函数或过程,除了返回值以外的作用,比如改变某个变量的值,叫做副作用。

功能function和方法method

为了贴近事物的自然运行模式,或为了不突出数学特征,或为了区别于面向过程程序设计中的函数,可以将function翻译成功能。
比如,在面向对象思想中,类是具有相同特性(数据元素)和行为(功能)的对象的抽象。
很多面向对象的编程语言使用了method一词,以和类外的function做区分。method是做某事的方法。通过对象调用method,而function不用通过对象调用。
C++在C的基础上,将类内的函数称为成员函数(member function),或称为方法(method)。
Java将function称为方法(method),因为他是一门面向对象的语言而不是面向过程的语言。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值