第8章

好设计是解决主要问题๤的设计。厨房的煤ศ气灶有四个出火口,排成一个正方形。每个出火口都由一个调节器控制,四个出火口就有四个调节器。请问应该如何摆放调节器?最简单的摆放方法当然是把四个调节器排成一列ต,但要是这样做,人们使用起来就很不方便,每次都要停下来想一下到底每个调节器对应的是哪个出火口。如果直接把调节器排成与出火口一样的正方แ形,就不会有这个ฐ问题了。

这在今天的社ุ会也๣成立,虽然已经很少有人直接创造财富供自己使用了少量的家务活除外。我们大多数人都在为ฦ其他人创造财富,然后用创造出来的财富交换金钱,再用金钱๥交换我们需要的另一种财富

先,管理企业其实很简单,只要记住两点就可以了:做出用户喜欢的产品,保证开支小于收入。只要做到这两ä点,你就会过大多数创业公司。随着事业的展,你自己就能琢磨出来其他的诀窍。

互联网软件则ท完全不同,就像你写给自己้用的程序一样,修改起来很方便。软件的布过裎可以分解为一系列的渐进式修改,而不是猛地推出一个大幅变动的版本。常见的桌面软件可能一年布一到两ä个新版本,而我们在via9eb经常是一天布三到五个ฐ版本。

大多数的斗争,不管它们实际上争的是什么,都会以思想斗ç争的形式表现出来。1้6世纪的英国宗教改革englishreformation本质上是为了争夺权力和财富,但是却表现为英国人要求自主的精神与罗马教廷腐化的控制之间的斗争。思想斗争更容易争取支持者。不管哪一方获胜,他们所代表的思想也๣就被认为获得了胜利,仿佛上帝ຓ通过选择胜利ำ的一方表示了自己的倾向。

也许有一天,“计算机科学”分裂成几个独立的部ຖ分。这可能是一件好事,如果我本人的领ๆ域——黑客——能够独立出来,那就更好了。

本书๰就是帮助你了解黑客、从而理解这个时代的一把钥๓匙。

但是,真正的问题在于,并行计算到เ底能达到哪个ฐ抽象层次?一百年后它就会影响到เ开应用软件的程序员吗?或者,它还只是编译器作者需要考虑的事情,在应用软件的代码中根本就无处寻觅?

一种可能ม是,大多数可以用到เ并行计算的场合,人们都会放弃使用并行计算。虽然我总的预测是未来的软件会挥霍掉大部分新า增的硬件性能ม,但是并行计算是一个ฐ特例。我估计随着硬件性能得到惊人的提升,如果你明确地说想要并行计算,那么เ肯定可以得到它,但是通常情况下你不会用到เ它。这意味着,除了一些特殊的应用程序,一百年后的并行计算不会是那种大规模的并行计算massiveparallelism。我预料,对于普通程序员来说,一切更像对进程进行分叉,然后让多个进程在后台并行运行。

这是编程进行到เ很后期才要做的事情,属于对程序的优化,类似于你想开一种特定的数据结构来取代现有的数据结构。程序的第一个版本通常会忽略๓并行计算的各种好处,就好像编程开始时会忽略某种特定的数据结构给你带来的好处一样。

除了某些特定的应用软件,一百年后,并行计算不会很流行。如果应用软件真的大量使用并行计算,这就属于过早优化了。

一百年后会有多少种编程语言?从最近来看,出现了大量的新语言。硬件性能ม提高是一个ฐ原因,这就允许程序员根据使用目的在运行度和编程便利ำ性之间做出不同的取舍。如果这就是未来的趋势,那么เ一百年后强大的硬件只会使得语言数目变得更多。

伹是,另一方แ面,一百年后的常用语言可能只有很少几种。部分原因是基于我的乐观主义,我相信在未来,如果你的作品确实很出色,你可能ม选择的是一种开起来很方便的语言。使用这种语言写出来的软件第一版的运行度很慢,只有对编译器进行优化设置后运行度才会提升。既然我抱有这种乐观主义,那ว么เ我还要做一个ฐ预ไ言。有些语言可以达到เ机器的最高效率,另一些语言的效率则慢到刚刚可以运行而已๐,两者之间存在巨大的差ๆ距。我预ไ言一百年后,这段差距之间的各个点上都会有对应的编程语言存在。

