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.

70 lines
9.1 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 学习指南 | 如何学习这门编译原理实战课?
你好,欢迎来到《编译原理实战课》,我是专栏编辑王惠,很高兴认识你。
我们都知道,“编译原理”是一门特别硬核的计算机基础专业课。你是不是也觉得编译原理知识就像是一片望不到头的大海,任自己在里面怎么扑腾、怎么挣扎都游不到学成的对岸。但是没关系,现在我们可以跟着宫老师的脚步一起探索编译的旅程了。
不过在正式开始学习这门课程之前,我想先和你聊聊这门课程的一些设计思路和特设板块,帮你找到最适合自己的学习方式,让你后面的学习能达到事半功倍的效果。
## 我们有“学习委员”了
首先来说个好消息咱这门课呢有学习委员陪伴我们一起学。担当学委的是我们的资深用户朱英达同学他曾就职于百度履任资深研发工程师擅长Web前后端相关领域技术对编译技术在业务场景下的应用也有自己的理解。
他的经历可能和你很相似作为一名计算机科班出身的程序员在大学课堂中学习过编译原理这门课但面对教科书上庞杂的知识体系、晦涩的抽象概念、陈旧的代码用例无奈只学了个一知半解工作以后作为一名一线的Coder在大厂的环境里看惯了层出不穷的“造轮子怪象”最终才发现只有掌握像编译原理这样的底层技术才是真正的精进之道。所以他想把编译原理这门课重新捡起来再学一次。
然而目前市面上编译方面的技术资料却非常匮乏被学界奉为经典的“龙书”“虎书”“鲸书”对初学者来说又不够友好。后来他遇到了宫老师的《编译原理之美》跟着老师的思路重走了一遭编译之旅发现自己之前对于编译技术的很多困惑点都迎刃而解了。比如说宫老师在阐释虚拟机架构时谈到了栈机和寄存器架构的优劣这就对他理解V8引擎在虚拟机架构选型上提供了非常好的参考。
朱学委最终也发现,**编译技术的学习绝对不能纸上谈兵,只有把学到的理论知识与自己从事的相关技术领域结合起来,才会真正有所感悟。**
你看,编译原理或者说所有的技术,都有这么一个反复学习、反复印证的过程。所以在这门课程中,学委将会基于积累的编译原理基础,以及对这门新课程内容的学习,不定期地分享他学习编译原理的方法和思路,和你一起探讨课程要掌握的要点和难点。当然了,学委也会在留言区督促你交作业,和你一起交流讨论。
有了学委的陪伴,相信你再学习这门课,一定可以事半功倍。
## 如何学习预备知识模块?
接下来,我来说说怎么利用好预备知识模块。
那我先来交代下为什么要特别设计这个模块。就像老师在开篇词中所说的,这门课程会带你一起阅读真实语言编译器的源码,跟踪它们的运行过程,分析编译过程的每一步是如何实现的,并会对有特点的编译技术点加以分析和点评。
但在解析编译器的过程中,一定会涉及到很多编译原理的基础概念、理论和算法,如果你从来没有接触过或者不够了解这些编译原理知识,那必然会在一定程度上影响你后面的学习效果。所以,预备知识模块就是帮你先建立起一个初步的编译原理知识体系,打好基础,为后面的学习做好准备。
如果你已经学过老师的第一季课程[《编译原理之美》](https://time.geekbang.org/column/intro/219?utm_term=zeusGI5E3&utm_source=app&utm_medium=geektime&utm_campaign=219-end&utm_content=xuexizhinan0601),预备篇的内容也建议你不要跳过。和第一季课程相比,在这个模块里宫老师会以更加高屋建瓴的方式,来重新交付编译基础知识。所以,你一定要利用这个模块来查漏补缺。
那具体怎么做呢?**建议你先看每一讲的标题,然后回顾自己已经学过的、掌握了的知识要点,写下来,写好后再开始学习,学完后对比总结心得。**千万不要错过这个再学一次的机会。我们都知道重复是学习的关键一环,相信通过这个模块,你一定能在编译技术的理解上更上层楼。
你可以把预备知识理解为编译基础的一个串讲涉及到的概念会比较多。所以学习这个模块的时候我建议你每学完一讲都要自己动手画一下这一讲的知识地图。等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的编译器以后你是不是对这两门语言之间的共性和特性都更加清晰了这些思考你都可以分享在部落里通过分享自己所习得的知识你会获得更好的成长。
## 如何验收学习成果?
最后,在课程的收尾阶段呢,老师还会跟你一起关注一个热点话题,那就是华为的方舟编译器。相信很多同学对于国产的编译器,一直都是翘首以盼的。华为已经公开了一部分源代码,虽然资料仍然很缺乏,但是通过我们课程的学习,你是否有能力看懂华为的编译器呢?从掌握书本上的原理,到读懂流行的语言,再到理解方舟编译器的实现思路,这会是你能力一步步提升的过程。最终,你甚至可以参与到一款严肃的编译器的研发当中了。
好了,以上就是我想让你重点关注的课程设计和特设板块内容。编译原理是个难啃的硬骨头,但是我相信,只要你保有这份一定要吃透编译技术核心知识的决心,有计划、有重点,结合实践进行学习,就没有什么是看不懂、学不会的了。加油吧,祝你学有所成!