理解——语言的发展
上一节我们知道了什么叫“机器语言”,就是用断电和通电来表达0和1,而后在这基础上继续用0和1来表达更多的事物。
我们也了解到,曾经的程序员前辈们,编程时所用的语言,就是0和1:他们在纸条上画圈圈,然后据说有漂亮的女秘书负责在有圈的位置打孔。
因此,我们可以简单地得出一个结论:机器语言也是一种编程语言。
这样说来,是不是今后我们写程序,也就是在纸上不断地圈圈呢?可以想像,这非常枯燥、当然也非常容易出错。如果不信,你可以试试用身份证号称呼你同学、亲人及朋友,看看这中间需要耗费你多少脑细胞。好歹身份证号还用了10个数,好歹我只是让你用它来代表人名,如果要求事间万物都仅仅用0和1两个数来表达呢?
回忆一下,十进制15,在二进制里,就是1111,那么你想买一台价格为1500元的液晶电视呢,你和售货员可得好好数一下需要用到几个0几个1。
(小提示:在Windows的附件里,有一个计算器,它具备在十进制和二进制之间换算的功能,大家以后在编程时可能需要这个工具。)

(光用0和1表达表达的二进制数,往往很长,很难记)
所以,如果说编程语言就是机器语言的话,那我相信学生们会跑掉90%,剩下的10%倒也不是说他们具备大无畏的精神,准备跟0和1所带来的枯燥斗争到底,准备用0和1谱写新时代的程序之歌——多年来我“阅学生无数”的教学经验告诉我,这些留下的家伙多半是小色鬼,他们是冲着“用0和1写程序,据说有漂亮的女秘书……”,才留下的。
看来,用机器语言编程,是不太可能了,作为计算机的“机器语言”,它的作用并不是让两台摆放在一起电脑是,在夜深人静时互相聊点悄悄话;而是让人和机器沟通,但它太偏心了,完全倾向于让机器容易理解,而不顾人类的感受。所以我们需要继续发展编程语言,这就是本节课将要理解的内容:理解编程语言的发展。
正式开讲前,请特别记住一点:无论编程语言如何发展,机器语言都是它的根基,即程序最终在硬件上运行起来时,用的还是机器语言。
编译、解释、虚拟机
如果改进编程语言?问题既然是机器语言对人来说像天书,那么解决方法就是是重新定义编程语言,以使得新的编程语言往人类的自然语言方向稍微靠近些。再想办法写一个“翻译器”,用来把这门新语言“翻译”成机器语言。这很直观,不是吗?你爱上一位非洲土著姑娘,需要和她沟通,但你又不想去学习土著语,最简便的方法就是寻找一位翻译。
与自然语言之间的翻译不同的是:
第一、现实中你可以舒服地讲着你最喜欢的汉语,然后由博学多才的译者将其翻译成土著语。但在计算机世界里,我们至少在这100年间,指望不上你对着电脑叽哩咕噜地说上一通自然语言,就可以实现编程——如果这样就可以编程,那岂不抢了所有程序员饭碗?所以再往人类方向靠近的编程语言,也仍然带着浓浓的机器味,那就是:注重语义清晰,注重逻辑准确,注重可量化的数据。类似像女朋友冲你来一句:“讨厌~~”这种语言,估计永远不会出现在编程语言中。因为这简单的“讨厌”二字,含有太多不可捉摸的内涵,语义不清,逻辑不定,并且完全无法量化。
第二、由编程语言向机器语言“翻译”的方法有多种。 这便是本小节所讲解的“编译、解释、虚拟机”。
编译
第一种是编译。
土著人的爱情或许分外纯朴及火热,但据说也很危险,因此翻译的正确性至关重要。如果你当着她的面东拉西扯,边说边译,无论是你自己,还是你的翻译,稍有一句说错,触及敏感的禁忌话题,女婿当不成,说不定会被酋长煮了。
怎么办?就得靠编译了:你事先写封情书,不仅可以慢慢地字斟句酌,而且可以全盘关注,再多多学习当地文化,最终成就一篇让土著姑娘脸芳心跳的绝妙并且安全的情书,然后再请翻译家。翻译家还可以再把一道关,帮你纠更多的错,特别是语法上的错误。最终结果是一份已翻译稿,第二天交给土著姑娘让她自己看去。
这种翻译方式就叫做“编译”。英语单词为:“compile”。对应的,那个翻译家被称为“compiler”,即“编译器”。
“编译”的好处之一就是严格检查语法,以避免你的程序有太多基础性的错误,比如语法或者一些简单语意上的前后矛盾。当然,纯粹业务上的逻辑错误,编译器仍然无法判断出来的。试举一个例子:
假设,这位土著姑娘生长的国度里,有“梅花”、“玉兰花”这两种植物;但没有“水仙花”。
那么如你想赞美她“就像一朵玉兰花一样……”
如果你不小心写成“就像一朵水仙花一样……”,那么翻译家能够帮你查出错误,因为他在翻译时,发现在这个国度的语言里,找不到“水仙”这个词。
但是,如果你写成了“就像一朵梅花一样……”,尽管不是你的本意,翻译却无法帮你发现这个错误了。他只会直译过去,把姑娘比喻成什么花,这是你的事,翻译只管你所用到的花,在目标世界里,是否存在。
编程更是如此。你写一个小百货店销售程序,其中一段代码原意是客户一次购买500元及以上就返回100元购物券;但不小心写成购买100及以上返回500元;编译器是不会有任何狐疑的,因为谁敢担免你不是一位慈善家呢?
这样看起来似乎编译器不够聪明,但其实这倒是人类在强大的计算机面前保持尊严的保证。没错,计算机是精确的!反复地做一件事情1千次,人类可能会忙中出错,但机器一定是千篇一律的重现。 而这“精确”的意思,也包括它会精确地复制1000次错误——如果第一遍就是错误的话。
严格语法检查进一步带来好处是,它允许你采用的编程语言可以带有相对复杂的语法。而相对复杂的语法,一般就意味着这门语言可以更多的抽象逻辑来表达。这句话当然不是100%正确的,有时候复杂的东西反倒无能,简单的东西反倒强大。之间的关系,有些像飞机的复杂和拖拉圾的简单。飞机可以改装成拖拉圾——尽管别扭;但反过来想把拖拉机的设备改装成飞机,就更难了。
C++就是一门有着复杂语法的编程语言。但好在它的复杂度是“按需分配”的:你想用它在山路上跑,那么它就简单得像一辆拖拉机;你想用它来跨越大西洋,那它就复杂得像一架波音777。 |
“编译”的第二个好处,也是它最重要的优点是:性能。
编译是一次性的动作。你的情书只需翻译一次,那位土著姑娘随时都可以方便地,迅速地阅读手头的翻译稿,不仅不需你和翻译者的存在,而且她看一遍情书的速度,理论上取决她的阅读速度。我们写程序,当然是希望客户可以千万次地使用它,如果不用“编译”,那就只能永远客户需要时,就让翻译家翻译一次。
“编译”的第三好处,是部署程序上的方便。你写好的程序,可以很方便地安装在客户的机器上。这其实在第二点已经说明了。编绎的结果,就是客户最终能理解的程序,不必把你的翻译也留在客户家。
解释
和“编译”对应的,就是“解释”这种方式。此时,前面的“编译器”,这时对应换成“解释器”。
“解释”这种方式,和现实中的同声翻译比较类似,这个过程我们在讲“编译”时已经过有比喻,但在前面的比喻中,我们主要看到是它的缺点,这里先小结一下。
语法检查能力较差一些,因为边写边翻译。
性能差很多,部署也不方便。也是因为边写边翻译,并且每次要运行程序时,往往都需要再翻译一次。就像姑娘想再听听你的情书,就得把翻译和你都再叫过一次。你可能很乐意于留在那块神秘的大陆,但别忘了我们在说的是写程序。当然,一个常见的改进是你把要说的话写在纸上,然后交给翻译。这样你就不用次次出现了,不过那位翻译家就得驻扎在非洲了。对应程序,就是在每个客户的机器上,装上“解释器”。
和编译方式相比,解释方式也有它的优点,就要就在于修改上的方便。
采用编译方式,当你想改一个程序时,你必须把全部程序交给编译器,让它重新编译一遍,然后替换原来的程序。而解释的过程,你当然可以随便修改,想到什么就改什么。这在一开始写程序,也会显得直观。仍以说情书比喻,比如你可以说上几句,然后等着姑娘听完翻译后的表情,而判断你是不是说对了。当面翻译的过程,可以直观地看到姑娘听到你某几句话,那黝黑的脸上透出一点红晕,是趁热打铁呢还是适可而止,这就是在你的现场掌握了。编译过程享受不到这种“业务级别”的同步观察。(什么叫业务?此案例中,你的业务就是“谈恋爱”)。
虚拟机
如果你离开非洲,去了南美洲,还好,你不是“花心大萝卜”,你没有爱上另外一位姑娘,但为了和当地人沟通,你还是得再聘请一位翻译了——一个新的“编译器”,一个新的“解释器”。没错,前一章提过,机器也有“方言”,不同的硬件或操作系统,往往有不同的机器方言。
假设你想环游世界,想想你得准备多少位翻译啊?英语、日语、韩语、越南语、西班牙语……。或许可以找到一个天才精通数十种语言,但培养这样一位语言天才,容易吗?
为了解决同类问题,我们可以换一种思路,想像我们国家很强大,要求各国必须负责培养出至少一名“汉语专家”,以充当翻译。这样,我们出行时,只需一人,然后在当地找那位翻译陪同即可。
虚拟机就是这样一种机制。它指定一门“编程语言”,要求目标机器事先准备好这样一个“环境”——或者称为“设施”——但实际也就是一套软件,用于去解读这门“编程语言”所写的代码,翻译并在目标机器以执行。至于这个翻译过程,可以是编译、也可以是解释、或者二者兼而有之。
虽然不是本质上的方式改进(仍然用到编译或解释),但“虚拟机”的实现,却为程序的跨平台部署带来了很大的方便。当然它的代价也是巨大的。首先每个平台(机器或操作系统)都必须实现自己的虚拟机。另外,多数采用虚拟机的语言,都带来了较大的程序运行性能降低,我们分析一下原因。
典型的虚拟机往往采过这样一个过程:在内部定义了一种“中间语言”,然后我们写的程序并首先“编译”成这个中间语言,然后再通过“解释”来执行这个中间语言,这样的二重“翻译”当然会降低性能。
编程语言的发展
汇编语言
对机器语方的第一个“改进”,就是把一堆的用0和1表示的“字”“词”,先用英文字母组合,做一个差不多是一对一的映射。由于英文字母可以组合成相对有具体意义的“词”,所以就比0、1组合的字词容易理解和记忆了。如果有人在中学学英语时,曾经用汉字给英语单词“注音”,比如把“bus”注成“爸死”,那么这二者的作法可就有“异曲同工”之美了。
在机器语言上用具体字母对应出来的编程语言,就称为汇编语言。 由于几乎是“一一对应”的,所以汇编语言也和机器语言一样,存在不同“方言”。不同的机器也有不同的汇编语言。
汇编语言的“编译器”当然最容易写成,原因也在于这个“一一对应”。另外,我们可以推想,汇编语言最初的“编译器”应该是用机器语言写成的,这是题外话了。
C
汇编语言虽然在词汇上好记了,但在逻辑上,还是按照机器的特点进行。这时就有了著名的C语言,它从70年代初诞生,一直到现在三十多年了,仍然是软件界的主力开发语言。几乎所有操作系统(Unix, Linux, Windows),都主要以C语言和汇编语言写成。而很多其它编程语言,最终都要依赖于C写的底层实现。另外一个C大展身手的,就是各类大型游戏了,为什么?因为游戏很、很、很需要性能。
表面上看,C语言似乎用得很少了,如果这世界突然取消C语言,你会看到整个世界突然轰然倒埸,“死”得个干干净净。由此你可以感受C语言作为基石的作用了。
汇编语言当然更底层,但汇编语言由于其前述的特点。一般是属于实在避不开,才会去用汇编来实现,多数情况下,人们会用C代替汇编的大量的事。这就说明了两点:
1、C语言有接近汇编的性能和能力,比如它也能很容易地直接访问硬件。
2、C语言比汇编要大大靠近人类的思维,那就是它所体现的“结构化”编程思想。
C语言是一门编译型的语言(当然,否则它哪来接近汇编的性能)。
C语言里可以直接嵌入汇编语言。另外,要实现C语言,并不需要占用太多的资源,这就使得C在一些简单的硬件系统上,也可以实现。比如家里的“全自动洗衣机”,也是通过编程实现的,如果它用的不是汇编,那就肯定是C了。类似这类家用电器的电脑系统,一般用的就是“单片机”,另外一些更小的硬件系统,其上的编程,现在也称为“嵌入式编程”。
“结构化”的思想在所有编程语言(甚至包括汇编语言)都得到体现。它的意思是:把逻辑上紧密相关的代码尽量集中在一块,最终代码是块状组织的。不同代码块之间可以互相调用,避免同一逻辑重复实现。
“结构化编程”是一种好思想,但如何划分结构、如何组织结构各有不同。
C语言采用的是“面向过程”式的方法。也就是以处理事情的“过程”为基本单位。“过程”之间可以相互调用,“小过程”可以组成一个“大过程”。比如你想做饭,那你可以先分别实现“点火”,“淘米”,“煮饭”等等小过程。
类似C语言的还有像早期的“Pascal”语言等等。
C++
C++?中文叫“C加加”,英文叫“C plus plus”。一看就像是C语言的加强版。没错,在C++的世界里,你完全可以按照C语言的方式来写程序。但C++还提供了更多选择。
既然我们的课程采用的语言是C++,大家可能以为我这就要开始吹嘘C++的——怎么会呢,我是这种人吗?记住,本课程最典型的特点就是:在引进一个新概念时,第一个要讲的,肯定就是为什么我们需要这个“概念”?
所以现在我们既然要学习C++,那就得问,有了C这么好的语言了,还要C++干什么?
原因倒不复杂。因为类似像C这样的结构化的语言成熟以后,很多程序员开始有“胆量”用它们来写较大的程序了。于是乎就在写大程序时,发现了“面向过程”式的语言的不足。
C之类的语言还是主要偏向机器。在写相对较小的程序时,这一缺点没表现出来,在对付大程序时,“面向过程”就勉为其难了。因为要处理的事情太多,这样大大小小的“过程”就会到处都是。刚才我们举了做饭的例子,现在假如你是一个小学的校长,想要写一个程序用于管理一小学里大大小小事务,你能一下子想起需要什么“过程”吗?如果你不是校长,而是我们一国的总统呢?如果事无巨细都要管,最终就是乱套。
“面向过程”中的“过程”,说白了就是“做事情的步骤”。做饭确实可以有明确的步骤,但管理一个小学或一个国家,并没有什么很清晰的“步骤”。更多的,我们要去想需要有什么岗位,需要有什么“人”来分配到什么岗位,如何帮助这些“人”在岗位上发挥作用……从“管事”进化为“管人”,这个改进的好处相信大家会懂。
在这里“人”就是对象。它道出了“对象”最主要的一个特点,那就是对象是“活生生”的东西。对于动物园的程序,大象、猴子等就是管理的“对象”。对于机场程序,一架架飞机也是“对象”。你可能会说“飞机”算是“活生生”的东西吗?
这里的“活生生”并不是指对象有真实的生命,而是说:某个物体,它可以被其它物体改变,也可以去改变其它物体,那么这个物体就可以称为“对象”。比如人,长嘴,而嘴如果“接受”苹果,就会把这个苹果吃了;反过来,嘴还可以唱歌,从而可以让别人陶醉或抓狂。而飞机,它可以“接受”驾驶员和乘客,并经由前者把后者从北京很快带到上海。
面向对象再往下分解,当然也会需要“面向过程”。
这节课并不是解释“面对对象”的时机,但必须明白,C++和C相比,除了能兼容C以外,它当初最主要的发展就是引入了面向对象的特征。因此可以拿C++写更庞大的,也更复杂的程序。
同样需要明白的是,C++并不是纯粹的“面向对象”的语言。这一点用于和后面的一些语言做区别。既然兼容C,那么它自然也支持“面向过程”,但它还有其它典型的设计思想。被称为“多范式的编程语言”。
C++语言一直在发展,从“更好的C”的设计初衷,到现在发展为“多范式的编程语言”。使得C++和C渐行渐远,因此,十年前,以前的人学习编程语言,往往是先学习C,再学习C++。但现在,更好的方法是直接学习C++。
C++也是编译型的语言。
C++在编译上,一开始是把自己先“翻译”成C,然后再调用C的编译器。但这个过程并不长,很快C++就有自己专属的编译器,直接编译成机器语言。
一些操作系统的编程,也增加了C++语言。因为操作系统本身就是一个大程序。游戏界也如此,往往是C/C++并行了。
很多大型软件,也是用C++写成的。同样,不少新的编程语言,其实也是用C++写的。比如著名的图片处理软件:“Photoshop”。
C++之父的主页(另有中文版,但不完整)。
Java
Java是一门采用虚拟机实现的语言。
C,C++在跨平台应用上,都有切肤之痛。尽管用C,C++写成的代码,也可以在不同操作系统,用其各自的编译器编译,得可以在各操作系统上运行的程序。但这中间需要详细了解各操作系统的一些接口上的细节。否则往往在这个操作系统上写的代码,拿到另一个操作系统之下,就会编译失败。试举一例:
假设某大城市A,是一个操作系统,称为“大城市A操作系统”;类似的又有“小县城B操作系统”和“黄土高坡C操作系统”。
然后你用“汉语”当编程语言,其中写到一行语句内容是:“吃汉堡”。这代码在三个“操作系统”编译,就会有三种结果:
“大城市A操作系统”——直接去麦当劳买一份——又快又美味。
“小县城B操作系统”——没有麦当劳,也没有肯德基,但有一家蛋糕店有卖,买一份——味道差点。
“黄土高坡C操作系统”——编译失败。
虚拟机对付此类问题的方法是:在大城市A、小县城B、黄土高坡C三个地方分别驻扎一位汉堡师傅。只不过在A,这个师傅也是上麦当劳买。在B,师傅把从蛋糕店里买回的汉堡再改进改进,以期让它尽量接近麦当劳的风味。在C,师傅就从当地买进面粉,鸡肉什么的,亲自做一个汉堡(你慢慢等)。
当然,虚拟机并不能完全解决此类问题。比如你要吃的不是汉堡,而是比萨饼,那么虚拟机的实现者权衡利弊以后,认为要在每个地方都提供比萨饼,代价太大了,或者根本做不到,于是它就拒绝提供这个接口——就算你当前正在参观意大利的比萨斜塔,它也不会因此就为提供比萨,因为虚拟机的原则是:要么全有;要么全没有(真公平)。这样的结果大致是得到所有操作系统都拥有的交集,功能虽然变少了,但是跨起平台来,就容易多了。
如果基于这一点,C/C++其实也完全可以跨平台。只要你严格要求自己,抵抗得住当前所在的操作系统上面,那些特别功能的诱惑就行。比如你虽然准备在意大利住上10年,但在这10年内,你就是不吃比萨。这样以后就算你去了深山老林隐居,也不会因为嘴馋比萨而备受煎熬——这的确有些难度:天天看着人家吃比萨,你却得忍着,天人交战啊!——在Java的世界就好一点,因为你从来就不懂得人间还有比萨饼这美味。同处在虚拟机中的人,无论走到天涯海角,大家吃的都是“统一方便面”,因此哪来诱惑这一说呢。
Java的这种清心寡欲的生活,并非没有好处。我们一一说说。
第一,对于学习者,它的入门难度就降低了:你只吃方便面,你又何必去学习吃西餐那套烦人的过程?
Java语言,无论是语法,还是设计思想,都比较单纯。特别是Java的单根类库和“接口”机制,这就使得无论看起来多么不相关的类库,都仍然要在语言这一层上,找到二者的结合点。比如你于10年前写了一个“排序算法类”,而远在非洲的某个黑人朋友于10后写了一个描述“大象”的类。尽管你们没有任何通气,但仍然可能不用修改任何一方的代码,我就可以用你的排序算法,来实现对非洲大象进行按体重的排序工作。因为Java规定了“Comparable”接口专门用于比较,你针对这个接口写了排序算法,而黑人朋友针对大象实现了这个接口。
像这样的接口约定,在Java是约定成俗的事。如果你想写一个排序算法却不针对“Comparable”实现;黑人朋友想让大象可以比较大小,却不去实现 “Comparable”接口,那就是离经叛道的事。(而在C++,离经叛道一度就是一种生活方式,从来没有人约定你应该如何,不应该如何)。
第二,当然就是跨平台了。只要你懂得如何吃方便面,那么走遍天涯海角都饿不了。
你可能非常习惯Windows,从来就不去想自己会有一天去Linux下生活,更不会想为Linux写个程序。但在商业社会,用不用Linux或Unix就不是你我能左右的了。
客户买了一台IBM的小型机,IBM公司当然不愿意上推荐客户再去买一套微软公司的操作系统;相反,它为客户安装了一套自己的UNIX系统(叫AIX)。这个情况下,你和客户说,我不会在UNIX下写程序啊?请您行行好,换成安装一套Windows 2000吧?没等客户回话,老板就把你炒了。
Java就好办了。它的口号就是“一次编写,到处运行”。虽然这口号一直也没有彻底实现,但倒也相差不远。不管如何,你写的代码通过AIX上的虚拟机,就可以在几乎一点不懂AIX的情况下,把你的程序迁移到IBM的小型机上,跑得很欢快。
正是这一点,让Java有了今天不俗的成绩。它几乎成了商业编程中的,编程语言不二之选。
Java属于编译+解释型:它把代码先编译成虚拟机能理解的“统一的中间码”,然后再由虚拟机负责解释执行。
C#
C#本身是一门很优美的语言。如果说Java当初诞生,主要是对C++进行了“减法”操作的话。那么C#就是对C++进行了差不多各50%的“减法”和“加法”操作后的结晶。
C#是依赖于微软的.NET环境来实现的。而.NET环境,完全可当成是虚拟机。然而问题来了,这个虚拟机的存在,竟然并不是为了实现跨平台(操作系统)。如果说Java是一门语言,支持多个平台。那么.NET的目标却是:一个平台,支持多门语言,C#是这个平台上的一门较好的语言而已。
这就让人有些想不通了。如果说Java的世界里,虽然只能吃方便面,但好歹你带着这包方便面,就可以走遍全球不会饿。那.NET的目标是什么呢?你可以在微软建造的这个单一世界里,又吃汉堡包,又吃比萨饼,又吃西北拉面……但不管吃什么,最终你发现嘴里……都只有方便面的味道……我切!
所以,如果从这一角度考虑,C#一下子黯然无光矣:它不过是为了商业竞争而存在罢了。
当然,我仍然要说纯从语言角度上,C#确实比Java要更加好用,Java的“减法”做得实在太多了。
Python
为什么要我讲一个Python?
Python是一门脚本语言。所谓的“脚本”,就是纯粹的依赖“解释器”执行的语言。
脚本语言有很多,比如PHP、Perl、Ruby、JavaScript等等,但Python的突出特点是它比较完整,它的解释器几乎发展到一门“虚拟机”,譬如现在操作系统重要的“线程”的概念,PHP,Perl,JavaScript没有体现,而Pythone有完整的实现。这也体现了Python另一个特点: 既是脚本语言,但也接近常规编程语言(比如前述的C,C++,C#,Java),它并没有得非常清晰的特定的用途。像PHP、Ruby就特定用于提供网页服务,而JavaScript更是依靠网页浏览器来解释执行。
脚本语言有时也被称为“胶水语言”,因为它可以很方便地“粘合”两个用其它语言(C,C++,C#,Java)写成的大型程序,所谓的“粘合”就是指让两个程序之间实现通讯,并且要求不能有太大的改造,以免造成两个系统之间产生过多的互相依赖。
Python和C/C++结合得很好。Python可以调用C/C++写的模块;C/C++也可以调用Python的解释器,从而具备内嵌脚本语言的能力。事实上,学习了C++之后,再拥有Python的支持,完全是“如虎添翼”!为什么?一般来讲,一个系统很“高效”,往往不太“灵活”;反过如果非常“灵活”,就会带来低效;但结合了C++和Python的系统,你就会有机会同时拥有“高效”和“灵活”;这不正是“编译”和“解释”的各自所长吗?
所以我建议学习C++的人,最终都应该再辅助学习一门脚本语言,首选就是Python。
Python主页:http://www.python.org/。另有 Python中文社区。
语言小结
编程语言上万,我仅仅列了这几门。最终目的是为了让大家理解C++的特性,包括它长处,短处,以及如何弥补。
你应该继续做什么?应该在网络上通过Google搜索本篇讲到各个术语,比如编译、解释、虚拟机、以及各门语言等,从更多方面理解一门语言。比如Pascal语言为什么叫Pascal?比如C语言为什么叫C?比如C++的完整发展史。比如这里提到的几门语言的各自的官方主页在哪里?它们的发明者是谁?等等……
这些语言都是编程界的“英雄人物”,英雄可以不论出处,但是如果你爱上一位英雄,那么还是要搞清一下他的背景为妙。
语言选择
不用说,大家都知道我们答案就是C++,它将是本课程的专用教学语言。但我还是想更明确地列举一下原因。
一、“面向对象”已经是编程界的主流开发思想。它是解决很多问题的一个强有力的利器。所以我们一定要学习。
二、“面向对象”倒也不是万能的,更不是永远的首选项。其它的如“面向过程”、“基于对象”、“泛型编程”往往针对特定问题时,更为合手,或者更具有杀伤力。所以我们应该都有所了解。俗话说得好:“手里只有锤子,所有问题都成了钉子”。如果只学习面向对象,就一定不会真正了解什么“面向对象”,就很容易在解决问题时,出现为“面向对象”而“面向对象”的错误。
三、本课程主要针对非计算机专业的人士学习编程能力而写。在现代社会,各行各业的人的工作都离不开计算机,自然而然的,如果我们都能具备一定的编程能力,必将在本行业内发挥更强的作用。在这种情况下,我们往往没有什么写跨平台程序的需求,反倒对桌面应用需要有更多了解。比如你是一个家庭主妇,想给上幼儿园的女儿写一个用于教育的小程序。你有必要让女儿去Linux下使用这个程序吗?你有必要为了这样一个程序,去搭建一个网站,写一个只能在浏览器上运行的程序吗?商业程序首选的Java语言,因此落选。
四、本课程当然也不反对你成为一位专业的程序员。这时,学习C++的好处同样明显。我非常负责任地说一个现象:学会C++的人再去学习Java或C#,经较容易;并且往往成为个中高手。相反编程生涯直接是从Java或C#开始的人,想倒过来学习C++,几乎都是惨不忍睹!
五、本章前面说过了,C++已经是一门新语言,如果要学习C++,并不需要从C再开始了。
六、也是最后一点理由:这么多年了,虽然我在工作上用过超出10种语言,但我用C++比其它语言时间长,所以我就是想写C++的白话课程,你生气,我也没办法,别的语言,我写不来嘛。
结论:就是C++,只有C++。ONLY YOU,可以让我们轻装上阵,写出实用的程序;ONLY YOU,可以助我扎实基础,全面理解面向对象;ONLY YOU,可以让我攻城掠地,继续学习其它语言;ONLY YOU, 是站长有兴趣写的课程……
ONLY YOU,C++! |