因为ฦ这段差ๆ距正在变得越来越大,所以性能分析器profiler将变得越来越重要。目前,性能ม分析并没有受到เ重视。许多人好像仍然相信,程序运行度提升的关键在于开出能够生成更快代码的编译器。代码效率与机器性能ม的差ๆ距正在不断加大,我们将会越来越清楚地看到เ,应用软件运行度提升的关键在于有一个ฐ好的性能ม分析器帮助指导程序开。

我说将来可能ม只有很少几种常用语言,但没有把用于特定领域的“小众语言”little浪ฐuaທge算进去。我觉得,这些嵌入式语言的想法很不错,一定会蓬勃展。但是我判断ษ这些“小众语言”会被设计成相当薄的一层,使得用户可以一眼看出在底下作为基础的通用型语言,这样就减少了学习时间,降低了使用成本。

谁来设计这些未来的语言?过去10่年最激动人心的趋势之一就是开源语言的崛起,比如perl、python和ruby。语言设计已经被黑客接管。到目前为止这样到底是好是坏还看不清楚,但是展势头令人鼓舞。比如,perl就有一些绝妙的创新。不过,它也๣包含了一些很糟糕的想法。对于一种充满进取心、大胆探索ิ的语言来说,这也是很正常的事。以它现在这种变化的率,大概只有上帝才知道一百年后perl会变成什么เ样。有一句俗话说,如果你自己做不到,那ว就去当老师。这在语言设计领域不成立,我认识的一些最出色的黑客就在当教授。但是,当老师๲的人确实有很多事情不能做。研究性职位给黑客带来了一些限制。在任何学术领域,都有一些题๤目是可以做的,另一些题๤目是不可以做的。不幸的是,这两类题目的区别通常取决于它们写成论文后看上去是不是很高深,而不是取决于它们对软件业的展是否重要。最极端的例子可能就是文学,文学研究者的任何成果几乎对文学创作者都毫无຀影响。

虽然科学领域的状况要稍好一点,但是研究者可以做的题目与能够对设计优秀语言有所帮助的题目之间的交集小得令人沮丧ç。奥林·希弗斯ั曾经对这一点表达不满,而且说得头头是道。比如,研究变量类型的论文好像多得无穷无尽,尽管事实上静态类型语言看来无法真正支持宏在我看来,一种语言不支持宏,那就不值得使用了。

新语言更多地以开源项目的形式出现,而不是以研究性项目的形式出现。这是语言的一种展趋势。另一种展趋势是,新า语言的设计者更多的是本身就需要使用它们的应用软件作者,而不是编译器作者。这似乎是好的趋势,我期待它继续保持下去。

一百年后的物理学基本上不可能ม预测。但是计算机语言不一样,现在就动手设计一种一百年后可以吸引使用者的新า语言,这在理论上似乎ๆ是可能的。

设计新า语言的方แ法之一就是直接写下你想写的程序,不管编译器是否存在,也不管有没有支持它的硬件。这就是假设存在无限的资源供你支配。不管是今天还是一百年后,这样的假设好像都是有道理的。

你应该写什么เ程序?随便什么,只要能让你最省力地写出来就行。但是要注意,这必须是在你的思维没有被当前使用的编程语言影响的情况下。这种影响无຀处不在,必须很努力才能克服。你也๣许觉得,对于人类这样懒惰的生物,喜欢用最省力的方แ式写程序是再自然不过的事情。但是事实上,我们的思想可能往往会受限于某种现存的语言,只采用在这种语言看来更简单的形式,它对我们思想的束缚作用会大得令人震惊。新语言必须靠你自己้去现,不能依靠那些让你自然而然就沉下去的思维定势。

