结束语 用程序语言,推动这个世界的演化 据说,第二次世界大战期间,图灵和同事破译的情报,在盟军诺曼底登陆等重大军事行动中发挥了重要作用。历史学家认为,他让二战提早了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年,使用编译技术做出一番成绩。

对我来说,我很高兴有机会专心致志地梳理编译原理相关的知识体系。而在梳理到每个知识点的时候,我都会迸发出很多灵感。这些灵感将会融入到我正在开发的一个软件和后续的工作中。

在这个过程中,我还有一个额外的收获,就是感觉自己的写作水平和普通话水平都提高了。原因很简单:因为每篇文稿都要改好几遍,录音有时也要录几遍。而把陡峭的学习曲线,变成一个让你缓缓爬坡的过程,也促使我必须竭尽全力!

我也觉得用仅仅40讲左右的课程,涵盖整个编译原理的知识体系,恐怕会显得不足。虽然涵盖了主要的知识点和脉络,但我在进入每个技术点的时候,发现要把这个点完全展开,可能都需要好几讲才行。不过没关系,我和极客时间还有进一步的计划,你可以等待好消息!

总的来说,信息技术的进步史,也是一代代大师的人文故事史。而编译技术让我们有机会走近这些大师,与他们对话,并加入他们。中国的程序员面临着历史的机遇,而抓住机遇的关键,是自我意识的觉醒,是敢于成为科技进步历史洪流中的博浪者的决心。

希望与你共勉,一起进步!

最后,我为你准备了一份结课问卷,题目不多,两三分钟就可以完成。希望你能畅所欲言,把自己真实的学习感受和意见表达出来,我一定会认真看,期待你的反馈。当然,如果你对专栏内容还有什么问题,也欢迎你在留言区继续提问,我会持续回复你的留言,我们江湖再见!

参考资料

https://learn.lianglianglee.com/%e4%b8%93%e6%a0%8f/%e7%bc%96%e8%af%91%e5%8e%9f%e7%90%86%e4%b9%8b%e7%be%8e/%e7%bb%93%e6%9d%9f%e8%af%ad%20%e7%94%a8%e7%a8%8b%e5%ba%8f%e8%af%ad%e8%a8%80%ef%bc%8c%e6%8e%a8%e5%8a%a8%e8%bf%99%e4%b8%aa%e4%b8%96%e7%95%8c%e7%9a%84%e6%bc%94%e5%8c%96.md