02 January 2008

CS Abstraction

一.万事万物皆抽象

1. 人的智力是有限的,世界是越来越复杂的,人之所以能够用有限的智力建设并操控越来越复杂的世界靠的是层层抽象。

2. 原理:(建造大楼为例)

a. 最原始的状态:人的所有精力都放在研究制造砖头上,此时没有也不可能顾及如何造大楼(因为人的智力是有限的)

b. 砖头造出来后,人就不再考虑砖头,把砖头当作原料进行更高一层的抽象,开始把所有精力放在用砖头造墙上。

c. 墙造出来后,人就不再考虑墙,把墙当作原料进行更高一层的抽象,开始把所有精力放在用墙造房间上。

………………

最后造成大楼。



计 算机科学,层的概念特别突出(与其自身复杂性有关),例如:汇编层、高级语言层…,操作系统层、网络层…,每一层都有自己关心的问题、对象及处理方法,并 对低一层的结论成果等直接拿来用,而不考虑其构成(那是低一层次要做的事)。面向过程编程中的自上而下层层分解的方法,也属于此范围。

每一个单独的层面如果仍十分巨大的话,还可以按逻辑功能把这一层分成一个个独立的模块,使思维规模进一步缩小。比如在操作系统层面,可以分成:引导模块、中断模块、进程处理模块。。。

不按照每一层面每一模块上特定的规则处理问题,企图越过层面和模块办事,必然会引起混乱。

进一步说明:在做操作系统时,主要考虑的是机器的组成,工作方式,指令集,在操作时也主要使用汇编和c这样的底层、细微的工具。高层面的概念不用考虑。

而在操作系统的基础上做应用开发时,主要考虑的是系统提供的功能调用,问题对象的描述等。使用的工具也是更高级的,如object pascal,c++,basic,python等等。低层次的概念如寄存器、内存地址等概念不需要考虑(不一个层级,属于低层)。

问题的粒度不同,使用的知识与工具也不相同。

不可纠缠于细节,应该在一个层次上熟练以后,向更高级的层面延伸。如在汇编层面掌握以后,应该用汇编的知识开发操作系统和高级语言编译器(如c),然后向操作系统和高级语言层迈进,在这个层面熟练以后,应该开发组件和解释型语言,然后向这个层面进军。




当你被各种新奇的概念、瑰丽的界面和无休止的名词弄的筋疲力尽的时候,闭上眼睛,想象一下内存中机械的、冰冷的一条条高高低低的电位指令,想想地址、寄存器、callmovinout指令,你会发现:所有概念都是人自己创造的,真实的世界原来是那么的单纯明了。

·高级语言如:cc++java,都是假的。高级的概念如:段、对象、组件都是假的。他们最终都要变成内存中一个个机器指令(电信号)。

·闭上眼睛,想象下操作系统、dll模块、编译器、链接器、载入器、各个api函数、在内存中都是一块一块的指令集合。你编的程序进行编译、链接、装载、系统调用时,其实就是在这些指令块里面callret去,就是跟这些地址打交道。看看c函数编译出来的汇编吧,就是push,然后call

·当你试图弄清一个层面的问题时,往往需要借助更深层面的知识。比如c语言的函数其实就是汇编里的几个pushcall

·程序的本质在“序”。几个简单的有限的东西通过不同的排列(序),可以构成复杂而强大的东西。比如26个字母构成英语、简单的机器指令构成缤纷的软件。(这种思想是朴实而自然的,比如简单的砖头和泥灰可以盖成各式各异的建筑,简单的原子构成复杂的世界。古代有“道生一,一生二,二生三,三生万物”的说法,可见,图灵的通用计算机思想也没有什么新奇之处。)

·计算机学科的基石。

思想方面:

1. 协议。就是大家都遵从的一种约定,这样才能把力量用在一处。数据结构也是协议。

2. 模块化。把能复用的东西,抽出来,避免重复劳动。子程序(过程,函数),就是最好的例子。

·人应该做有创造性的工作,单调重复乏味的事情让计算机去做。

No comments: