‹  返回课程

第1章《启蒙》. 从C到C++,谈谈人类的编程思维

课文
阅读量:144
技术范畴
核心内容:一,面向过程、面向对象、二者关系;二,C、C++以及二者关系
课前导言
理解语言的设计就是在“机脑”和人脑之间寻找平衡的一种游戏,你会从根子上更懂各门语言。
第1章《启蒙》. 从C到C++,谈谈人类的编程思维
从人类思维习惯的角度,理解高级编程语言,理解C到C++的变化

0. 引子

想要对着机器发号指令,但又不直接使用“机器语言”,我们就会想制定一门比较符合人类思维习惯的编程语言,然后再用“翻译/编译”器将它转成机器语言。简单地说,就是一个使用C(中间工具)将B(接近人类思维的语言所写的代码)转换成A(机器语言)的过程。

那么人类有什么思维习惯呢?比如人类都喜欢 “先入为主”,所以我们制定的新语言一定要每一个单词都看上去很惊艳;再比如,人类都容易“喜新厌旧”,所以我们的制定的新语言一定要三天两头就升级一下;再比如现代人做事都超爱“拖延”,所以我们制定的语言一定要让人容易用着用着就上瘾……

这些都是胡扯。

应用在编程这件事上,最广泛的人类思维习惯或思维模式有:“面向过程”、“面向对象”等。

 

1. 面向过程

日常生活中要完成一件比较大的事,是不是就习惯将大事分解成多件小事?即:把一个相对大(复杂)的办事过程,拆分成存在时序关系的多个小过程。比如:家族主妇想做道菜,可以将做菜的事分成:备菜、炒菜、上桌等过程。其中备菜过程,又可以细分出买菜、洗菜、切菜等等。对应到编程语言,通常用“功能函数/function”代表过程,也有的语言更是直接对应到“过程/procedure”,所以面向过程被提前为“PO”,即“Procedure Oriented”。

 

2. 面向对象

面向过程的思路很直观(不就是大事化小,小事化了嘛!),但是,当一件事情庞大、复杂到某种程度时,你恐怕无法在一开始就有条理地梳理出到底需要多少过程。比如:你被全国人民推选为总负责人,规划一届奥运会工作,这时的你要怎么做?简单地试图将这件事从大到小分到很细,然后开始推进,成功概率不大。

“面向对象”的设计思路是,先考虑这件事情中需有些对象,这些对象又如何分类。比如当奥运会负责人(以下称为大总管),你得想到得有负责管钱的,于是要找财务类的人才;得有搞开幕式的,于是要找文艺导演类的人才;得有负责场地的,于是要找建筑类人才;得有负责安全保障的,于是找安保类的人才。哦,差点忘记了,还得有管体育的,于是找体育类人才……

然后,每一个类的人才应该具备什么才华或功能,你得严格定义。比如人家问你:“尊敬的大总管啊,我们需要什么样的文艺导演人才呢?”。你稍作思索回答说:“嗯,像张艺谋这样的人才,要一打!”。你别笑哦!在编程语言的世界里,这就叫“原型法”——使用某一个现有的原型来作为这一类对象的类型描述——不过C++是一门很“老学究气”的语言,它觉得“原型法”有点偷懒,对类型的描述也不够纯粹,所以它会给你几张白纸,让你认认真真地把你所要的“优秀导演”应该具备内在特性和外在功能,都描述出来,这就叫“类型”的定义。一旦定义好了,大家就拿着这个定义“按图索骥”去也。

你觉得定义类型有类麻烦……这时又来一人,问:“尊敬的大总管啊,我们需要什么样的男性足球人才?”——你猛然发觉全全国13亿人中找不到一个像样的原型(榜样)。好吧,我们还是认认真真地来定义心目中的优秀足球人才吧。

(以上内容在实际出版面市的书中,因某些原因已被大幅删除)

体育、文艺、安保、财务……每一类人才的才华表现(内在素质、外在能力),你都需要定义,在编程中称之为“类型(class)定义(define)”。 一旦定义成功,就可以依据该定义去寻找、甚至是生成(比如通过培养)符合定义的具体的人员。抽奥运这种大事,光有人还不够,还需要有各类物品。有人和物还不够,因为人和人之间,人和物之间,物和物之间还有错综复杂的关系,这些“关系”往往也对最后结果的成败有重要或关键的影响……所有这些人、这些物、这些“关系”,都可以被称为“对象/Object”……等一切梳理得差不多了(这里的“差不多”没有多大的贬意,因为你可能真的无法一步到位完全理清,写程序也是如此),事实的舞台就交由这些“对象”而运转起来……

 

【开心一刻】关系、关系、关系!

“大总管!奥运会搞砸了……”

“这不可能!我兢兢业业、废寝忘食、翻遍百科全书、阅尽人间万事,定义了所有可能在这场盛会中出现的事与物!怎么有可能搞砸!!!”

“您很辛苦,也很伟大……但是尊敬的大总管啊,您在会场摆放的那种来自青藏高原神秘的花朵散发出来的香味,和您刻意安排在观众席上来自非洲负责喝彩的‘托’们的掌声发生了某种奇怪的生化反应……”

“嗯?怎么啦?”

“也不知道怎么啦,反正运动员一上场就会发情。”

 

抽象归纳一下:面对复杂问题时,我们可以先关注问题需要涉及哪些事物,并对事物进行分类,即定义事物应该具有的功能,再梳理这些事物之间的关系。这样的解决问题的思路,就叫做“面向对象”,称为“OO”,即“Object Oriented”。

3. 面向过程与面向对象的关系?

