程序语言的自我意识与仿他意识

本文探讨了程序语言中命令式编程与函数式编程的区别,通过浮点数比较的问题引出两者在认识事物方式上的差异。文章深入介绍了表达式是否为数据的争议、高阶函数与惰性求值的概念,以及lambda演算在函数式编程中的重要性。通过实例展示了函数式语言如何实现自我描述和自我演进,并讨论了图灵停机问题,揭示了计算模型之间的等价性和不动点定理。最后,作者指出命令式与函数式语言的融合是编程技术的发展趋势。
摘要由CSDN通过智能技术生成

 

1从浮点数说起

昨天有一位网友问我一个问题,为什么表达式“1.9 + 2.3 == 4.2”在Python中计算结果是FALSE?我回答说,计算机模拟浮点数时会失真,网友说这个他明白,但为什么“1.9 == 1.9”结果却是TRUE,机器看1.9也同样失真呀?实际上,两个表达式是有差别的,前者在比较之前运算了,而后者没有。

这是一个很有趣的问题,如果我们把电脑看成有感知的生物,上述问题反映了人脑与电脑是按不同方式认识事物的。首先,电脑总是以2进制表达数值的,而人脑习惯使用10进制,比方被人脑标识为0.125的数据,到电脑中就被看作0.001,即“0/2 + 0/4 + 1/8”。这两种方式都能唯一表达浮点值,本例中,两个浮点值能在10进制与2进制之间顺利转换,但不幸的是,大部分10进制浮点数无法准确的转化成2进制,比如上面的1.9,在Python程序中,它显示为1.8999999999999999。当然,这个数值还不是电脑自己认为的值,它经过两次转换,第一次是我输入1.9后,电脑把它转换成它认识的2进制格式,第二次是电脑要告诉我它接收到的值是多少,又把2进制数据转化成10进制打印出来。

其次,电脑总尝试以最精确的形式表达一个数据,而人脑往往以简单形式表达复杂数据。比方,老板告诉你,“好好干活,这事成了分你三分之一利润”,如果老板长一个CPU脑袋,又很有偏执狂精神,他可能告诉你,“好好干活,这事成了分你0.3333333333333333...”,幸好本人还不太偏执,否则,我一辈子不用干别的,把这句话转述完就安息吧。

Python中计算“1.0 / 3”得到结果值是0.33333333333333331,这是32位电脑对现实认知的最精确形式,而我们拿“1/3”来表达,为什么既省事,又精确?这里“1/3”不只是数值,还隐含了一种计算:先3等分再取走1份。之所以精确,因为它是自描述的,我们还原了它的本来面目,就像宋玉在《好色赋》中形容东家美女,“增之一分则太长,减之一分则太短”,如果提高浮点精度,不论32位、64位,还是128CPU,存贮1/3最终都要截除尾数,都无可避免的要失真。

我们先确立两个概念,其一,某种形式化的计算过程,等价于静态数据;其二,自我描述的数据可以不失真。

2表达式是不是数据?

1/3是自描述的数据,同时它还是一个可计算的表达式,我们推而广之,是不是所有表达式都是数据?这是一个见仁见智的问题,应该没有标准答案。

应用程序本来就是对现实世界一种模仿,编程语言只是实施模仿的辅助手段,要不要把表达式看成数据,完全在乎你——编程主体,以及当前依赖的环境——开发工具,需要采用哪种方式会更好达成目标。这句话有两层含义,首先,编程环境可以影响一个表达式该不该成为数据,比如,在C语言中,表达式是表达式,它最终编译成运行代码,数据是数据,编程中可直接读写。而在LISP语言中,表达式也是数据,既用于运算,也支持直接读写。此外第二层含义,即使开发语言很大程度上决定表达式该不该成为数据,却不绝对,还与应用相关,比如某些防跟踪软件,即使用C语言开发,也局部的将运行代码看成数据,运行中动态修改,让它在反编译工具变成花指令。

表达式是不是数据,是函数式编程(Functional ProgramingFP)区别于命令式编程(Imperative Programming)的重要差异,也是根本性差异。按严格定义,函数式编程把程序的输出定义为其输入的一个数学函数,只有把函数调用也看成数据,中参数中层层串接,最后才组装出完整的程序。比如:if..else句式,使用函数式语言表达如下:

else(if(expr,TRUE_branch),FALSE_branch);

外层调用else函数时,先计算第一个参数(即if函数调用),如果if条件成立,执行TRUE_branch语句并返回TRUE,否则直接返回FALSE,接着else函数分析if调用的返回值,决定FALSE_branch语句是否要执行。这个例子我们看到,把函数用作参数,可以连接多个运算。

按严格FP定义,函数式编程没有内部状态的概念,而命令式编程要频繁使用赋值语句,用变量保存内部运行状态,比方if..else在命令式语言(如C

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值