一直以来,程序语言的研究都是一个非常偏僻,却非常重要的专业。由于它令人却步的难度,很少有人说得清楚什么人是真正的“高手”。这是一个很简单的道理,当一个人仰望星空的时候,他不会知道哪颗星更加伟大。通常人们都会以为最亮的星星是最大的,可其实有些看起来灰暗的小星星,它们的尺寸和能量都超过那最亮的恒星万亿倍。但是由于它们离地球太远,基本不会被人注意到。研究程序语言的科学家们,很多就是这样的巨星,而且这样的巨星满天都是。
宗教与盲从
巨星一般都不说话,它们只是默默的释放着自己的能量。以至于人们看着夜空,以为它们只是被卡在深蓝色琥珀中的萤火虫。而这个世界上充满了太多业余级别的程序语言设计者。他们每一个都卖力的推广自己的语言,煽动群众,然后被他们崇拜为神。由于没有系统的学习过程序语言理论,他们经常做出糊涂的设计,重复前人犯过的错误。但是普通的程序员都不知道真正的程序语言专家是什么,所以这些人可以利用自己懂得的那点东西来糊弄他们,以至于真正的专家说话都没有人信。
我经常发现自己没法跟人讨论关于程序语言的设计,就是这个原因。比如当我提到 Python 的缺点使得它不适合作为入门语言,就会有人拿 Linus Torvalds,Guido van Rossum 甚至 Eric Raymond 的话来“镇压”。说这些高人都喜欢 Python,甚至把 Python 作为他子女的第一门程序语言。对于这种盲从“权威”,只相信名气的人,理性的探讨是没有用的,因为真正的科学家们的名气,显然不如他们心目中的偶像们名气大。因为他们从未见过真正的程序语言专家,所以我没法告诉他们,其实他们心目中的某些“偶像”,不过是半壶水响叮当的传教士。而真正卓越的程序语言专家和研究者,他们其实一个也不认识。
举个例子,有谁认识 C.A.R. Hoare 和Robin Milner?几乎每个程序员都知道 Donald Knuth 和 Dennis Ritchie,却很少有人知道 Hoare 和 Milner 的名字。而其实 Hoare 和 Milner 对于程序语言本质的理解,比起 Knuth 和 Ritchie 还要深入不知道多少,以至于这后两者基本不算是程序语言专家。然而由于 Knuth 和 Ritchie 经常发表言论,再加上崇拜者们对他们的宣传,他们对于广大程序员的种种误导,真是让人解不开的结。
程序语言专家们有一个特点,他们喜欢让编程变得更加简单,更加优美,更加安全,表达力更强,同时却不损失效率。而很多知名的计算机科学家其实并不真的明白什么是“简单”。比如 Dennis Ritchie,他说:“Unix is simple. It just takes a genius to understand its simplicity.”可是你如果学过程序语言的理论,就会发现 Unix 的设计其实是非常繁琐的。那为什么人们都“同意”Unix 是简单的呢?因为他们都想让别人觉得自己是 genius!请比较一下 Ritchie 的话跟这句《皇帝的新装》里的织布工的话吧:“The clothes made of this material are invisible to any man who is unfit for his office or unpardonably stupid.”看出来两者的逻辑关系了吗?
如果你看不见Unix的简单,那么你就不是一个天才。
如果你看不见皇帝的衣服,那么你就 是一个白痴。
把一个东西的存在跟人的自尊和虚荣关联起来,就是为什么那两个织布工能够控制所有人的嘴。我想让人觉得我是天才,所以我得说我懂得“Unix 的简单”;我不想让人知道我是白痴,所以我得说我看见了“皇帝的衣服”。
Knuth 也曾有类似的说法:“要是看不懂 TAOCP,就别当程序员。”他总是被誉为“计算机科学的神”,在他的演讲里大谈文学,艺术,上帝和宗教,给人陡增神秘感。他总是说程序员应该学习机器语言,而不是高级语言,机器才是不变的真理。但是 Knuth 却不是从科学的角度来看这个问题,而只是他个人的偏见。当他看到 Fortran, Lisp, ALGOL, Pascal, C, C++, Java 这些语言的发展仿佛没有尽头的时候,他并没有理解其中不变的原理。在程序语言的设计上,他不是一个强者。他很有可能根本不理解 lambda calculus 和类型理论,否则他不会设计出像 TeX 那样毫无章法的语言。TeX 排版的质量无可厚非,但是到了1978年还仍然采用程序语言专家们早已深恶痛绝的 dynamic scoping,再加上其它一些蹩脚的设计,说明他对程序语言理论缺乏理解。实际上 TeX 含有一个图灵完备的扩展语言,是因为 Knuth 采纳了 Guy Steele(Scheme 的发明者)的建议,然而 Knuth 却没有把它设计好。
Knuth 觉得机器是不变的真理,所以他坚持用机器语言来写作 TAOCP。但是由于机器语言缺乏抽象,程序员没法专注于真正的问题。使用机器语言来描述算法,会把本来很简单的问题都显得高深难懂,仿佛这书永远也看不完。有多少人真正的看过 TAOCP 呢?恐怕大部分人把这套书买回去,只是把它们摆在书架上做面子。只要有人说机器语言太难懂,这些人就会说你自己不够聪明,不配做程序员。而其实呢,他们自己都没看过。
机器不是计算的本质这个事实,很多人包括 Dijkstra,早就看到了。他说:“计算机科学是个错误的名字,因为它不是计算机的科学,这就像外科手术不是刀子的科学。”而这是几乎每一个程序语言专家都明白的道理。在他们的眼里,这不再是道听途说或者个人观点,而是可以用逻辑来证明的事实。真正明白计算本质的人,可以设计出全新的硬件来来满足语义的需要,而不是受控于处理器的设计。他们甚至可以超越集成电路,而使用另外的技术来制造机器。这些都说明,计算其实是独立于机器的。
有不好的想法不要紧,但是如果把不好的想法硬说成是好的,那就会阻碍历史发展了。我并不否认 Knuth 和 Ritchie 对算法,排版和操作系统的重要贡献,但是由于他们以及他们崇拜者经常在有关语言的事情上误导群众,所以觉得有必要指出他们的一些局限性。Linus Torvalds, Guido van Rossum, Eric Raymond, Paul Graham 也经常发表对语言的评论,被很多人奉为圣旨,但其实他们言论里面很少有真知灼见。
其实我要说的不过是,通常程序员们膜拜的偶像,大部分都不是真正的程序语言专家。希望你不要觉得这是危言耸听,实际上这些是大部分世界级的计算机科学家们很多年前就知道的事情。他们不把这些向大众公开,是因为他们都是聪明人。
真正的程序语言专家在哪里
那么真正的程序语言专家在哪里呢?其实真正的程序语言专家,大部分都在大学和研究所里面。就这个专业而言,学术界要比工业界强很多。很多专家待在大学里面,是因为大学里常常有志同道合的人,而公司一般不明白程序语言专家的价值,甚至不知道他们是做什么的。
程序语言专家常常是独当一面的强人,所以程序语言方向的强弱,经常不取决于学校的名气和排名,而几乎都是取决于少数的个人。比如,曾经 Cornell 有着一颗巨星:Greg Morrisett。当时的 Cornell 是程序语言研究最强的一个地方,培养了一批最好的研究者,产生了一批像 Typed Assembly Language(一种带类型的汇编语言)那样优秀的成果。可是后来 Greg Morrisett 离开 Cornell 去了哈佛,其他人也陆续离开,Cornell 的程序语言方向也就衰落了。哈佛的计算机系曾经不咋的,可是后来由于 Greg Morrisett 出任他们的院长而实力大增,开始吸引优秀的程序语言研究者。至于 MIT,Stanford 和 Berkeley?让你吃惊的是,我看过这么多世界上最重要的论文之后发现,它们近年来似乎没有拥有过最好的程序语言专家。老一辈的专家们,有的退休,有的去世了。所以如果 MIT 把编程的入门课改成用 Python 的传言是真的,一点也不奇怪,只是觉得非常遗憾。可是跟它们名气相当的 CMU,却汇聚了一批最好的研究者,包括 Robert Harper,John Reynolds, Frank Pfenning 等等。Robert Harper 看透了面向对象语言的毛病,所以在 CMU 本科生的入门编程课中完全取消了面向对象语言的内容[参考]。很多顶级的程序语言专家不在美国,他们分布在英国,法国,丹麦,瑞典,荷兰,日本…… 这些大学和机构包括 Cambridge, Oxford, Edinburgh, INRIA, Paris 7, DIKU, Chalmers, ... 当然由于他们的迁移,你无法预测一个学校未来在这方面的兴衰,也许在不久的将来 MIT, Stanford 和 Berkeley 会变成世界上最强的也说不定。我想说的其实只是,这一切都取决于那少数的个人。在程序语言的世界里,个人思想的重要性,远远大于学校的名气。
不过程序语言专家也不是完全排斥工业界的。只要有公司慧眼识英雄,给他们足够的尊敬和优待,他们也会在工业界发挥出非常大的威力。有些金融行业的公司比如 Jane Street Capital, Standard Chartered Bank 等,已经开始意识到这一点,请了一些程序语言专家来领导金融软件系统的开发。也有一些专家成立了自己的公司,从事高精尖的项目。比如 GrammaTech 就是由一个前 Cornell 程序语言教授创办的。这个二三十人的小公司,客户却包括 NASA,Boeing,Airbus, Lockheed Martin, GE,SONY 这样的巨头。
再比如 IU 的教授 R. Kent Dybvig,他的公司 Cadence Research Systems 只有他一个人(有时候两个人),客户却包括 Motorola,Cisco 这样的大公司。另外的由程序语言专家创立的公司还有 Galois, BlueSpec 等等。
学术传承
由于不喜欢 Cornell 的学校气氛以及程序语言方向的衰落,我离开了 Cornell。但是我并不后悔,因为我找到了这一生中给予我最大帮助的人,他教会了我独立的思想。回过头来我也意识到,其实当时的 Cornell 仍然存在一颗超级巨星,他的名字叫 Robert Constable。不过他是如此的“厚德载物”,以至于我在 Cornell 的时候,居然没有听说过他的名字。因为我当时对程序语言粗浅的认识,让我完全不能明白他的伟大。以至于当我跟他谈话之后,我仍然决定了离开!可他却是多个最重要的研究者的“学术祖先”,包括在这个领域最受瞩目的 CMU 的教授 Robert Harper,哈佛的 Greg Morrisett,和 UPenn 的 Benjamin Pierce,…… 看过他的 Naive Computational Type Theory 之后我发现,Robert Constable 对类型理论的理解,恐怕这个世界上也少有几个人能比。
后来我才发现,Robert Constable 原来是 Stephen Kleene 的学生,而 Stephen Kleene 是 Alonzo Church 的学生。Alonzo Church 有另一个学生,他非常的出名,几乎无人不知无人不晓,他的名字叫图灵(Alan Turing)。名师出高徒,这确实是不可不信的。每个人都知道图灵,可是有多少人听说过 Stephen Kleene?其实每个程序员几乎每天都不知不觉使用他的成果。正则表达式里的 * 号(比如 "a*b*")其实叫做 "Kleene star",因为是 Kleene 发明了这个东西。Kleene 还有其它一些非常重要的成果,它们超前于时代,以至于直到今天人们还没能完全理解它们的潜力。举一个例子就是 Kleene 的“SMN定理”,由这个定理衍生出来的一种方法叫 Partial Evaluation,它涵盖了编译器内部大部分的“优化”,你甚至可以用这种方法来自动生成编译器。世界上最先进的 Scheme 编译器 Chez Scheme,内部就实现了这样一个优化,它能一步到位的完成别的编译器需要多步的优化,却比这多个步骤累加起来的效果还要好。
每当说到这些的时候我就默默的感叹,这个世界是怎么了。人们都说“长江后浪推前浪”,事实却不是这样的。前几天我看了一篇 Kleene 写于 1945 年的论文,几乎涵盖了现在某领域最新,最热门,最尖端的思想。而现代逻辑学鼻祖 Gottlob Frege 写于 1879 年的论文 "Begriffsschrift",居然比后来大部分的逻辑学著作更加深刻,更加直观。为什么我们总是没法超越“古人”?因为人们都喜欢忘记历史,喜欢把简单的问题搞复杂,喜欢听能说会道的人瞎掰,却连这些有真知的科学家的名字都没听说过,更不要说去看他们的论文。
星光灿烂
鉴于广大程序员对程序语言这个专业的不了解,我这里给出一个“真正的程序语言专家名单”,让大家对他们有所了解。这里面几乎每一个人都可以被称为巨星。当然由于他们人数众多,我不可能全都列举出来,这里的列表基本上出自我看过的最好的论文。虽然其中有好些人得过图灵奖,他们一般不会以“图灵奖得主”自居。他们对计算本质的认识,有些甚至超过图灵本人。
这个列表是:C.A.R. Hoare, Dana Scott, Robin Milner, John McCarthy, Dale Miller, Christopher Strachey, Peter Landin, Robert Constable, R.M. Burstall, Valentin Turchin, Patrick Cousot, Neil D. Jones, Gordon Plotkin, J Strother Moore, Tobias Nipkow, Robert Harper, John Reynolds, Frank Pfenning, Olivier Danvy, Yoshihiko Futamura, Philip Wadler, Luca Cardeli, Greg Morrisett, Benjamin Pierce, Daniel Friedman, Matthias Felleisen, Amr Sabry, R. Kent Dybvig, ...
列出这个列表,并不是说我们应该转而膜拜他们,而只是开拓一下大家的眼界,说明到底哪些人是真正的在潜心研究程序语言,不要把眼光局限于大众崇拜的“英雄”。其实不管膜拜什么人,最后你都会发现是个错误。比如我就发现上述某些人提出的概念过于复杂,却因为是(领域内的)名人而被盲目的推崇。如果你不加批判就接受的话,就永远解不开那个结。我也并不是想把我的领域捧上天。这个领域里也存在很多喜欢吹牛皮的人,偷换概念,写没有意义的论文。这些我都看得很清楚。
另外有一些人算是“半个”程序语言专家。为什么叫“半个”呢?因为他们更加接近于逻辑学家或者哲学家。在一方面,他们的思想更加深邃,经常出其不意的给出程序语言专家们梦寐以求的答案;然而在另一方面,他们的思想往往过于“符号化”,以至于他们对问题的表达方式过于复杂。由于他们的贡献对程序语言的巨大作用,也一并列在这里:
Alonzo Church, Stephen Kleene, N.G. de Bruijn, Haskell Curry, W.A. Howard, Per Martin-L?f, Gerard Huet, Henk Barendregt, Thierry Coquand, Jean-Yves Girard, ...
这些人之间存在着有趣的师承关系,你可以到 Mathematics Genealogy Project 查“学术家谱图”。如果一个人发明了某个概念,他的学生们也会有类似的想法。所以我经常通过这个家谱图发现具有近似思想的人,或者顺藤摸瓜找到他们思想的源头。这也可以作为一个寻找志同道合的导师的窍门。