关于抽象
最近放假了,比较轻松, 偶在csdn上转转,发现有不少人问到抽象的问题,给出的解释却是五花八门。偶也没看到什么很合理的解释。再次回学校就要带一帮还处于蒙昧的WorkMates了,哎,肯定要碰到各种各样的问题。所以偶发表愚见,讲讲抽象。
抽象,其实并不深奥。我们生活在一个完全抽象的世界里,任何东西,所看所讲所用所写,都是抽象化的事物。有书里云:抽象是“撇开特定对象或现实事物而表现事物本质的思维”。这样写似乎有些不好理解。 在我的脑子里,抽象是属于任何事物的,不管你多小,宏观上或者是微观上,都建立在抽象的基础上。 换言之,我们所关注的,也是抽象。(是不是很糊?)
人们总是不愿意去了解事物的本质,他们需要的只是一个良好的接口与用途。你总希望眼前的是人,而不是一堆器官或是一堆血肉骨头。你看到的总是汽车,而不是一堆零件。我们不需要去了解他们的构成及原理,只需要使用就行了。并不是只有你种地才能吃饭,你生产汽车才能开车,你写软件才能使用。这是一个交流的世界,在互动的交流中,没有什么东西是完全属于自己的。
甚至在微观上,所有个体也都是抽象化的。物理学家,化学家他们可以研究很小的个体,这些个体对我们已经够小了,但是,它们依然包含属于自己的多种属性,如名称(取的),寿命,大小,以及各种特征。我们生活在一个抽象的世界里,Anything is an object!
有人说:“计算机科学是抽象的科学”。这句话非常的贴切。虽然数学是抽象化的,但他并不实际化,是一种思维。而计算机,程序设计却是为了表达这个真实世界。在一定意义上,它是完全抽象的科学。
在计算机的早期发展中,计算机程序只是为了计算。它本质上拥有的东西只有0和1。可以说,0与1就是计算机世界里最具体的事物了。使用排列和组合的知识,我们可以知道用0和1可以表示多少种状态,多少种事物。但是这是远远不够的,虽然我们是程序员,我们需要了解本质,但是总不能每天和0,1打交道吧。于是,我们需要抽象化这些0和1,使他们更亲近,更便于使用。于是,我们有了变量类型,一种抽象数据类型,它是名称,地址,值,寿命,范围,类型,大小等属性的集合体。哈哈,有了这个,我们就可以方便点的描述一些事物了。如果用0和1,把2KB的数据由你进行处理,那可真不是件简单的事。
后来,计算机进一步发展,这一点点的抽象实在不能满足发展了。为了更高效的处理事物和开发程序,出现了汇编语言。这当然比机器语言要好的多了。汇编语言是一种相对高一级的抽象。它使用了比较形象化的符号,类别,以及控制结构来帮助开发。很显然,汇编语言是成功的,它甚至成了历史上的功臣。直到今天,我们分析程序的时候,为了解透彻都会去查看编译产生的汇编码。
历史上的教训说明,科技推动生产力, 生产力也推动科技发展。汇编推动了计算机发展与使用,而计算机的超速发展却使汇编的弱势显现了出来。(这多象女人的胃口,永不知足)由于汇编语言产生程序需要的指令集太多,开发周期太长,实在难以满足越来越快的发展速度。汇编虽然高效,可依然过于具体化,难以理解。我们不能指望靠它在短期内完成巨大的任务。
于是,高级语言出现了,这一出就是五花八门,被广泛接受的却没有很多。但是出于本质,他们都是更抽象化的语言,他们更抽象的描述了事物而撇开了本质。这使我们可以把精力放在更为常规的东西上而节省大量的时间。当然,事情都有好的一面和坏的一面,计算机语言革命上每一个进一步的抽象都会牺牲效率。但这是关系不大的,硬件的发展可以很好和语言的发展达成平衡。
偶只学过c, c++等,所以偶也只拿这几门语言来说说愚见。C拥有的东西并不多,很象低级语言,所以保留了很好的效率。真正相对与低级语言,多了结构控制,函数,宏等。结构化程序设计也在那一时刻兴起。这是真正意义上的革命,它得到了无限开发者的支持,现在仍然是开发者情有独钟的语言之一。Linux等操作系统的开发更是证明了它的强大。C丰富了抽象的进程,可以足够强大的描述几乎任何事物。函数,其实是代码块的折叠来完成一定的抽象。这和生活中很象,我给你零件,你不可能造出计算机;但我给你配件,你该知道怎么装吧?抽象真好啊!是吧。
C
里有很多的抽象数据类型,他们都独当一面,能很好的完成对事物的处理。真正意义上,C可以做任何东西,只有有足够的时间与条理。但是,C是一种过程式的语言,他关注的是完成事情的过程,而不是对象本身。所以C里函数是完成结构化的重要工具,正是因为他太关注过程,所以成就了它的弱势。使用C的开发者发现,用C进行大规模程序开发依然面临着巨大的问题,管理,测试,名字管理,接口与交互等都是在大规模程序中的瓶颈。
后来为了使对过程的关注与对象关联起来。大规模的程序里大量的使用了结构体与和此结构体相关的函数来模拟对象编程(Win Api里这样使用)。这在一定程度上解决了问题,但是,纸是包不住火的,终于这种模拟的管理性,安全性,以及空间分配上出现了大量微妙的问题。开发者需要大量的时间来进行维护和测试。所以,这肯定意味着又有革命要出现了。
C++的出现让世界发生了变化,这个混血儿,现在得到了蓬勃的发展。C++相对与C也没有很多自己的东西,他最大的革命是多了面向对象的因素。而它对C的兼容使他保证了底层的良好支持,性能上的巨大优势。这是多么聪明的举动啊,喜新不忘旧。C++进一步的抽象化了C,他是面向对象的,也就是说,我们可以用C++来模拟这个世界了!而事实也说明了这一点,C++异常的强大表现在每一个方面。而他也是偶最喜欢的语言。C++可以足够强大的完成几乎所有事情,开发周期也不会太长。而更重要的是,C++的难学可以让你简单的接受其他语言。由于有了对象模型,抽象到了可以想象的程度,开发者可以关注于事件中的对象与交流,而不是事件的流程。这简化了程序设计,而且也必定是未来的发展方向。
可是C++本身也存在一些问题。就是因为他对C的兼容,导致他不能作为一种纯的面向对象语言而失去了很多东西。这在一个时代里是一种巨大的优势,但在时间的车轮下,任何东西都会出现“代沟”,C++也一样。由于其他关注于效率(其实是一个完美的架构),导致了他在进行常规化程序设计,大数据系统管理上的弱势。在非常巨大的系统里,如航班管理等,必须对每一种事物都有详细的消息处理,具有共性,以及分布式管理。C++在处理这方面是稍有欠缺的,他不够抽象化来快速的描述这些事件和开发。
所以,为了进一步抽象化来帮助开发。又出现了一些语言,如C#,JAVA等。当然,有得到肯定要有付出,为了完成更高级的抽象化,他们提供了庞大的类集,当然也都损失了大量的效率(都比C++慢20倍左右)。但它们更适合企业级程序设计,而且在未来,也必定会取得优势。(但在现在,C++是不可替代的,我保证,在未来10年里C++都不会没落。)其实计算机语言的发展就是不断的抽象抽象再抽象,让开发更简单,更高效。面向对象也许就够了,但是对象也有抽象化程度。如果你用砖头来做楼房,可以一块块垒起来。但更高效的做法是,使用可复用的住房模块。把这些模块堆起来,然后进行良好的耦合,得到的是同样的效果而且可以保证相当高的效率。于是更高级的抽象让我们把注意力从对象移到可复用模型上来。我们再也不用自己装电脑而只需要连线了!这里耦合是最大的关注点,如果你耦合的好,就能保证良好的对象间交互,如果你做的不好,这就是一个失败的设计。所以,现在书里大喊口号:“我们的目标是,复用,复用,再复用!”良好的设计模式造就了良好的可扩展性与移植性。
抽象是永不停息的,将来的有一天,我们能够对着电脑说,我要一个什么东西,什么样的,他就给你,或者是我能想到的就能得到。那时候语言的抽象化程度才算是足够了。也许偶们有生之年是看不到了。
好累a, 写了不少了,偶要睡觉了!希望才疏学浅的小生能给你点帮助。欢迎讨论批评。
------ 石头
本文部分参考<<数据结构与算法—面向对象的C++设计程式>>
<<C# How to Program>>
__________________
不可一日无酒无肉无女人