00 学习指南 如何学习这门编译原理实战课? 你好,欢迎来到《编译原理实战课》,我是专栏编辑王惠,很高兴认识你。

我们都知道,“编译原理”是一门特别硬核的计算机基础专业课。你是不是也觉得编译原理知识就像是一片望不到头的大海,任自己在里面怎么扑腾、怎么挣扎都游不到学成的对岸。但是没关系,现在我们可以跟着宫老师的脚步一起探索编译的旅程了。

不过在正式开始学习这门课程之前,我想先和你聊聊这门课程的一些设计思路和特设板块,帮你找到最适合自己的学习方式,让你后面的学习能达到事半功倍的效果。

我们有“学习委员”了

首先来说个好消息,咱这门课呢有学习委员陪伴我们一起学。担当学委的是我们的资深用户朱英达同学,他曾就职于百度,履任资深研发工程师,擅长Web前后端相关领域技术,对编译技术在业务场景下的应用也有自己的理解。

他的经历可能和你很相似:作为一名计算机科班出身的程序员,在大学课堂中学习过编译原理这门课,但面对教科书上庞杂的知识体系、晦涩的抽象概念、陈旧的代码用例,无奈只学了个一知半解;工作以后,作为一名一线的Coder,在大厂的环境里,看惯了层出不穷的“造轮子怪象”,最终才发现只有掌握像编译原理这样的底层技术,才是真正的精进之道。所以,他想把编译原理这门课重新捡起来,再学一次。

然而,目前市面上编译方面的技术资料却非常匮乏,被学界奉为经典的“龙书”“虎书”“鲸书”,对初学者来说又不够友好。后来,他遇到了宫老师的《编译原理之美》,跟着老师的思路重走了一遭编译之旅,发现自己之前对于编译技术的很多困惑点都迎刃而解了。比如说,宫老师在阐释虚拟机架构时,谈到了栈机和寄存器架构的优劣,这就对他理解V8引擎在虚拟机架构选型上提供了非常好的参考。

朱学委最终也发现,编译技术的学习绝对不能纸上谈兵,只有把学到的理论知识与自己从事的相关技术领域结合起来,才会真正有所感悟。

你看,编译原理或者说所有的技术,都有这么一个反复学习、反复印证的过程。所以在这门课程中,学委将会基于积累的编译原理基础,以及对这门新课程内容的学习,不定期地分享他学习编译原理的方法和思路,和你一起探讨课程要掌握的要点和难点。当然了,学委也会在留言区督促你交作业,和你一起交流讨论。

有了学委的陪伴,相信你再学习这门课,一定可以事半功倍。

如何学习预备知识模块?

接下来,我来说说怎么利用好预备知识模块。

那我先来交代下为什么要特别设计这个模块。就像老师在开篇词中所说的,这门课程会带你一起阅读真实语言编译器的源码,跟踪它们的运行过程,分析编译过程的每一步是如何实现的,并会对有特点的编译技术点加以分析和点评。

但在解析编译器的过程中,一定会涉及到很多编译原理的基础概念、理论和算法,如果你从来没有接触过或者不够了解这些编译原理知识,那必然会在一定程度上影响你后面的学习效果。所以,预备知识模块就是帮你先建立起一个初步的编译原理知识体系,打好基础,为后面的学习做好准备。

如果你已经学过老师的第一季课程《编译原理之美》,预备篇的内容也建议你不要跳过。和第一季课程相比,在这个模块里宫老师会以更加高屋建瓴的方式,来重新交付编译基础知识。所以,你一定要利用这个模块来查漏补缺。

那具体怎么做呢?建议你先看每一讲的标题,然后回顾自己已经学过的、掌握了的知识要点,写下来,写好后再开始学习,学完后对比总结心得。千万不要错过这个再学一次的机会。我们都知道重复是学习的关键一环,相信通过这个模块,你一定能在编译技术的理解上更上层楼。

你可以把预备知识理解为编译基础的一个串讲,涉及到的概念会比较多。所以学习这个模块的时候,我建议你每学完一讲都要自己动手画一下这一讲的知识地图。等8篇结束后,学习委员也会总结一张编译原理的核心基础知识大地图。到时候你可以对比来看,给自己一个直接的反馈。然后一定要利用这张图,在脑子里构建起编译原理的知识框架。这样,你就做好了进入下个模块的学习准备啦。

解析7种语言编译器的过程中,你需要做什么?