“面向过程”和“面向对象”两个思路并不冲突。采用“面向对象”时你的分类或梳理关系的过程,自然而然是一个分大类,再分小类的过程,而对象在执行某个很具体的功能时,必然也是一个由大到小化解事情的过程。反过来,如果坚持用“面向过程”解决复杂的问题,也会自然而然地(其实是被迫地)先对事物对分类,然后再按分类结构,借助具体的载体(比如源文件)将与同一类事物相关的过程和数据,归在一起。

4. 从C到C++

C语言在人与机器两极中,往人这一头迈出非常优雅的一小步。这是C语言自身的一小步,也是编程语言史上的一大步。因为历史机缘,也因为语言自身优秀,C是一众“面向过程”语言中的王者,已经成为许多重要基础软件的主要编程语言,比如操作系统,比如编译器,还比如用它来写其它语言。

在符合“人类”思维这一端,C语言以“面向过程”为思路,同时提供清晰、简单的语法规则。它语法规则直接影响到几个重要的后来者,如:Object C、C++、Java、C#、D、Go 语言等等。

在接近“机器”特征这一端——比如当我们需写硬件设备的驱动时——C语言甚至被称为“中级”语言。原因在于它非常优秀地反映了机器,尤其是“内部存储器”的特征。因此它很能够又快又好地被编译成汇编、机器语言。因此它很快在许多机器上,代替了汇编语言,成为操作系统、编译器的首选语言。

尽管我们吹过牛,说许多高级语言都由C语言写成(这当然不全是事实),但这其中与C语言之间最有延续、兼容关系的,当数C++。或许从名字上就可见一斑。最初C++甚至被叫做“C with class”,即“带类的C语言”。这里的“class/类”,就是前面介绍面向对象概念时提出的的“事物分类”的“类”。没错,C++是一门支持“面向对象”思想的编程语言。

编程语言的发展,从“低级”向“高级”不断发展。“低级”指的是“机器”这一端;而“高级”指的是“人类”这一端。这中间有两个非常重要的原因。一个当然是机器的硬件性能越来越好了,撑得起将高级语言转换到机器语言的代价,另一个则是人类寄希望于计算机程序帮助解决的问题,越来越复杂了。问题越复杂,解决问题的逻辑就越复杂。尽管我危言耸听过“机器人要取代人类”,但毕竟那还没有发生,所以解决问题的逻辑还是需要人来写成“指令清单”(程序),所以人类一直改进编程语言向人类自身的思维模式靠近,就很好理解了。

人类需要计算机帮助解决的问题有什么?上到太空飞翔的,下到海底潜伏的,中到你手上拿的手机,都离不开计算机程序。更典型的如:财务人士希望用软件管账、人事专员希望用软件管档、厂长希望用软件管理生产;老师希望用软件管成绩,还有前面提到的开办奥运会……这些事情可能不需要用到复杂的数学知识,但它们都会涉及许多事物(对象),对象分成许多类型,类型之间、对象之间关系很啰嗦。尽管C语言是写操作系统、写编译器、写其它语言的首选,但在处理这些人间事,需要很高级的程序员,这世上没有这么多高级的程序员,所以只能由高级的程序员写一些高级的编程语言以供不是那么高级的程序员来编程。

【重要】 C++语言难学又难用吗?

很多人说 C++语言又难学又难用,我只赞同前半部分,其实C++语言学会以后,至少比 C 语言易用。在面对超级复杂的角色(类型、对象)与关系时,能用 C 搞定的人,差不多得是活得“大彻大悟”的程序员,这样的程序员越来越难找了。

如果说C语言成为IT世界地下100米基础的奠基者,那么C++语言就是IT世界地面所有高楼、公路、桥梁的建筑者。全世界用于写电子文档的主要办公软件,比如微软的Office,或我当前正在写书的金山WPS,或者跨平台的 OpenOffice,是用C++写的。写文档如此,播放音乐的软件也基本是C++写成。著名的图像处理软件PhotoShop是C++写的。你上网用的许多浏览器也是、你在电脑上聊天用的QQ、MSN也是,更有大量的网络组件、消息通道、后台服务也是C++写的。

我不知道您为什么要学习编程,更不知道您为什么要学习C++。不过是时候交待一件事情:选择C++作为我面向编程初学者的第一教学语言,不是我只懂或只擅长C++,而是因为我一直认为,过往五十年和未来至少再十年间,编程一直是一件必须在“人”和“机器”间取得平衡的事,所以找一个有着对应的位置的编程语言起步,是明智的。

我们必然通过C++学习和实践“面向对象”的编程思想。然而,C++是一门集大成者的语言,不仅支持“面向对象”、也支持 “基于对象”、“面向过程”和“泛型”的编程思想。从这一点同样流行的Java或C#相比,C++不算是纯正的“面向对象”的编程语言,但这正是C++所追求的,也是我所推崇的:“你不可能用一种思想,解决所有问题”——宣称用一种思想,就可以解决世间问题的,那不是编程语言,那是……算了,你懂的。

下一节:什么是编译器、调试器、IDE

写程序先得敲代码,想象你是某公司的一名高级程序员,十指在键盘上啪啪啪的……边上正巧路过的女神,听着都脸红了。然后因为你写的是高级语言,所以还要编译,结果一编译,出了一堆的错。女神一看,脸红了又绿,绿了又红,心想:“晚上我得和老板说说了,公司怎么干嘛要花3000元的高薪请这些个沙雕们……”

课后补充

下一节:什么是编译器、调试器、IDE

写程序先得敲代码,想象你是某公司的一名高级程序员,十指在键盘上啪啪啪的……边上正巧路过的女神,听着都脸红了。然后因为你写的是高级语言,所以还要编译,结果一编译,出了一堆的错。女神一看,脸红了又绿,绿了又红,心想:“晚上我得和老板说说了,公司怎么干嘛要花3000元的高薪请这些个沙雕们……”