Categories
程式開發

千万别学编译原理


你学过编译原理吗?我估计不少科班计算机出身的人学过,但是忘了。非计算机系的,估计买过龙书,那本黑色的编译原理,透着幽幽的冷光,600 多页,大部分人看过……前言。我认识的一些技术人,真正读过学透《编译原理》的,都是技术大牛。

作为一个普通人,有时候必要学习编译原理呢?你用 JavaScritp 编程也不需要学 V8 引擎吧。你用 Python 的时候会操作寄存器么?如果你只是使用一门语言编程,写完了事,其实你不需要知道什么是编译型、解释型和半编译半解释型预研,有 IDE 帮你都搞定了。

你也不需要知道垃圾回收、堆管理,更别提词法分析和语法分析了,你又不会去操作寄存器,也不会写代码生成器,你也不需要去做性能优化,反正这些事情有更高级的工程师做,够了。

Java 编译器(javac)、Java 的 JIT 编译器(Graal)、Python 编译器(CPython)、JavaScript 编译器(V8)、Julia 语言的编译器、Go 语言的编译器(gc),以及 MySQL 的编译器,这些你统统不需要知道,写增删改查完全用不上这些东西。

好了,不学编译原理的理由我已经告诉你了,如果你还想往下看,八成你不想做个普通的开发者。

那学习编译原理能干嘛呢?

第一,研究这些语言的编译机制,能直接提高我们的技术水平。

一方面,深入了解自己使用的语言的编译器,会有助于你吃透这门语言的核心特性,更好地运用它,从而让自己向着专家级别的工程师进军。举个例子,国内某互联网公司的员工,就曾经向 Oracle 公司提交了 HotSpot 的高质量补丁,因为他们在工作中发现了 JVM 编译器的一些不足。那么,你是不是也有可能把一门语言吃得这么透呢?

另一方面,IT 技术的进化速度是很快的,作为技术人,我们需要迅速跟上技术更迭的速度。而这些现代语言的编译器,往往就是整合了最前沿的技术。比如,Java 的 JIT 编译器和 JavaScript 的 V8 编译器,它们都不约而同地采用了“Sea of Nodes”的 IR 来做优化,这是为什么呢?这种 IR 有什么优势呢?这些问题我们都需要迅速弄清楚。

第二,阅读语言编译器的源码,是高效学习编译原理的重要路径。传统上,我们学习编译原理,总是要先学一大堆的理论和算法,理解起来非常困难,让人望而生畏。这个方法本身没有错,因为我们学习任何知识,都要掌握其中的原理。不过,这样可能离实现一款实用的编译器还有相当的距离。那么根据我的经验,学习编译原理的一个有效途径,就是阅读真实世界中编译器的源代码,跟踪它的执行过程,弄懂它的运行机制。因为只要你会写程序,就能读懂代码。既然能读懂代码,那为什么不直接去阅读编译器的源代码呢?在开源的时代,源代码就是一个巨大的知识宝库。面对这个宝库,我们为什么不进去尽情搜刮呢?想带走多少就带走多少,没人拦着。

所以,我们再次邀请了宫文学老师出山,主笔编译原理第二季《编译原理实战课》。这次他会带大家去解析当下热门语言的编译器,比如 Java 编译器(javac)、Java 的 JIT 编译器(Graal)、Python 编译器(CPython)、JavaScript 编译器(V8)、Julia 语言的编译器、Go 语言的编译器(gc),以及 MySQL 的编译器,并且在讲并行的时候,还涉及了 Erlang 的编译器。

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

如果你有兴趣,就加入一起学习吧,因为课程难度比较高,我们还设置了学习委员、直播公开课、作业等学习服务,不可为不周到了。欢迎进入编译原理的世界,这是通晓编程奥秘的入口。

免费试读《编译原理实战课》