我说面向过程(以C为例)与面向对象(以Java 为例)的世界观,本质上并没有不同,因为他们都认为“世界是由事物组成的,运动改变着事物的状态”。至于“事物”是用变量表示,还是用对象表示,至于“运动”用过程调用表示,还是用消息传递表示,这只是“方法论”的不同而已。
而我说的函数式(以Lisp为例)与逻辑式(以Prolog为例)的世界观,本质上也没有不同,因为他们都是认为“世界由运动组成,事物改变运动的轨迹”。至于“事物”是用数据表示,还是用条件表示,至于“运动”是函数表示,还是用逻辑表示,这也只是“方法论”的不同而已。
------------------------------------------------------------------------------------
此说法倒与我的有相通之处,我也向来把函数式和逻辑式做同等看待,而把常说的命令式编程称为过程式(procedural)程序。
这里的观点说得感觉还是有些含糊。
函数式和逻辑式都是在围绕“是什么”的问题,而过程式围绕的是“如何做”的问题,两者之间其实并不是水火不容,而是有非常多的联系。现在由于函数式,并行编程的兴起,将副作用,共享状态视为洪水猛兽,实则是因为纯函数式和逻辑式没有找到很好的解决状态迁移的方案。
函数式风格的编程,在非常多的时候,很难照顾人的直观思维方式,这也是为什么c和java仍然拥戴者甚多的原因。逻辑式编程,就更为明显,很多时候,问题的逻辑建模不成功就没法写出代码,而如果改用过程式,尽管代码冗余难看,难以复用和维护,但只要写下去,就能一点一点的达到目标。
真正的出路,是有一个系统能够将两者以恰当的方式融合在一起,各司其职。至于面向对象,是一次不成功的尝试,类和对象的声明,实际上是一种逻辑声明,而其操作,又是过程式的。
我现在总结归纳的模式是这样:
1 世界的每个时刻都对应一组事实。
2 这一组事实构成一个事实空间。
3 事实空间在不断发生变化。
4 事实空间已经发生的变化模式称为事件。
5 事实空间可能发生的变化模式称为动作。
6 执行动作的结果就是按照动作给定的描述,改变当前的事实空间。
7 世界就在事件-动作的无限循环中向前发展。