采用程序的长度作为它耗费工作量的近似指标是个ฐ很有用的技巧ู。这里的程序长度当然不是指字符的数量,而是指各种句法元素的总长度,基本上就是整个ฐ解析树的大小。也许不能说最短的程序就是写起来最省力的程序,但是当你一心想把程序写得简洁而不是松松垮垮时,你就更接近省力这个目标,你的日຅子也会变得好过得多。所以,设计语言的正确做法就变成了,看着一段程序,然后问自己是不是能ม把它写得更短一点?

实际上,用想象出来的一种一百年后的语言来写程序,这件事情的可靠程度,取决于你对语言内核的估计是否足够正确。常规的排序,你现在就可以写出来。但是,想要预测一百年后的语言使用什么函数库就很难了。很可能许多函数库针对的领域现在还根本不存在。比如,如果色ti@home计划

成功,我们就需要与外星人联系的函数库了。当然,如果外星人的文明高度达,已经到了用xml格式交换信息的地步,那就不需要新的函数库了。

‘色ti@home是一个寻找地球以外智慧生命的科学实验、由加州ะ大学伯克利分校起并主持。它使用射电望远镜监听太空中的无线电信号,然后用计算机进行数据分析,如果现有些信号不可能自然产生,就可以证明外星文明的存在。1้995๓年,该项目决定向志愿者开放,使用全球联网的大量计算机进行分布式计算,1้99๗9年5月开始正式运行。详细情况参见色tiaທthomeberkeleyedu。——译者注’

另一个极端是,我觉得今天你就能设计出一百年后的语言内核。事实上,在有些人看来,大部ຖ分语言内核在195๓8年就已经设计出来了

。

‘lisp语言的第一版规格说明书是1958年布的。——译者注’

如果今天就能使用一百年后的编程语言,我们会用它编程吗?观古而知今。如果1้960年就能使用今天的编程语言,那时的人们会用它们吗?

在某些方面,回答是否定的。今天的编程语言依赖的硬件在1้96๔0年并不存在。比如,python这样的语言,正确的缩进indentaທtion在编写时很重要,但是19๗60年的计算机没有显示器,只有打印机终端,所以编写起来就不会很顺ิ利。但是,如果把这些因素า排除在外你可以假设,我们只在纸上编程,2๐0世纪60年代的程序员会喜欢用现在的语言编程吗?

我想他们会的。某些缺乏想象力、深受早期编程语言思想影响的人可能会觉得不可能。没有指针ฤ运算,如何复制数据?没有goto语句,如何实现流程图?但是我想,那时最聪明的程序员一定能ม轻松地使用今天的大多数语言,假定他们能ม得到的话。

如果我们现在就能拥有一百年后的编程语言,那就至少能用来写出优秀的伪码

。我们会用它开软件吗?因为一百年后的编程语言需要为某些应用程序生成快代码,所以很可能它生成的代码能够在我们的硬件上运行,度也还可以接受。相比一百年后的用户,我们也许不得不对这种语言做更多的优化,但是总的来看,它应该仍然会为ฦ我们带来净收益。

‘伪码又称虚拟代码,用来抽象地描述算法,而不是现实存在的编程代码。——译者注’

现在,我们的两个ฐ观点就是:1一百年后的编程语言在理论上今天就能设计出来;2如果今天真能设计出这样一种语言,很可能ม现在就适合编程,并且能够产生更好的结果。如果我们把这两个观点联系起来,那ว就得出了一些有趣的可能性。为什么เ不现在就动手尝试写出一百年后的编程语言呢?

当你设计语言的时候,心里牢牢记住这个目标是有好处的。学习开车的时候,一个需要记住的原则就是要把车开直,不是通过将车身对齐画ฑ在地上的分隔线,而是通过瞄准远处的某个点。即使你的目标只在几米开外,这样做也是正确的。我认为,设计编程语言时,我们也应该这样做。

12๐拒绝平庸

199๗5๓年,罗伯特·莫里斯和我一起创办了via9๗ebຘ。我们打算开软件,让用户可以自己้搭建网上商店。当时,我们的创意是把软件放在服务器端,使用普通的网页作为用户界面。

