据说,第二次世界大战期间,图灵和同事破译的情报,在盟军诺曼底登陆等重大军事行动中发挥了重要作用。历史学家认为,他让二战提早了 2 年结束,至少拯救了 2000 万人的生命。也据说,苹果公司的 Logo 就是用来纪念图灵的。
图灵的故事不再赘述,你上网随便搜个关键词都能找到。不过,通过这个故事,我们能得到两点启示:
对信息的处理能力至关重要,从此信息技术成为了科技进步的主角,一直到现在。
科技永远关乎人性,科技是客观的,而推动科技发展的人,是有温度、有故事的。
所以,在这个课程结束的今天,除了想跟你好好地说声再见之外,更多地是想分享作为一个程序员,我们的挣扎、骄傲,以及跟这个社会的关系,跟时代洪流的关系。有一些感受分享一下。
学习技术的过程,是跟大师对话的过程,是融入科技发展这条历史河流的过程,是一个有温度的心路历程。
有同学说,这门课,串联了计算机领域的很多基础课程。的确如他所说,当然,我也认为编译原理这门课,串联着整个计算机发展的历史,以及做出重要贡献的一代代大师。
什么是大师?这么说吧。比如你针对某方面的问题琢磨了很多年,有所心得。刚想进一步梳理头绪,就发现有人在多年前,已经针对这方面的问题发表了一个理论,并且论述得很完整,很严密。这个人,就可以叫做大师。
一个朋友,某上市公司的副总,原来是在大学教物理的,闲暇时间还会琢磨物理学的理论。有时候,他在琢磨一个点的时候,觉得很有心得,刚想整理出来,再一查文献,发现某个人已经在这个方向发表了成果。他形象地比喻说,刚想写《红楼梦》呢,发现一个叫曹雪芹的已经写了。
计算机领域也有很多大师。我们在学编译原理的时候,其实一直在跟各位大师邂逅。
比如,当讨论有限自动机的时候,你知道那是一个最简单的图灵机(Turling Machine)。你再去阅读这方面的资料,会发现图灵那时在思考什么是计算,这种根本性的问题。
当我们探讨到程序运行环境、汇编语言、机器语言的时候,你会感觉似乎跟冯·诺依曼(John Von Neumann)走近了。你会感受到第一代程序员,用机器码写程序是什么感觉。
第一代程序员的人数只有个位数,他们甚至当时都没有考虑到,还可以用别的方式写程序。所以,当冯·诺依曼的一个学生发明汇编的写法时,这位老师甚至觉得那不叫写程序。
而只有你自己动手写了汇编代码,你才能体会到,第二代程序员是怎样写程序的,其中包括比尔·盖茨(Bill Gates)。显然,比尔·盖茨认为普通程序员应该用更简单的语言,于是他写了一个 Basic 语言的解释器。其他熟练使用汇编语言的程序员,还包括为阿波罗登月计划,编写程序的传奇女程序员,玛格丽特·希菲尔德·汉密尔顿(Margaret Heafield Hamilton)。以及中国的雷军等等。题外话,我看过一个图表,早期程序员中,女性的比例很高,希望未来更多的女性回归这个行业。
接下来,你会遇到 C 语言的发明人丹尼斯·里奇(Dennis Ritchie), 他的工作是基于肯. 汤普森(Ken Thompson)的 B 语言。这俩人还是 Unix 操作系统的发明者。目前,肯. 汤普森仍在 Go 语言项目组中工作。
我们使用的 Java、JavaScript、Go 语言等的语法风格,都是一路受到 C 语言的影响。我们做编译器的时候,要考虑调用约定、二进制接口,也能从这里找到源头。
在前端部分,我们讨论过面向对象的语义特征,和类型系统。而面向对象的编程思想,在 60 年代就被提出了,经由 80 年代的 C++ 和 90 年代的 Java 才开始盛行。
我们同样简单实现过一等公民的函数和高阶函数,它们是函数式编程的特征。最近几年函数式编程的思想开始热起来,但它的起源更早,可以追溯到 30 年代阿隆佐·邱奇(Alonzo Church)提出的 Lambda 演算理论中。
邱奇用一种与图灵不同的方式,探讨了什么叫做计算,这个根本问题。他的思想于 50 年代体现在 Lisp 语言上。Lisp 的发明人是人工智能的先驱约翰·麦卡锡(John McCarthy),这门语言成了计算机语言一些重要基因的来源,JavaScript、Ruby、Clojure、Scala、Julia 等语言都从中汲取营养。最近在研究云计算环境下的分布式数据库问题,发现可能还是要借鉴函数式编程的思想。
再有,编译原理中的属性语法和很多算法,不能不提高德纳(Donald Ervin Knuth)的贡献。他的著作应该成为你的必读。
当我们讨论 Java 的一些特征时,你可以试着体会 Java 语言之父詹姆斯·高斯林(James Gosling)当初设计字节码时在想什么。你还可以体会一下 布兰登·艾奇(Brendan Eich) 用很短的时间发明 JavaScript 时,是汲取了前人的哪些思想,以及是如何做出那些重要的决定的,这些决定使得 JavaScript 在元编程能力、函数式编程等方面,直到现在都焕发出勃勃生机。
当你学会编译原理的一个个知识点的时候,就是一步步走近大师们的过程。他们的名字不再是教科书上抽象的符号,你已经能够逐渐欣赏他们的思想,感受到他们的感受,和他们隔着时空交流。而当你凭着自己的经验,探索到了跟他们相同的方向上,你会更觉得有成就感,会觉得自己真正融入了科技演化的洪流中,算是开了窍了,算是其中的一份子了。
我想,真正在科技领域做出重大成绩的人,都会有这样一种,摸到了科技发展脉搏的感觉。据说,张小龙曾经说过,读懂了《失控》这本书的人,可以直接去他的团队上班。我猜,他对复杂系统科学情有独钟,产生了很多的心得。而任正非先生则对热力学中熵的理论感触很深,并把它深刻地融入到了华为的价值观和管理体系中。
除此之外,我们还要感谢 Antlr 工具的作者特恩斯·帕尔(Terence Parr)以及 LLVM 的核心作者 克里斯·拉特纳(Chris Lattner) 。通过阅读他们的文章和代码,以及其他研究者的论文,你会感受到这个领域最前沿的脉搏。
而通过编译原理中的一些应用课程,我们还可以更好地理解 Spring 等工具的设计者的思维。并且思考,是否自己也有能力驾驭这样的项目,从而成为技术进步洪流中的博浪者。
我相信,如果你不想学习编译原理,可以轻松找到一百个理由。比如:
这个课程太难,我恐怕学不会;
这个课程跟我现在的工作关系不大;
我没有时间;
连谁谁谁都没有学,我就不凑这个热闹了;
…
但如果你想下定决心学会它的话,只要有一个理由就行了,那就是,你也可以成为技术进步洪流中的博浪者,而不是岸边的旁观者。这时,你的自我意识会觉醒:我来了,我要参与。在信息技术成为社会进步关键推动力的今天,这是作为一名程序员的傲骨。
更为重要的是,越来越多的中国程序员已经登上了舞台。越来越多高质量的开源项目,背后是一个个中国名字。我查阅自动化编程这个最前沿领域的文献时,发现文献上也不乏中国名字!
整个世界的目光也开始投向中国,因为他们越来越相信中国的创新能力。我们也确实有能力,因为我们已经有了云计算、人工智能和 5G 技术的积淀,我们正在芯片领域奋起直追,完全自主的操作系统已经开始萌芽。而在这些领域,编译技术都能大展身手。最重要的是,中国作为全球最大的市场之一,拥有最丰富的应用场景,也拥有越来越相信中国创新能力的消费者。
我相信,学习这门课的学员中,不管是大学生,还是已经很有工作经验的大侠,会有相当一批人,在下一个 10 年,使用编译技术做出一番成绩。
对我来说,我很高兴有机会专心致志地梳理编译原理相关的知识体系。而在梳理到每个知识点的时候,我都会迸发出很多灵感。这些灵感将会融入到我正在开发的一个软件和后续的工作中。
总的来说,信息技术的进步史,也是一代代大师的人文故事史。而编译技术让我们有机会走近这些大师,与他们对话,并加入他们。中国的程序员面临着历史的机遇,而抓住机遇的关键,是自我意识的觉醒,是敢于成为科技进步历史洪流中的博浪者的决心。希望与你共勉,一起进步!