下面我来说说课程的重头戏,也就是解析7种语言的编译器,包括Java编译器(javac)、Java的JIT编译器(Graal)、Python编译器(CPython)、JavaScript编译器(V8)、Julia语言的编译器、Go语言的编译器(gc),以及MySQL的编译器。

这些编译器都是宫老师精选出来的,具有一定的代表性、采用了不同的编译技术,而且其中某一门语言也非常可能就是你在使用的。我们的课程就是从实战的角度切入,用你最擅长的方式(写代码、读代码)带你分析这些编译器。所以学好这门课的关键就是要动手实践,跟随老师的脚步来亲身体验不同编译器的实现机制。

我建议你最好在学习的过程中手边备着一台电脑,或者是一台能查看到源代码的其他设备,工具不重要,趁手最有效。你在自己上手修改源码的时候,就会发现对编译原理的概念理解得更加深入了。

期中复习周,停下来是为了跑得更快

接着来说说期中复习周。这一周安排在“真实编译器解析篇”之后,也就是建立在你已经学习并理解了7种不同语言编译器的运行机制之后。设置复习周的目的,就是想要让你能及时、系统地了解自己前半段课程内容的掌握情况,发现学习上的漏洞,并及时弥补。

在这一周,学委首先会帮你划出复习的重点,给你总结前面解析的7种语言编译器所涉及到的核心知识。总结复习的过程,也就是你在提高编译技术能力的过程。

接下来,老师会给你出一套考试题。通过这次测试,你可以验证一下自己的学习方式是否有效,希望你能够及时调整学习心态和方法,更有效率地进行下一阶段的学习。

另外,在消化知识的同时,你还可以通过其他同学分享的心得,去看看他是如何学习、掌握编译原理知识的,毕竟通过借鉴别人来完善自己也是一种很好的学习方法嘛。

Learning by Sharing,分享了才知道自己那么优秀

再接下来,我必须得说说“一课一思”这个学习环节了。

一课一思是每一讲最后的固定模块,具体内容呢,要么是给你留了一道动手实践的作业,要么就是抛出一个开放性的问题,引导你发散思考。如果你对这些问题都有自己的见解或者看法,那就不妨在留言区分享出来。这样渐渐地,你会发现自己就能解答一些同学的问题了,这是非常好的自检学习成果的方式。

另外别忘记了,极客时间还有一个社区交流的版块“部落”。在日常工作中,你一定会经常接触各种代码,也一定有自己非常熟悉的一门或多门编程语言。那么在解析了不同语言的编译器以后,你可以在部落里分享自己对于熟悉的或不熟悉的语言编译器的理解。

比如说,你原来深耕在Java领域,那么在学完了javac编译器和Graal编译器以后,你对Java是不是就有更深刻的理解了?在学完了Python的编译器以后,你是不是对这两门语言之间的共性和特性都更加清晰了?这些思考你都可以分享在部落里,通过分享自己所习得的知识,你会获得更好的成长。

如何验收学习成果?

最后,在课程的收尾阶段呢,老师还会跟你一起关注一个热点话题,那就是华为的方舟编译器。相信很多同学对于国产的编译器,一直都是翘首以盼的。华为已经公开了一部分源代码,虽然资料仍然很缺乏,但是通过我们课程的学习,你是否有能力看懂华为的编译器呢?从掌握书本上的原理,到读懂流行的语言,再到理解方舟编译器的实现思路,这会是你能力一步步提升的过程。最终,你甚至可以参与到一款严肃的编译器的研发当中了。

好了,以上就是我想让你重点关注的课程设计和特设板块内容。编译原理是个难啃的硬骨头,但是我相信,只要你保有这份一定要吃透编译技术核心知识的决心,有计划、有重点,结合实践进行学习,就没有什么是看不懂、学不会的了。加油吧,祝你学有所成!

参考资料

https://learn.lianglianglee.com/%e4%b8%93%e6%a0%8f/%e7%bc%96%e8%af%91%e5%8e%9f%e7%90%86%e5%ae%9e%e6%88%98%e8%af%be/00%20%e5%ad%a6%e4%b9%a0%e6%8c%87%e5%8d%97%20%e5%a6%82%e4%bd%95%e5%ad%a6%e4%b9%a0%e8%bf%99%e9%97%a8%e7%bc%96%e8%af%91%e5%8e%9f%e7%90%86%e5%ae%9e%e6%88%98%e8%af%be%ef%bc%9f.md