万法皆空,唯因果不空:函数(function)禅思

函数的禅思与技术解析

英语单词 function,表示“功能”这样的含义,不过,它其实也是一个计算机术语,意为“函数”:

  • function n.功能;函数;作用;职能

函数,既是一个计算机术语,同样,众所周知,它也是一个数学术语。数学中,通常表达为如下公式或范式:

f(x) = y

这里的 f-,就是function 的意思。数学中的函数,其实有另外一个叫法,叫映射,f(x) = y 程式中的 x 和 y 一种映射关系,在这个程式中,我们可以把 f 想像成是一棵树或某种植物,x 想像成是开出的花朵,y 则可以想像成结出的果实,也就是开什么花,结果什么果的意思,或者说种瓜得瓜、种豆得豆,x和y之间,是一种映射关系或者说是一种特定的动态对应关系。有一种说法,【函数】,是对苏联或苏式数学中 f(x) = y 这一范式所表达的特定数学概念的翻译,而【映射】,则是对英美或英美数学中这一相同数学概念的另外一种翻译或者叫法。

在数学意义上,无论如何,从字面上讲,或第一印象,【函数】对于国人来讲,相对抽象或较难理解,【映射】则显得更为直观或更易于理解,甚至富有形象和画面感,所以,我们也中以用【映射】来帮助理解所谓的【函数】,当然我们现在知道了,它们是同一个东西。

事实上,IT或软件编程领域所讲的【函数】,其实,是借用了数学中的函数概念的,因为它们具有大体相同的底层逻辑和形式,本质上,在英语中,也都是用 function 一词来表达的,当然,在面向对象编程语言中,更多地喜欢将函数(function),称为方法(method),一般来讲,即POP编程中的function相对独立,而OOP中的method则具有相对的依赖性,因为method通常属于特定的类或对象,或者说OOP编程中的所谓方法(method),通常是定义于类中,而最终被类的实例化对象所调用,这可以说,是编程语言中 function 和method 通常意义上的一点区别,但从总体上讲,二者大体是一样的,区别并不大,大一定程度上,可以将 method 视作 function 来看待,二者本质相通,就根本上讲,并不二致,只有相对外在的一些细微差别。

说明:需要注意的是,编程语言中的【函数】概念,只是在一定程度上借用了数学中的【函数】概念,二者概念并不真正一致。因为数学中的【函数】,就是【映射】,即f(x)=y范式中,x和y是映射关系(map),是动态一一对应的关系。但编程语言中的【函数】不一定这么单纯,通常编程语言中只有所谓的 【纯函数(pure function)】 和数学中的函数或映射,是比较相似或接近的,而编程语言中的其它 非【纯函数】 则通常与数学中的函数或映射,有较大区别,比如在JavaScript中,程序员通常会编写很多非纯函数,这些函数的不纯之处在于,它们通常除了有返回值外,还会具有很多其它额外的功能,比较对各种DOM元素进行各种事件绑定,产生各种IO输入输出,有时具有各种所谓的副作用、甚至意想不到的结果等。

function 一词,有着明显的抽象名词后缀-ion,因此,其结构大体可以拆分如下:

function = funct- + -ion 抽象名缀 = 函数;功能

从词源历史语义的衍化上讲,function的【函数】这一语义,显然是从【功能或作用】这样的更原始和基础的语义变化、衍生而来的。

function n.功能、作用、功用、职责、职能→函数

因此,对于 【函数(function )】的理解,我们可以从其【功能、作用、功用】一类的相对基础语义得到解释。

比如,Java定义某个加法功能的add函数或方法:

public int add(int a, int b) {
	return a + b;
}

又比如,JavaScript 中定义一个类似的add函数或方法:

var add = function(a, b) {
	return a + b;
}

二者虽然语法形式不同,但手法或思路其实是大体相同的,本质上是相通的,就是所谓的函数,通常都是对一段代码的特定封装,而这段代码通常能实现特定的功能,而且一般来说,它们都具有入参和出参,入参相当于f(x)=y范式中的x,出参相当于f(x)=y中的y。

