You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

10 KiB

结束语 | 用程序语言,推动这个世界的演化

据说第二次世界大战期间图灵和同事破译的情报在盟军诺曼底登陆等重大军事行动中发挥了重要作用。历史学家认为他让二战提早了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讲左右的课程涵盖整个编译原理的知识体系恐怕会显得不足。虽然涵盖了主要的知识点和脉络但我在进入每个技术点的时候发现要把这个点完全展开可能都需要好几讲才行。不过没关系我和极客时间还有进一步的计划你可以等待好消息!

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

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

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