编译原理之美 / 手把手教你实现一个编译器
宫文学
北京物演科技CEO
 
  • 课程目录
  • 课程介绍
  • 开篇词 | 为什么你要学习编译原理?

    编译原理不是只能用于炫耀的屠龙技。作为程序员,实际工作中你会经常碰到需要编译技术的场景。

  • 01 | 理解代码:编译器的前端技术

    词法分析是识别一个一个Token,语法分析是在词法分析的基础上识别出程序的语法结构,语义分析是让计算机理解我们的意图。

  • 02 | 正则文法和有限自动机:纯手工打造词法分析器

    要实现一个词法分析器,首先需要写出每个词法的正则表达式,画出有限自动机,然后只要用代码表示这种状态迁移过程就可以了。

  • 03 | 语法分析(一):纯手工打造公式计算器

    本节课会让你纯手工实现一个公式计算器,借此掌握语法分析的原理和递归下降算法,并初步了解上下文无关文法。

  • 04 | 语法分析(二):解决二元表达式中的难点

    在了解如何书写语法规则的基础上,解决优先级、结合性和左递归的问题,掌握像算术运算这样的二元表达式。

  • 05 | 语法分析(三):实现一门简单的脚本语言

    通过对三种语句的支持,实现一门简单的脚本语言。

  • 06 | 编译器前端工具(一):用Antlr生成词法、语法分析器

    利用Antlr生成词法分析器和语法分析器,你就可以把主要的精力放在编写词法和语法规则上,提升工作效率了。

  • 07 | 编译器前端工具(二):用Antlr重构脚本语言

    用Antlr完善表达式体系,语句体系,除此之外,再升级脚本解释器,使它能够执行更多的表达式和语句。

  • 08 | 作用域和生存期:实现块作用域和函数

    通过实现块作用域和函数功能,来探讨作用域和生存期及其实现机制,并升级变量管理机制。

  • 09 | 面向对象:实现数据和方法的封装

    从语义设计和运行时机制的角度剖析面向对象的特性,能深入理解它的实现机制,从而在日常编程工作中更好地运用面向对象的特性。

  • 10 | 闭包: 理解了原理,它就不反直觉了

    闭包很有用,对面试者来讲,它几乎是前端面试必问的一个问题,比如如何用闭包特性实现面向对象编程?

  • 11 | 语义分析(上):如何建立一个完善的类型系统?

    理解类型系统,了解它的本质对学习语言有很大的帮助,在这个过程中,你将不再被静态类型和动态类型,强类型和弱类型等知识难倒。

  • 12 | 语义分析(下):如何做上下文相关情况的处理?

    语义分析的本质,就是针对上下文相关的情况做处理。

  • 13 | 继承和多态:面向对象运行期的动态特性

    我们要想深刻理解面向对象的特征,就必须了解子类型的原理和运行期的机制。

  • 14 | 前端技术应用(一):如何透明地支持数据库分库分表?

    SQL是程序员经常打交道的语言,我们可以利用编译器前端技术,解析SQL语句,并针对分布式数据库透明查询的功能做概念证明。

  • 15 | 前端技术应用(二):如何设计一个报表工具?

    像报表工具这样的软件,如果有编译技术的支持,真的可以做得很灵活、很强大!

  • 16 | NFA和DFA:如何自己实现一个正则表达式工具?

    本节课,我就借“怎样实现正则表达式工具?”这个问题,探讨应用篇的第一组算法:与正则表达式处理有关的算法。

  • 17 | First和Follow集合:用LL算法推演一个实例

    掌握First集合和Follow集合这两个核心概念,熟悉它们的使用场景之后,你会彻底掌握LL算法。

  • 18 | 移进和规约:用LR算法推演一个实例

    LR算法是公认的比较难学的一个算法,这节课我们重点在于建立直观理解,特别是如何依据栈里的信息做正确的反推。

  • 19 | 案例总结与热点问题答疑:对于左递归的语法,为什么我的推导不是左递归的?

    “热点答疑”化身“宫老师大型表扬现场”?你的留言,尤为珍贵。

  • 用户故事 | 因为热爱,所以坚持

    很高兴收到用户的来信,我能感受到你们对编译原理的热爱,也因你们的坚持而感动。

  • 期中考试 | 来赴一场100分的约定吧!

    20道自测题,检验一下,你对编译原理掌握多少?

  • 20 | 高效运行:编译器的后端技术

    相对来说,后端的工作量更大,挑战更多,研究的热点也更多。比如人工智能领域又出现了一些专用的AI芯片和指令集,需要去适配。

  • 21 | 运行时机制:突破现象看本质,透过语法看运行时

    编译器的任务,是要生成能够在计算机上运行的代码,但要生成代码,我们必须对程序的运行环境和运行机制有比较透彻的了解。

  • 22 | 生成汇编代码(一):汇编语言其实不难学

    掌握汇编语言是十分有益的,哪怕掌握一小点儿汇编技能,就能应用到某项工作中,比如,在C语言里嵌入汇编,实现某个特殊功能。

  • 加餐 | 汇编代码编程与栈帧管理

    利用本节课的加餐,我会带你把编程中常见的一些场景,所对应的汇编代码做一些分析。

  • 23 | 生成汇编代码(二):把脚本编译成可执行文件

    学完本节课之后,你在日常工作中进行大型项目的编译管理的时候,或者需要重用别人的类库的时候,思路会更加清晰。

  • 24 | 中间代码:兼容不同的语言和硬件

    我们能基于IR对接不同语言的前端,也能对接不同的硬件架构,还能做很多的优化。

  • 25 | 后端技术的重用:LLVM不仅仅让你高效

    你一定要动手安装和使用LLVM,写点儿代码测试它的功能,比如,写点儿C++等语言的程序,翻译成IR,熟悉LLVM的IR。

  • 26 | 生成IR:实现静态编译的语言

    为了降低学习难度,我没有从AST翻译成IR,而是针对一个目标功能(比如一个C语言的函数),硬编码调用API来生成IR。

  • 27 | 代码优化:为什么你的代码比他的更高效?

    代码优化是编译器后端的两大工作之一,弄懂它,你就掌握了一大块后端技术。

  • 28 | 数据流分析:你写的程序,它更懂

    本节课,我会带你对基于数据流分析的代码优化思路建立清晰的认识,让你有能力根据需要编写自己的优化算法。

  • 29 | 目标代码的生成和优化(一):如何适应各种硬件架构?

    前面的课程中,我带你生成汇编代码的逻辑是比较幼稚的,一个正式的编译器后端,代码生成部分需要考虑得更加严密才可以。

  • 30 | 目标代码的生成和优化(二):如何适应各种硬件架构?

    为什么通过重新排列指令,可以让代码的整体执行效率加快呢?

  • 31 | 内存计算:对海量数据做计算,到底可以有多快?

    SIMD是一种指令级并行技术,它能够矢量化地一次计算多条数据,在计算密集型的需求中,你可以考虑充分利用SIMD技术。

  • 32 | 字节码生成:为什么Spring技术很强大?

    字节码生成技术很有用,你可以用它将高级语言编译成字节码,还可以向原来的代码中注入新代码,来实现对性能的监测等功能。

  • 33 | 垃圾收集:能否不停下整个世界?

    LLVM能为当前所有常见的GC算法提供支持,你写GC的时候,一定要跟LLVM配合,才能让GC顺利发挥作用。

  • 34 | 运行时优化:即时编译的原理和作用

    JIT技术可以让数据库这类基础软件,获得性能上的提升,如果你有志参与研发这类软件,掌握JIT技术会给你加分很多。

  • 35 | 案例总结与热点问题答疑:后端部分真的比前端部分难吗?

    后端技术的工程性比较强,在课程中,我给你梳理了一条,比较清晰的脉络,你可以沿着这条脉络,逐步深化,不断获得自己的感悟!

  • 36 | 当前技术的发展趋势以及其对编译技术的影响

    我期望通过这些内容,你能看到不同的思考视角,获得一些新的信息。

  • 37 | 云编程:云计算会如何改变编程模式?

    编程本身是否也能上云?在云上编程会跟本地开发有什么不同呢?

  • 38 | 元编程:一边写程序,一边写语言

    某种意义上,元编程让程序员拥有了语言设计者的一些权力。你甚至可以说,普通程序员自己写程序,文艺程序员让程序写程序。

  • 结束语 | 用程序语言,推动这个世界的演化

    中国的程序员面临着历史的机遇,而抓住机遇的关键,是自我意识的觉醒,是敢于成为科技进步历史洪流中的博浪者的决心。

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