也就是说,f(x)=y,y 对于编程语言中的函数来说,就 是返回值,也就是结果,所谓结果,就相当于树上的结的果实,而x,而相当于因缘,相当于种子、花朵乃至风雨阳光,当函数被调用执行或者实际运算,就相当于花草树木沐浴阳光雨露,因缘际会,最终会结出结果。

我们说,function一词,-ion部分是个抽象名词后缀,也就是说,function 所谓【功能、功用】这样的基础义涵,主要来自于funct-部分,那么funct-是什么意思呢?为什么 funct-可以最终引申出function表示【功能】这样的含义呢?

实际上,个人认为 function 的核心部件 funct-,和树上的果实相通,和英语单词 fruit 相通,funct-中的t-可以看成是一个动词性或表动作的构词尾素或古语法形式残留,它更核心的部分,是func-,其中,fun-通fruit,c-和g-相通,和get、gain相通表达获取、收获、收割,换句话说,func-/funct-的本质,是指收割或收获水果或果实的意思。

funct-(function核心要件) = fun-水果、果实 + c-收割、收获、取得、获取 + -t 表动作完成 = 字面义:指收割或收获果实(行为或现象)

所以,function一词,我们最终可以这样拆解:

function = funct-收割或收获果实 + ion表名缀 = 引申:劳动,获取,实施、执行,施用、施行 = 引申:功用、作用、功能

现在,我们用Python来定义同样的一个add加法函数,它的本质,同样没变:

def add(num1, num2):
	return num1 + num2

也就是说,Java定义的add函数、JavaScript定义的add函数和Python定义的add函数,功能基本上是一样的,或者说都可以实现加法的功能,当然,JS中可能会叫函数,Java和Python中我们可能会叫它们方法,因为通常它们是定义在类(Class)中的,而Java是一门强类型编程语言,要实现和JS和Python弱类型编程语言中类似的功能更为完备一些的加法方法,Java可能会显得相对繁琐一点,还需要写更多的重载方法(overlad methods),但这些都不过是形式罢了,作为【函数】的本质,无论是Java、还是JS、Python或者别的什么编程语言,基本上是一样的,即基本概念一致、大体根性不变,只是实现的语法形式有所差异而已。

在这里插入图片描述

我们在学习编程的过程中,可能会各式各样的函数:

  • 普通函数
  • 构造函数
  • 匿名函数
  • 回调函数
  • 箭头函数
  • 异步函数

  • 不过,无论什么样的函数,它们最终的目的,都是让我们去【调用】它,也就是去invoke、去call 它们,以发挥它们的功能,达成相应的目的

下面,我们来看一下 function 的首字母 或 f(x)=y程式中的核心字母-f,我们说f(x)=y中的字母-f,就是指function,而它和fruit(n.水果;果实)相通。

fruit n.水果;果实
call v.呼叫;给…打电话;召唤,呼唤
invoke vt.调用;援引

这个 function/fruit中的f-是什么意思呢?我在其它的篇章中曾分析过 fruit 一词的结构性的语义逻辑,讲过这个首字母 f-,本质上是指【掉落、坠落】或者【倾倒、倒伏】一类的含义,我们可以简单以汉字【落】来理解它,因此,它和fall一词是相通的,和fog、frost这些单词也是相通。

fall,就是落下、坠落的意思,也有倾倒、跌倒之义。fog,所谓雾,也可以理解为是天上降落的露水,frost,所谓霜,也可以理解为天上掉落的冰晶。

  • fall v.落下
  • fog n.雾 //天上降落的露水
  • frost n.霜 //天上掉落的冰晶

事实上,fall 一词还可以作名词,表示瀑布,这里的瀑布,是指一般意义上的瀑布,或者大的瀑布,小的瀑布我们可以用cascade来表达,确切地讲,cascade一词,是通常指连续连续多级瀑布中的一级小瀑布,不过从结构上讲,cascade可以作如下分析:

cascade = cas-掉落、掉下 + cad-掉落、掉下 + e尾素

也就是说,cascade 是一种重复结构的构词方式,其中 cas-和cad-相通,即cas-/cad-是同一个词根的不同变体形式,其中s-和d-相通,cas-和cad-是一个意思,核心语义,就是指东西从上往下掉落或坠落,之所以要采用重复结构形式,可能是为了与其实现语义相对应,以表达多级下落的瀑布的样子。

