2019年最新编译原理学习全攻略

2019 年 8 月 27 日

2019年最新编译原理学习全攻略

出自专栏《编译原理之美》,作者宫文学。


众所周知,编译技术是计算机科学史上的明珠之一。如果说互联网的发展是建立在编译技术和编程语言之上的也并不为过。


但有的工程师可能会觉得,我也不会去设计一门新的编程语言,有必要学习编译原理吗?学了有什么用呢?实际上,编译原理不是用于炫耀的屠龙技,开发者在工作中经常会碰到需要编译技术的场景,比如:


  • 编写界面模板引擎;

  • 为项目编写各种各样的 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


可参考的源代码



学习方法和建议


1.首要的,是要建立直观的理解


我给出的学习过程是非常缓慢的爬坡,先把术语、算法和理论放在一边,就能建立对编译过程各个阶段的直观理解,懂了是最重要的。


2.多思考,多动手实操


比尔·盖茨和丹尼斯·里奇开始写编译器时,根本没有编译原理这门课。我的经验,你动手写一个编译器,可能比上编译原理课简单得多。联系实际,从你的领域中找到可能编译技术能帮上忙的地方,现在就开始尝试去解决它。


3.跟上节奏,辅助教材


这门课不像“龙书”全面和理论化,但是它能化抽象为具体案例,化结论为探索过程,化理论为动手能力。在学习的过程中,建议结合手边的教材及我给出的参考资料,查漏补缺。


如今的快餐式学习,虽然会帮助个人在短期内迅速了解一门技术,但工程师想要保持长期的竞争力,学习底层知识并进行实践,提升专业素养必不可少。也许你以后不会成为编译器开发者,但学好编译原理,一定会让你终生受益。


专栏《编译原理之美》,作者宫文学,目前已有 5400+人加入学习,上线优惠倒计时 3 天,早鸟¥68,立省¥31,点击免费试读


2019 年 8 月 27 日 13:425103

评论

发布
暂无评论
发现更多内容

海纳百川无所不容,Win10环境下使用Docker容器式部署前后端分离项目Django+Vue.js

刘悦的技术博客

Python Docker 镜像 容器化 部署

数据可视化平台搭建,警务实战平台大数据应用

t13823115967

数据可视化 可视化数据分析搭建 警务实战平台

第十周作业总结

hunk

极客大学架构师训练营

智能合约系统软件开发|智能合约APP开发

开發I852946OIIO

系统开发

面试官:说说操作系统微内核和Dubbo微内核?

yes的练级攻略

dubbo 操作系统 微内核

掌趣电竞系统开发搭建

Geek_a620db

全1子串算法求解、单元测试的必要性论述 John 易筋 ARTS 打卡 Week 32

John(易筋)

ARTS 打卡计划 全1子串算法求解 单元测试必要性

物联网方面的竞赛有那些?

IoT云工坊

架构师训练营 - 大作业二

lucian

第 5 周作业提交

Binary

极客大学架构师训练营

架构师训练营第2期 第10周作业

月下独酌

极客大学架构师训练营

深入解析SpringMVC核心原理:从手写简易版MVC框架开始(SmartMvc)

Silently9527

Java mvc springmvc

指尖上的警务,打造微警务管理服务平台

t13823115967

智慧警务系统开发 微警务

NO.002-Java并发编程之多核硬件架构

葛一凡

操作系统 设计原则 硬件架构

Week 10 模块分解

evildracula

学习 架构

第 5 周学习总结

Binary

极客大学架构师训练营

数据库范式与反范式设计,是一门艺术

flyer0126

数据库 范式

《Python数据科学:关于使用Python处理数据需要了解的终极指南》PDF免费下载

计算机与AI

Python 数据科学

架构师训练营 第3期 第5周 作业和总结

ihiming

使用 Serverless 创建一个简单的短网址服务

donghui2020

flask Serverless Lambda Store

程序员的bug修复宝典

程序员 经验总结 bug修复

共享单车系统搭建

Geek_a620db

第10周作业

Rocky·Chen

第十周作业

hunk

极客大学架构师训练营

关于Dubbo的原理

皮蛋

架构师训练营第2期 第10周总结

月下独酌

极客大学架构师训练营

架构师训练营 - 大作业一

lucian

十、服务分解

Geek_28b526

6. 抹平差异,统一类型转换服务ConversionService

YourBatman

Spring Framework 类型转换 Converter ConversionService

Week10 作业

evildracula

生产环境全链路压测建设历程 21:某快递 A 股上市公司的生产压测案例之彩蛋 2 中篇

数列科技杨德华

全链路压测 七日更

2019年最新编译原理学习全攻略-InfoQ