计算机函数和数学函数都是函数。如果抽象地来说函数的意思就是一个输入产生一个输出,那么这个输出就是输入的函数。输入和输出之间的这种关系叫做函数映射。
上图:函数的基本定义示意
不管是计算机函数,还是数学函数,它们都符合函数的这个抽象定义。
输入
输出
单向有序对应(输入对应到输出)
上图:这是函数,因为不同的输入值有唯一的输出值。
上图:这不是函数,因为相同的输入值对应了不同的输出值。
换一种你可能觉得匪夷所思的方式来描述函数,可以这么来讲:
函数实际上是一个两两有序配对的集合,一个X值仅对应一个Y值,但一个Y值不一定对应一个X值。这个X与Y值的配对的集合G就是函数的图,如果用坐标系表示就是我们经常看到的那种函数曲线图。
上图:一个典型的函数曲线图。
从形式上讲,函数图和函数是相同的东西,但函数图隐藏了函数作为某种过程的内涵。因此,在通常的用法中,函数和函数图是区分开来讲的。
y=f(x)这种表示法就代表了x通过一个函数的过程f,映射(或者输出)y的全部含义。
此外,函数也称为映射,虽然“映射”和“函数”之间还是有一些差别。
函数的基本定义是数学的函数和计算机函数通用的,否则就不叫函数。下面我们分开看下数学函数和计算机函数的异同。
函数最早就是在数学领域定义的,因此数学的函数的定义基本上与上面讲的函数的基本定义类似,但是数学的函数限定函数的输入和输出对象必须是数,而不是其它什么猫猫狗狗。
你不能说我有一个函数:f(x),然后当x=猫,算出来f(x)=狗。
这样的函数在数学上不成立的,其根本原因在于数学的运算只能适用于数,这里的x代表的是一个数,只能从数的集合当中选取。
如果我们把上面的例子再复杂一下,例如:
函数f(x)=2x+1;但你要让我算当x=猫时的函数值,那我最多可以代数推理到这一步:
f(x)=2猫+1,但是2x猫是什么含义,2猫能跟+1运算吗?显然不行,这哪里哪呀?完全是牛头不对马嘴。
所以,数学的函数,限定了函数的取值范围是“数”!
这和计算机的函数就有了差别。
计算机也是建立在数学的原理之上,从计算机的本质上讲,计算机就可以被视为一种函数——一种物理实现的函数,它有输入,有输出。至少从物理原理上讲,它是以电脉冲信号作为输入,并输出电脉冲信号。而且计算机确保了函数的一个最基本特征,即有序对应(或者说映射),相同的输入对应相同的输出,绝对不能出现相同的输入居然产生不同的输出的情况。所以,计算机本身就具备了函数的某些特质。
上图:计算机的基本功能是不是跟我们前面对函数的基础定义的图示有些相似?
抛开计算机的物理硬件属性(硬件部分)来说,单看计算机的逻辑属性(即软件部分),也就是基于计算机的运作方式而保证成立的那套运作机制,恰恰就是数学函数。计算机的软件部分可以完全被视为纯粹的函数,这一点问题都没有,因为计算机的软件体系完全符合函数的基本定义。
只不过,计算机软件设计人员利用计算机高级编程语言的设计思路,将数学函数的原理和描述方式引入到了计算机的设计和计算机的编程开发当中。并且将复杂的概念建立在了数学函数的基础上,实现了计算机最重要的操作和行为概念(我们用计算机可不是仅仅用来做算数)。这更强调了之前函数的通用定义当中关于函数是一个“过程”的内涵。
计算机的编程语言不是给计算机看的,而是给程序员看的,是方便程序员自己知道自己想让计算机执行什么指令。虽然程序员输入的是一些程序代码,但实际上这些程序代码最终会被编译为数(包括指令和数据等等)。
上图:程序的流程图:大量函数相互连接就构成了复杂的逻辑操作体系。
但实际上计算机的操作和行为,最终落到计算机的硬件底层都是建立在数字信号的基础上的,这种操作和行为实际上就是大量函数的宏观集合——通过运算实现对现实世界的反映和反馈。
举几个典型的此类操作的例子,看看它们是如何由函数构成的:
计算机指令——实际上是一系列的编号以及相关的参数,每一条计算机指令都定义了输入值x,计算含义f,指令执行后会产生对应的输出值和相关操作(以数字信号的方式)。
对计算机内存的读、写——实际上是输入一个地址值,输出该地址固定长度的数据的值。
对特定设备的操作——实际上在一系列的内存地址写入各种数值,然后以一个数值请求处理器控制特定的设备来读取这些数据。
显示屏显示图像——是以显存内的大量数值作为输入,以屏幕上的矩阵作为输出(矩阵也是数的一种形式,至少矩阵可以等效于一个数的有序集合)。
上图:内存的寻址就是一种典型的数值控制的操作,一串10的组合决定了应该从内存当中的哪一块提取数据。所以像内存这个设备输入数值,即可获取另一串输出的数值。内存也是一个函数。
上面是从计算机的底层机制来说的,也就是说计算机的底层完全是基于函数的,所谓的计算和操作一切都是函数。
上图:高级语言(人可读的指令)是如何变成CPU可读的指令,一切都会落到01构成的数值上,作为CPU的输入得到处理。这些数值不仅提供了x,也提供了f,应该说是高层的f,意思是处理数据的方法。高层的f会被变成底层的f,从而会被CPU执行(实际上CPU只知道少量的固定的底层的f)。
而对于计算机编程语言当中的函数来说,函数就具备了更高层次的含义。诸如一个C语言的函数,或者java语言的函数……
这些函数在另一个层面上体现了一些与数学上函数的不同。由于计算机高级语言品种非常多,我这里也就不过多展开,只说一点点抽象的共性:
在高级编程语言当中,函数和过程(routine)具有类似的含义或者本质,这是对函数'过程'含义的强化,也就是前面我们提到的那个f()的含义。
我们在类似C语言系的语言当中,函数、过程和方法等概念具有类似的含义。这些概念更突出函数的过程属性。即在函数的运算之中,会执行一些操作,带来一些后果,重点在于这些操作和操作的后果,而不在于函数的输出值。但实质上,这些操作的后果也就是函数的输出值。
通过函数集合的宏观化,函数就变成了“宏”(macro)——一种具有动作属性的整体概念,即操作。读到这里,读者应该可以联想到为什么excel里面的VBA程序会被称为“宏”。
实际上宏就是一种动作,或者操作的集合,其目的不是给出输出的数值,而是给出一系列动作。但归根就底,宏也是建立在堆叠的函数的基础上的,是一个封装的整体概念,它不过是强调了函数的过程属性而已。
上图:Excel中基于VBA的宏程序示例
小结一下:
计算机由于具备了强大的计算能力,于是可以高效地处理大量的函数,因此在此基础上,人类使得计算机的软件体系形成了“操作”的概念,因为我们不仅仅是想要计算机通过复杂的函数计算告诉我们一个最终值,而是需要计算机通过计算出来的大量的值去做一些事情。这是将计算力变成生产力的关键。但不管操作也好、宏也好、其微观都是建立在单个简单的函数的基础上的,其原理也是建立在数学函数的概念之上的,输入-过程-输出的映射是计算机的基本原理。当硬件确保了这种基本原理的稳态运作,就成了计算机。即便用这样的定义去衡量中国人发明的算盘也是一样的道理。
数学上函数的概念是计算机函数概念的微观原理基础。计算机发展到高级阶段之后,计算机函数的含义更多地强调了函数的过程特性,从而形成了强大的操作能力,虽然这种操作能力最终是由硬件来实现的。但无论怎么发展,计算机函数的内涵都是符合数学函数的内涵的。
联系客服