当我们分析完 cascade(小瀑布)的构词底层逻辑时,你可能会惊异地发现,其实 cascade的构词本质和 fall 的构词本质是相通的,它们的底层逻辑,都在强调【下落】或【落下】这样的基础含义或概念,就是无论什么样的瀑布(无论大瀑布还是小瀑布),都是指流水【从上往下】掉落的,cascade是由词根cas-/cad-来体现的,而 fall 则是由首字母也就是辅音字母 f- 来体现的。(事实上,cascade一词,对于程序员来说,通常也是不会陌生的,比如CSS,就是指级联样式表,缩写自Cascading Style Sheets,即cascade还有“级联”的意思;同样,对于数据库的级联操作,比如级联查询或级联删除,这个级联,也是用cascade来表达的)

事实上,fall 一词作为名词,在美式英语中,通常还用来表达【秋天(autumn)】这样的含义。想到秋天,我们可能会想到杜甫《登高》中的诗句:无边落木萧萧, 不尽长江滚滚来。

不过,不要忘了,其实树上的果实(fruits),也是在秋天(fall)的时候纷纷坠地的呀,通常意义上讲,当树上的叶子和果实掉落殆尽的时候,通常也意味着一年之中就要进入象征着死亡的最后一个相对寂静的季节冬天的来临,而春夏秋冬,是一种轮回,而函数(function)其实也是有点相似的,是可以反复被调用的,来来去去进行轮回的,只不过,不同的轮回或调用,可能会有所不同,因为f(x)的输入变量不同,结果y自然也就有所不同,正所谓:年年岁岁花相似,岁岁年年人不同。

fall v.落下,下跌 n.瀑布;秋天

总之,无论fall是表示落下,还是表示瀑布,或者秋天,它们的底层基础语义,都是来自于一个【落】,指事物从上往下掉、往下坠落或跌落,即落下、掉落才是fall最基础的语义,它根本上讲,来自于首字母 F,而这个F,在最初的书写形式,类似于现在的字母Y,所以我们可以视这个字母F(Y),看成是一个象形字母,也就是瀑布的形象,而这个瀑布是一个典型的或者说大的瀑布的经典形象(而不cascade的样子),这个瀑布Y的样子,可以让我们和李白的诗句《望庐山瀑布二首》联想起来,正是所谓:飞流直下三千尺,疑是银河落九天。即你可以这样理解,所谓的 fall、fog、frost 的首字母表示“下落”可以理解为是树上、从高处,更进一步地是从天上掉下来,是的,总之你可以理解成是从【天上】掉下来(当然天有九重,可高可低)。

既然是从天上掉下来的,这里边,也就是有天意的,有生命周期的,有轮回往复的。当们看一个个函数或者方法体中的代码的时候,你有没有感觉到那就是从上往下流动、一种生命轮回从生到死的感觉,事实上,每一个函数(function)或者方法(method),它们的本质,大体是相通的,就是它们其实一旦执行,就是活的,是有生命周期性的,是有生死的,也是背负了使命的,以特定的形式或代码段,去实现特定功能的。

在这里插入图片描述

  • 其实,fruit 掉到地上,相当于意味着死亡,但是,反过来,也暗藏着新生,因为水果中包含着重生的种子。fruit 和 fall 相通,fall 表示掉落、落下,其实 fall 也有“跌倒、倒下”之义,与fail(v.失败n.不及极)、failure(n.失败;故障)、false(a.错误的;假的)、fault(n.过错;缺陷;故障)、default(v./n.违约n.缺省,默认;欠缺,缺乏)等单词相通;在西方的思想文化、哲学体系当中,试错有着重要的作用,敢于面对冲突和挑战是西方文明中的重要传统和重要精神内核,失败乃成功之母,体现的就是这类思想的包容性和辩证精神。英语中的fallback一词,经常被翻译成“后备方案、B计划、备胎”一类含义,但其实,它的字面义,是指失败时的退路,fallback = fall 失败 + back 后退、退路,也就是说,fallback的中的fall-,本质其实是fail/failure,但和fall(v.跌倒)相关,也就是说,单词fail/failure其实是从fall及其语义中衍化产生的。花草树木的果实,也就是fruit,通常都是圆形或近圆球形的,有点类似文章中句子的句号,这仿佛就像大自然的一个隐喻,当果实或水果成熟之后掉落于地上,即象征着某种结束或者死亡,也暗示着新的开始和下一个轮回的可能。
  • 事实上,当function也就是函数return返回值的时候,返回的自然是函数运算的最终结果值,这个结果result,即可以看作是像秋天掉落于地上的果实一样的东西,也可以看作是种子的撒播,是火种的延续,是新的希望的开始。

