千万别学编译原理

你学过编译原理吗?我估计不少科班计算机出身的人学过 , 但是忘了 。 非计算机系的 , 估计买过龙书 , 那本黑色的编译原理 , 透着幽幽的冷光 , 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 的编译器 。
最后 , 宫老师还会带你去阅读和解析华为的方舟编译器 。 相信很多同学对于国产的编译器 , 一直都是翘首以盼的 。 华为已经公开了一部分源代码 , 虽然资料仍然很缺乏 , 但是通过我们课程的学习 , 你是否有能力看懂华为的编译器呢?从掌握书本上的原理 , 到读懂流行的语言 , 再到理解方舟编译器的实现思路 , 这会是你能力一步步提升的过程 。 最终 , 你甚至可以参与到一款严肃的编译器的研发当中了 。


推荐阅读