编译原理是一门经过长期实践的,有着悠久历史的计算机经典课程。作为一名工程师,在实际工作中你经常会碰到需要编译技术的场景,比如:

  • 编写界面模板引擎;
  • 为项目编写各种各样的DSL;
  • 深度理解甚至编写Spring、Hibernate、阿里巴巴Druid这样的工具。

那如何才能真正掌握编译原理呢?是搜集市面上的教材,埋头苦读吗?要知道,教材往往过于抽象和理论化,如果你没有系统化的学习体系,做不到学以致用,掌握再多的理论知识,也不会形成章法,事倍功半。因此,学习编译原理最关键在于掌握其关键知识点以及核心思维方法,即学即用。

宫文学,北京物演科技CEO,连续创业者,2016年入选厦门市第九批“双百计划”领军型创业人才。他是国内最早做BPM(流程管理平台)和BI平台(大数据平台)的创业者之一,之后也做过电子表单和快速开发平台,这些经历都与编译技术密不可分。

在他看来,优秀的工程师要保持长期的竞争力,需要提升自身的专业素养。而了解与学习基础技术理论并加以实践是一种行之有效的方式。

在这个课程里,他从前端与后端两个层面来讲解编译原理的核心技术点,用具体的案例带你理解抽象的原理,帮助你建立信心,克服畏难情绪,让你在这个过程中一步步趟过雷区,在工作中真正用到编译技术。

你能通过这门课,实现写出一个编译器的愿望,还能通过SQL解析器、报表工具、字节码生成等小练习锻炼自己的动手能力。当然了,你还可以解锁更多应用编译原理的业务场景,将知识活学活用。相信只要沉下心去学习研究,掌握编译技术指日可待!

课程模块

课程共38讲,分为三个部分。

第一部分:实现一门脚本语言

通过具体实例,带你了解词法分析、语法分析、语义分析的原理,实现一门脚本语言,并用工具提升效率。

第二部分:实现一门编译型语言

带你了解如何生成目标代码和对代码进行优化,并引入LLVM工具,最后生成可执行的文件能支持即时编译,并经过了多层优化。

第三部分:面向未来的编程语言

人工智能与编译技术结合是否会出现人工智能编程?这部分是对编译技术发展趋势的一些分析,这些分析会帮助你更好地把握未来技术发展的脉搏。

限时福利