当然,那个ฐ时候许多人可能ม都想到过这个主意。但是,就我所知,via9๗eb是第一个互联网应用程序。在我们看来,这真的是很新颖๢的想法,所以我们就把公司命名为ฦviaທ9eb,意即我们的软件通过网络使用,而不是运行在你的桌面电脑上

‘在英语中,via是一个ฐ介词,意为“经过……”,所以via9ebຘ的意思就是经过网络。——译者注’

另一个特别之ใ处是,这个ฐ软件主ว要采用lisp语言开

。它是最早ຉ的用lisp语言开的大型应用程序,在此之前๩,lisp语言主要用于大学和实验室中。

‘一开始的时候,viaທ9eb有两个部ຖ分——编辑器和订单处理系统。前๩者用摸nlisp开,主要供用户搭建自己的网站。后者用cນ语言开,主要用来处理订单。在viaທ9๗eb的第一版中,lisp是最主ว要的开语言,因为ฦ订单处理系统非常小,占用的代码很少。20่03年1้月,yaທhoo布了viaທ9eb编辑器的新版本,采用cນ++ใ和perl开。但是,为了把原始程序翻译成c++,他们可能不得不专门写一个ฐlisp解释器,因为据我所知,viaທ9eb所有的页面生成模板还没变,都是使用lisp代码。参见greenspun写的tenthrule一书第19๗8页。’

秘密武器

埃里克·雷蒙德写过一篇文章《如何成为一个ฐ黑客》ho9tobeeaທhaທcker。文中有一部ຖ分专门谈到,在他看来,如果你想当一个ฐ黑客,应该学习๤哪些语言。他建议从python和java入手,因为它们比较容易学。想当高级一点的黑客,还应该学习9๗ix系统,后者用来系统管理和开cgi脚本。最后,真正非常严肃地把黑客作为人生目标的人,应该考虑学习lisp:

lisp很值得学习。你掌握它以后,会感到เ它给你带来的极大启。这会大大提高你的编程水平,使你成为一个更好的程序员。尽管在实际工ื作中极少会用到lisp。

在讨论学习๤拉丁语有何价值时,你往往也๣会听到这一类的话。拉丁语无助于你找工ื作也许古典文学教授的工作除外,但是它可以训练你的思维,帮助你更好地运用母语比如英语进行写作。

但是且慢,拉丁语的比喻并不完全适合lisp语言。拉丁语无助于你找工作的原因是因为没有人说拉丁语。如果你用它写作,没有人能看懂ฦ。但是,lisp是一种计算机语言,无论我们程序员使用哪一种语言与计算机交谈,它都能听懂。

如果埃里克·雷蒙德没有说错,lisp语言确实可以使你成为更好的程序员,那么为ฦ什么你不使用它编程呢?如果画家有一支让他画得更好的画笔,我觉得他应该会用这支笔完成所有的画ฑ作,对不对?我在这里不是想证明埃里克·雷蒙德错了。他的观点整体上非常正确,他对lisp语言的看法确实是大多数人的看法,但是这里面就是有一个ฐ矛盾:lisp语言能ม让你成为更好的程序员,但你却不用它,这难道不奇怪吗?

为什么不用呢?编程语言毕竟是一种工具。如果lisp语言真的能开出更好的程序,你就应该用它。如果它无助于编程,那ว么就不会有人需要它。

这不仅仅是一个理论问题。软件业是竞争非常激烈的行业,而且容易出现垄断。在不考虑其他情况的条件下,某家公司的软件更快更好用,就会把竞争者赶出这个市场。一旦ຆ你开始创业,你就会更深切地感受到这一点。一般情况是,创น业公司要么เ赢得一切,要么彻底失败。你要么成为ฦ富翁,要么一无所获。创业的时候,如果你选择了错误的技术,竞争对手就会一举ะ打败你。

