图灵机?语言的演变
自然语言
自然语言的产生,是自顶向下的。
天地玄黄,宇宙洪荒
人类有意识开始,这个世界就已经存在了。世界太大,人类只能管中窥豹,人类尝试记录下所见所闻,语言逐渐出现。
世界随着时间变化,语言描述万事万物,不自觉的打上了“时间戳”。
于是,天地玄黄,宇宙洪荒!
物体抽象,逐渐细化
- 万物抽象成语言,语言描述世界,随着人类对世界了解的深入,语言抽象的概念也就越发的精细。
- 为了精确的描述世界,基础学科发展起来,而这一切理论,可以用语言表达。
名词形容词和离散数学的世界。
于是,“鸟飞”逐渐变成了“一行白鹭上青天。”
世界动起来
某一个时间点(切片),世界万物都处于某一特定状态。一系列时间切片连续起来,世界就动起来了。我们将物体一系列状态的改变抽象为“动作”。
动词副词出现了。
不确定的人类语言
- 人类本能
同一种群的人类有着相同“知其然不知其所以然”的本能,表现为情感,冲动……
已经习惯了语言环境的人类制造词汇描述之。这些词汇有着强烈的“主观意愿”。
- 抽象的概念
饱暖思淫欲,务实的人类集团中出现了新的工种:思想家。
思想家制造词汇,通过语言来阐述思想。
计算机语言
已有自然语言描述世界的经验,计算机语言在“精确”的基础上发展开来,计算机语言是自底向上的。
为数学服务
计算机被创造出来了,一切为了数值计算。
动起来 — 面向过程
计算机语言进一步发展,定义一系列动作。
程序员总结出动作之前的状态对于动作之后状态的影响。编制程序,按部就班的运行。
计算机帮助运算,就是面向过程的语言。
计算机世界 — 对象和实例
计算机语言进一步发展,使用计算机语言描述物体。
其核心思路是抽象出物体的属性、物体能做的动作、物体之间的关系,写入计算机语言的“类”中(封装)。在程序运行过程中将类“实例化”为计算机“实物”(对象),进行处理。简言之,计算机语言描述物体称为类,计算机世界中实有(运行时)的物体称为对象。
面向对象语言借鉴了自然语言的特性,支持物体的细化(类定义过程的继承,运行时的多态)。
程序运行起来,由一系列对象构建出计算机世界。程序使用者驱动对象动作,观察结果。
开放的生态系统
编写面向对象程序,是用计算机语言创造世界。程序运行时,先有对象才能动作。换句话说,面向对象设计的系统是闭合的。程序员必须完全了解对象才能完成最终叶节点的类设计。
事实上,人类创造的计算机世界是依赖于物理世界的。人类观察世界越深入,对应的计算机系统越复杂。对物体了解的细化导致了类设计的细化,由此的改变是多方面的:
- 自然语言叙述故事
鸟会飞(已有知识库)。有一只鸟(实例化)在飞(动作)。
白鹭是鸟(进一步认知总结,归入知识库)。那只鸟是白鹭(进一步观察的细化)。
结论:白鹭在飞!
- 面向对象不支持,故事只能这么叙述
鸟会飞。白鹭是鸟。(系统知识库)
有一只白鹭(实例化)。它在飞。
有一只白鹭(实例化)。它在飞。
- 自然语言陈述,物体在了解逐渐细化的过程中,仍然可以做动作。而面向对象语言必须明确物体是什么才能动作。
闭包的面向对象计算机语言和开放的自然语言差异由此产生。
自然语言和计算机语言从设计伊始便存在不可调和的矛盾。
向自然语言靠拢
自底向上还是自顶向下?
不可承受之重
词典(或维基百科)对事物的规约没有错误,却总是不够全面。即便如此,词典的解释仍然符合常人的认知需求。所以,“通用的”系统还是很“通用”的。
随着认知的深入,当通用系统不那么通用的时候,对计算机系统提出新的需求。
计算机系统新需求的实现必然要求更新旧系统对象的代码。
系统是由很多“编码工人“实现,编码风格互不相同。
系统持续的升级,在海量补丁和不同代码风格混杂的基础上,代价巨大!甚至,现有系统架构无法满足升级补丁的需求,或者升级的代价大于重写的代价,最终选择重写系统。
面向对象的有效补充 — 面向方面
面向方面概念的提出是将“一系列”事物共性抽象出来,由这些共性形成的和事物无关的动作。这样描述的抽象概念形成所谓的系列事物独立的“方面”。
面向方面的提出是为了减少代码冗余,分离出独立于业务逻辑的公共方法和属性。
严格来说,面向方面只是一种“架构方法论”。
严格来说,面向方面只是一种“架构方法论”。
对于上面的例子,面向方面可以这样说:
鸟会飞(系统知识库)。有一只鸟(实例化)在飞(动作)。
白鹭是鸟(鸟类品种“方面”的规约,归入系统知识库)。那只鸟是白鹭(代入实体)。
但是,面向方面不能做出“白鹭飞”的动作,因为实例化的是“鸟”而不是“白鹭”。
为什么还要对象?不如面向属性
面向方面为“人类认知体系的细化到计算机系统的升级”给出了一个可能的思路。
事物定义随着人类对其了解的深入而改变,是“相对”的。
人类对事物深入了解的过程是对“属性规约”的进一步细化。“属性”本身的定义是“绝对的”!
在对世界的探索过程中,不同属性规约区分物体产生语言词汇(事物定义)。
符合正常的语言习惯,陈述到哪一步,物体的规约就到哪一步。换句话说,不是物体决定属性规约,而是具有了这些属性规约,那就是这类物体。
基于现有的规约就可以做动作。由于规约是相对的,所以动作的结果也应该是相对的。动作带来属性值的变化,关注动作输入属性和输出属性,现在的函数式编程就是这个思路。但函数式编程是绝对的,而属性关注的可以是相对的。
可以一直细化被描述物体。
如果计算机语言具有以上特性,开放的计算机生态系统就可以被构建起来。
关键字 图灵机?语言的演变
推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架