出自专栏《编译原理之美》,作者宫文学。
众所周知,编译技术是计算机科学史上的明珠之一。如果说互联网的发展是建立在编译技术和编程语言之上的也并不为过。
但有的工程师可能会觉得,我也不会去设计一门新的编程语言,有必要学习编译原理吗?学了有什么用呢?实际上,编译原理不是用于炫耀的屠龙技,开发者在工作中经常会碰到需要编译技术的场景,比如:
编写界面模板引擎;
为项目编写各种各样的 DSL;
深度理解甚至开发出 Spring、Hibernate、阿里巴巴 Druid 这样的工具。
除此之外,解析用户输入,防止代码注入,为前端工程师提供像 React 那样的 DSL,像 TypeScript 那样把一门语言翻译成另一门语言,像 CMake 和 Maven 那样通过配置文件来灵活工作等,都会用到编译技术。
正因如此,技术人想要提升自己的职场竞争力,掌握这些知识十分重要。当然,我也知道编译原理晦涩难懂、既抽象又理论化,很容易让人产生畏难情绪。
为此,我做了这个学习全攻略,希望帮你高效、清晰地入门编译原理,破除学习心魔,建立直觉和自信,我也看到不少同学立下了学习的 Flag,这一次让我们一起彻底攻克这门硬核功夫吧。
哪些人适合学习编译原理?
想让自己的软件产品具备更强的定制能力
软件产品在推广的时候,要有能力适应个性化的需求,比如企业用的报表软件、HR 软件、流程软件等。你可以通过公式、脚本、特定领域语言来实现这个目标。
如果你有志于研发平台软件或工具类软件
大数据平台、游戏平台等等软件,都需要有内置的语言。像 Spring、Hibernate 这样的工具或框架,也都需要编译技术的支持。
如果你想在工作中出类拔萃
做个 DSL 快速生成业务代码?高效处理运维问题?做个界面模板引擎?运用编译技术可以在更高维度工作。别人用语言,你发明语言,想不出成绩都难。
希望突破技术瓶颈的开发者
无论你是前端还是后端,编译原理让你从本质上了解语言乃至计算机的运行机制,从根本上提升自己的能力,突破知识边界和技术瓶颈,让多年的技术经验融会贯通,保持长期的竞争力。
学习编译原理需要什么基础?
基础门槛:
1.至少熟练掌握一门编程语言
有任何语言的背景都可以学习,课程示例代码有 C/C++、Java 的、JavaScript 的。这门课本身是为了让你了解各门语言背后的知识,不会因为你所掌握的具体语言而卡壳。
2.掌握所有工程师都需要具备的一些基础技术知识和能力,最好了解过:
递归程序、正则表达式,数据结构中的树和栈,这些会有助于你学习编译器前端技术中。
有一些计算机组成原理方面的知识,会有助于你学习编译器的后端技术。
如果了解过一点汇编语言,以及用过C/C++语言的编译器就更好了。
加分项:
1.英文的阅读能力;
2.动手跑一跑、改一改示例代码的意愿;
3.有掌握底层基础知识,提升自己的热情和动力。
深入浅出学习编译原理
1.掌握编译原理的底层知识,学以致用。
系统掌握编译器的核心技能
手动实现解释型和编译型2门语言
4大案例解读,深入剖析编译原理的实践应用
编译技术的的未来趋势解读
2.动手实践,成功实现一个编译器
Flag 虽好,但最重要的还是跟上学习进度和节奏,课程有很多示例代码,每一步都是能运行的,而不是到最后才有一个可运行的东西。鼓励大家多动手实践,去改示例代码,最终一步步手动实现一个编译器。
编译原理知识全景图
为了帮助大家克服畏难情绪,更好地理解和实践编译技术,我整理了一张”编译原理全景图”,涵盖词法分析、语法分析、语义分析、中间语言、代码优化、使用 Antlr 和 LLVM 工具等,希望帮你快速、直观地了解我们的知识结构体系。
学习编译原理你可以收获的能力
1.让你的软件支持公式和脚本,从而具有更强的灵活性;
2.有能力参与基础软件的研发,因为它们很多都会用到编译技术,比如 Hibernate、Spring、大数据系统等等;
3.编写特定领域语言,解决领域问题;
4.写出高效、高质的代码,成为更优秀的开发者;
5.更好地理解和学习新的语言,降低学习成本,快速跟进技术潮流;
6.保持开发者的长期竞争力。
书籍推荐
学习资料及源码推荐
Antlr 项目主页:https://www.antlr.org
参考的规则文件:https://github.com/antlr/grammars-v4
LLVM 项目主页:http://llvm.org
文档资料:http://llvm.org/docs
可参考的源代码
Java 的编译器:你下载了 jdk 的源代码以后,在 java.compiler 和 jdk.compiler 两个目录中有编译器的源代码。
LLVM 中 Clang 前端,即 C、C++、Objective C 的编译器:http://releases.llvm.org/download.html#8.0.1
学习方法和建议
1.首要的,是要建立直观的理解
我给出的学习过程是非常缓慢的爬坡,先把术语、算法和理论放在一边,就能建立对编译过程各个阶段的直观理解,懂了是最重要的。
2.多思考,多动手实操
比尔·盖茨和丹尼斯·里奇开始写编译器时,根本没有编译原理这门课。我的经验,你动手写一个编译器,可能比上编译原理课简单得多。联系实际,从你的领域中找到可能编译技术能帮上忙的地方,现在就开始尝试去解决它。
3.跟上节奏,辅助教材
这门课不像“龙书”全面和理论化,但是它能化抽象为具体案例,化结论为探索过程,化理论为动手能力。在学习的过程中,建议结合手边的教材及我给出的参考资料,查漏补缺。
如今的快餐式学习,虽然会帮助个人在短期内迅速了解一门技术,但工程师想要保持长期的竞争力,学习底层知识并进行实践,提升专业素养必不可少。也许你以后不会成为编译器开发者,但学好编译原理,一定会让你终生受益。
专栏《编译原理之美》,作者宫文学,目前已有 5400+人加入学习,上线优惠倒计时 3 天,早鸟¥68,立省¥31,点击免费试读。
评论