罗伯特·莫里斯ั和我都很了解lisp语言,我们相信自己้的直觉,找不出任何不使用它的理由á。我们知道其他人都用c++或perl开软件,但是我们不觉得这说明了什么问题๤。如果别ี人用什么技术,你也用什么技术,那么你大概只能使用9indo9s了。选择使用哪一种技术的时候,你不能ม考虑别人的做法,只能ม考虑什么เ样的技术能ม最好地完成工ื作。

图12๐-1้我和罗伯特·莫里斯ั在via9eb,199๗6年年初ม

创业公司尤其如此。大公司可以互相模仿,但是创น业公司就不行。我觉得很多人没有意识到这一点,尤其是一些创业者。

大公司每年平均成长大约10%。所以,如果你掌管一家大公司,只要每件事都做到大公司的平均水准,你就能得到大公司的平均结果,也就是每年成长大约10%。

如果你掌管创业公司,当然也可以这样。你把每件事都做到平均水准,就能得到平均结果。问题๤在于,小公司的平均结果就意味着关门倒闭。创业公司的生存率远低于50%。所以,如果你掌管创业公司,最好做一些独特的事情,否则就会有麻烦。

回到1995年,我们懂得一些竞争对手不懂的事情至少在我们看来是如此,这些事情甚至直到今天都很少有人懂:如果开只在自己服务器上运行的软件,这意味着你想用什么เ语言就能ม用什么语言。如果开桌面软件,就完全不一样了,大多数情况下你只能使用操作系统所用的开语言。10年前๩,开桌面软件就意味着要使用c语言。但是,对于互联网软件,你能使用任何你想用的语言。如果你还同时拥有操作系统和语言的源码,那么你的自由就更大了。

但是,这种新出现的自由á是一把双刃剑。既ຂ然你可以使用任何语言,你就不得不思考到底使用哪一种语言。如果你的公司对这种选择的自由视而不见,而竞争对手看到了,那么你就有被击败的危险。

如果选择哪种语言都行,你到底使用哪一种语言?我们选择lisp。先,很明显,对于这个市๦场来说,快开出产品是很重要的。我们所有人都是从零开始,所以能够快做出新功能的公司就会取得巨大的竞争优势。我们知道lisp语言真的非常合适快开软件,而且我们的软件运行在服务器端,你一写完代码就能ม布出去,所以这又进一步放大了快开的效果。

如果其他公司不想使用lisp语言,那就更好了。这会让我们拥有技术优势。我们不能ม放过任何有利的因素。创น办viaທ9๗eb的时候,我们对于如何经营一家公司毫无຀经验,对市场推广、雇用员工、融资、展新า客户等都一无所知。在此之前,我和莫里斯甚至连一夭正式上班的经历都没有。我们唯一擅长的事情就是开软件。我们希望这一点可以弥补我们的劣势。任何在软件开上面有助于我们获得优势的事情我们都不能ม放过。

可以这样说,我们使用lisp只是一个ฐ大胆的冒险。我们设想如果用lisp语言开自己的软件,就能比竞争对手更快地写出新功能ม,还能做到他们做不到的事情。同时,因为lisp是一种抽象层次非常高的语言,所以就不需要非常庞大的开团队,这会降低成本。如果我们的设想是正确的,那么เ我们就能用更少的钱做出一个更好的产品,从而获得利ำ润。最终,我们将独占市场,竞争对手什么เ也得不到,到头来只能退出这个行业。我们当时心里就是这么盘算的。

这次冒险的结果如何?多少有点出人意料é,它竟然达到了我们的设想。我们前前后后遭遇到很多竞争对手,一共大概有二三十个ฐ,但是他们的软件没有一个能与我们竞争。我们的软件运行在服务器端,用户可以“所见即所得”地搭建网上商店,感觉就像在操作桌面软件。我们的竞争对手使用cgi脚本。我们在功能上总是遥遥领先于他们。有时,他们出于绝望,试图引入我们没有的功能ม。但是,有了lisp语言的帮助,我们的开周期很短。有时候,竞争对手刚刚布๧新闻稿宣布将引入新功能,我们就能ม在一两ä天内做出自己的版本。当对手找来的记者抽出时间打电话过来想了解我们的反应,我们就会告诉他我们已经有了这个功能。