函数或方法的调用执行,其实是相当悲壮的。因为,通常来说,函数的入参或它内部定义的变量,通常都是局部变量,当方法执行或运行完成的时候,所有的局部变量都是会要求销毁的,对于调用者来说,他要的,不过是一个结果而已,无论什么样的编程语言,大体都是如此,目的都是如此,从上帝的视角来看,设计者对于函数或者方法的设计来讲,其实就是一个黑箱原理在约束它,因为它最终要面向使用者或者最终用户,过程不重要的,重要的是以特定的输入得到特定或者相应符合要求的结果,如此而已。

这一点,也符合软件测试的特点,无论程序员写的是什么样的函数,写的函数内部是怎么样实现的,这不重要,程序员的测试,通常是白盒测试,测试好了,最终走向的是黑盒测试,是用户最终的验收测试和实际生产场景的最终检测,过程不重要,你的老板和你的用户会说,客户是上帝,老子就是上帝,不要跟我讲过程,我要的,只是结果,而且,青苹果、红苹果、烂苹果,青苹果我不要,烂苹果我也不要,我只要好的、合格的以至优秀甚至卓越的【红苹果】,是的,他们要的是那个秋天的苹果,而且是好的苹果,苹果树是如何生长的,青苹果是如何变成红苹果的,客户并不关心,因为他是码农的事情。总之,老板和客户通常要的,就是性能卓越、功能强大,往这上靠,就对了,这就是现实的残酷和历史的大势,这就是上帝的视角。

在这里插入图片描述

由此可见,如果我们说函数即方法,那么,最后,万法皆空,唯因果不空。函数中的入参,通常不过是一份拷贝罢了,函数的结果最终以return的形式达成,给到了调用者,最终走向了老板、客户和上帝,走向了市场,走向更深层次的优胜劣汰和更大规模的大浪淘沙。

在这里插入图片描述

lifecycle n.生命周期 //= life n.生命 + cycle n.周期;循环(通circle n.圆)

那么,return的技术本质是什么呢?是的,是结果(result),具体讲其实就是数据;这个返回的数据,就是所谓函数(function) 功能(function) 实现(implement) 的现实体现。对于国人来说,这里的实现的【实】和结果的【果】,合起来,就是程序员的劳动【果实】,也就是function或者f(x)=y的 f-这棵树上掉下来的果实。当原有的花、叶、果都已经掉落,甚至当老树也已经枯死,并不意味着return的结果在业力轮回之中会完全消失殆尽,因为这些结果可能会被层层调用或者使用,产生新的业力,故所谓万法皆空,唯因果不空,从小千世界到大千世界,轮回相续,业力总会存在。

我们始终应当明白,长江后浪推前浪,前浪死在沙滩上,前浪虽死,后浪却也层出不穷,人间万事轮回相续,生虽有涯,其往却无涯,上帝的天空,永远深不可测。

function add(a + b) {//春天播种
	var result = a + b; //夏天耕耘
	return result; //秋天来了,该交待结果了
	//冬天静悄悄,还要做垃圾回收,将最终销毁局部变量 a、b、result
}
add(1,1); //这都是轮回啊
add(100,200); //这是命啊,老子就是做加法的命啊

总之,函数和方法,不过是实现特定功能的方法和手段,return的result,才是目的。

在这里插入图片描述

其实,人的一生,何尝不是一个函数,赤条条来、赤条条去,大梦一场空,不要说一切都是身外之物,就连这身,最终也是要化作泥沙,化作风尘的。但是,正如海子所言:当我痛苦地站在你的面前,你不能说我一无所有,你不能说我两手空空。MD啊,我是个函数啊,来过,活过,恨过,也爱过,就足够了嘛…

在这里插入图片描述

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值