竞争对手一定觉得我们好像拥有了某种秘密武器,能ม够破解他们内部的通信或者其他机密。事实上,我们的确拥有秘密武器,但是没他们想的那么เ复杂。从来没有人向我们泄露他们的内部机密,只是我们的开度比别人想象的更快而已。

9岁时,我碰巧读过弗雷德里克·福赛思的《刺杀戴高乐》thedayofthejackal。的主角是一个ฐ刺๐客,有人雇他暗杀法国总统。那ว个刺客必须通过警察的岗哨才能到เ达可以俯视总统行进路线的公寓。他扮成柱着拐杖的老头从警察身边经过,没有引起任何人的怀疑。

我们的秘密武器很类似上面的情景。我们使用一种奇特的人工智能语言开软件,它的语法非常古怪,大量使用括号。多年来,要是听到别人这样描述lisp语言,我会勃然大怒。但是现在,这却成了我们的优势。在竞争中ณ,你的对手无法理解你的技术优势,这可是再宝贵不过了。商场如战场,对手摸不透你,你的胜算就增加了。

虽然有些令人难为情,但是我必须ี承认,就是因为ฦ这个ฐ原因,在viaທ9ebຘ创业期间我从来没有公开谈论过lisp语言。我们对新闻媒体闭口不谈lisp,如果你在我们的网站上搜索lisp,只会现我在个人介绍中提到เ过两次,那是我写的两本关于lisp的书。这是故意的,创业公司对竞争对手应该越保密越好。如果他们不知道或者不关心我们的软件用什么语言开,我就要把这个秘密保持下去

‘莫里斯觉得不用这么保密,因为即使竞争对手知道我们使用lisp语言,对他们也不会有帮助:“如果他们真的聪明,早ຉ就已经在用lisp编程了。”’

最了解我们技术的人就是客户。他们不关心viaທ9eb用什么语言开,但是现它真的很好用。viaທ9๗ebຘ可以让用户在几分钟内搭建起漂亮的网上商店。因此,主要通过口碑效应,我们得到了越来越多的新客户。1้996年年底,我们支持的网上商店大约是70家。1้997๕年,变成了50่0家。6个月后,雅虎收购我们的时候,我们有10่7๕0个用户。更名为ฦyaທhoostore之后,这个软件继续主ว导市场,它是雅虎获利ำ最丰ถ厚的业务之一,用它搭建的商店成为ฦ“雅虎购物”yahooshopping的基础。我在1999๗年离开了雅虎,所以不知道现在的准确用户数量,但是我上一次听到的数字是过了2万。

blubຘ困境

lisp语言到底好在什么地方?如果它真的这么好,为什么没有得到เ广泛使用呢?这种问题听起来有点像绕口令,但是实际上回答起来很简单。lisp语言的好处不在于它有一些狂热爱好者才明白的优点,而只在于它是目前最强大的编程语言。它没有得到广泛使用的原因就是因为编程语言不仅仅是技术,也是一种习惯性思维,非常难于改变。当然,上面两ä句话都需要进一步解释。

我先从一个争议极大的命题开始讲起:编程语言的编程能力有差ๆ异。至少不会有人反对高级语言比机器语言更强大这一观点。今天的大多数程序员通常情况下都不会想用机器语言编程,而是使用一种高级语言,然后再让编译器帮你把它翻译成机器语言。这种观念甚至已๐经移植到เ了硬件,从20世纪80年代开始,硬件的指令集都是针对编译器而不是针对程序员设计的。

大家都知道,徒手用机器语言写出整个ฐ程序是一件很蠢的事。但是,把这个观点推广到一种更普遍的情况,知道的人就不多了。如果你有好几种语言可以选择,在不考虑其他因素的情况下,你不选择最强大的那种语言就是一件很蠢的事

‘如果从图灵等价turing-equivaທtent的角度来看,所有语言都是一样强大的,但是这对程序员没有意义。没人想为ฦ图灵机编程。程序员关心的那种强大也许很难正式定义แ,但是有一个办法可以解释,那ว就是有一些功能在一种语言中是内置的,但是在另一种语言中需要修改解释器才能ม做到,那ว么前๩者就比后者更强大。如果a语言有一个运算符,可以移除字符串ธ中的空格,而b语言没有这个运算符,这可能不足以称a语言比b语言强大,因为ฦ你可以在b语言里写一个函数实现这个功能。但是,如果a语言支持某种高级功能假定是递归,而b语言不支持,你就不可能ม通过自己编写函数库解决了,所以这就代表a语言比b语言更强大。’

上面这个观点有许多例外情况。如果在开的程序必须ี与另一个程序紧ู密配合,那ว么可能ม最好还是使用后者的开语言。如果你的程序只是要做一些很简单的事比如整数运算或者位操作,那就不妨使用一种比较靠近机器的低层次语言,主ว要原因是这样运行起来会更快一些。如果你的程序很短,只是为ฦ了特定场合一次性使用,那ว么你最好根据自己้要解决的问题选择具有最强大函数库的语言,不过,总的来看,对于应用程序来说,还是应该选择总体最强大、效率也๣在可接受范围内的编程语言,否则都是不正确的选择,就好像你选择机器语言编程一样,只是程度上有差异而已。

大家都公认机器语言属于非常低层次的语言。但是,至少在社会上很多人眼里,高级语言其实也差不多。但事实并非如此,高级语言与机器语言的差别很大。从技术上看,“高级语言”并不是一个定义很清晰的名词。在高级语言与机器语言之ใ间并不存在一条明确的分界线。语言的抽象性是一条连续曲线,从最强大的语言一直到เ最底层的机器语言,每一种语言的能力都有差ๆ异

‘语言之ใ间的关系或许还可以比喻成栅格结构laທtticນe,从下往上朝着顶端慢慢收窄。具体的形状在这里并不重要,重点是语言之间至少存在着一种偏序关系paທrtialorder。’

以cobol语言为例,通过编译器,它可以被编译成机器语言。从这个角度来说它是一种高级语言。但是,有谁会真的把9—样强大的语言?比起python,它可能ม更接近机器语言。

perl4如何?与perl5相比,它不支持闭包。所以,大多数perl的黑客都认为perl5๓比perl4更强大。如果你同意这一点,就意味着你也认可一种高级语言可以比另一种高级语言更强大。因此,必然能够接着推导出,除了某些特殊情况,你就是应该使用目前最强大的语言。

不过在现实中这个ฐ结论很少能ม落实。到เ了一定年龄之ใ后,程序员极少主ว动更换自己的编程语言。不管习惯使用的是哪一种语言,他们往往认为这种语言已经足够好了。

程序员非常忠于他们心爱的语言,我不想伤害任何人的感情,所以为了解释我的观点,我假设有一种blub语言。它的抽象程度正好落在编程能力曲线的中点。它不是最强大的语言,但是要比cobol或机器语言更高级。

我们假设blub程序员既不使用机器语言也不使用cobol语言。他认为前๩者是编译器的工ื作,后者他不知道有什么用cobຘol语言甚至连xx功能也没有,blub语言就具备这个功能。

只要这位程序员向曲线下方望去,他就肯定知道自己้正在看的是一些比较低层次的语言。因为那些语言明显不如blubຘ语言强大,缺少他习惯使用的某些功能。但是,当他向曲线上方แ望去,他不会意识到自己้正在看更高层次的语言,而是仅仅觉得自己正在看某些奇怪的语言。他可能ม认为那些语言也许与blub一样强大,但是加入了不少怪东西。他觉得blubຘ语言已๐经够用了,不用再考虑那些语言了。这时,他的思维就是已经被bຘlub同化了。

但是,当我们转换视角,把自己想象成使用曲线更上方某一种语言的程序员并往下看的时候,我们就会现,自己้也同样轻视bຘlub语言。你怎么用blubຘ语言完成工作呢?它甚至连yy功能都没有!