编译原理实战课
带你吃透编译技术核心概念与算法
宫文学  北京原点代码 CEO
飙升榜 第6名
专栏
已完结·共 55 讲
|
2.6w 人已学
|
收藏
lion_fly
老师,我在debugJava编译器的代码: 在源码的注释里面出现了这样的内容 Qualident = Ident { DOT [Annotations] Ident } Java编译器的这种文法是什么文法,感觉不是上下文无关文法
作者回复:这个是上下文无关的文法。 大家可能会使用不同的写法。比如,有的人用产生式的写法,有的人用EBNF的写法,关键看本质。不同的写法本质上是同构的。
2021-01-21
sunbird
技术牛的人很多,但能讲这么透彻的不多,以前好多想不通的问题,瞬间都想明白了,多谢。 对于协程用于高并发这一点还是有点不清楚。nio可以提高并发是因为其利用了设备中断和DMA的方式,从硬件优化了IO的效率。但协程还是靠线程来执行操作,它虽然占用的内存比较少,但个人感觉原理有点类似java中的线程池的概念,而线程池显然占用的内存更少,其和nio的结合对于并发来说岂不更好。 我感觉协程重点在于“协”这个字,和线程池比,他的不同协程之间的协作性好。不知道理解的对不对。 最近在学kotlin的协程,一直学不明白,看了这篇文章,才是真正懂了,再次感谢。
2020-11-13
kkxue
深度和广度兼具,赞!
作者回复:感谢肯定:-)
2020-10-03
易昊
以上是我的学习心得,干货不多,让各位见笑了。这门课内容确实复杂,但我相信它是我的兴趣所在,还是会坚持学习下去的。给自己加油,也给各位加油。
作者回复:易昊的分享让我很感动。借着易昊这篇文章,我也分享一点看法。 我觉得中国可以有更多的软件工程师,把像编译原理这样的基础知识吃透,那我们的软件行业的整体水平会提升一大截。 我前一阵在北京跟某公司老总探讨一个优秀的行业应用软件。那个软件是上世纪90年代就被开发出来,也被我国广泛采用。它一方面是个应用软件,另一方面其本身也是一个开发平台,所以可以经过定制,满足不同行业的需求。 任何优秀的软件,必须同时是一个开发平台。这是《黑客与画家》的作者表达的思维。他原来的意思是,每个软件写到最后,都会包含一个Lisp的变种。实际要表达的意思跟我说的一样。 但是,我们国内的软件行业的情况是,在去客户那里实施的时候,几乎总是要修改源代码,否则就不能满足用户的个性化需求。 很多软件公司想去克隆一下我刚才说的那套软件,结果都放弃了。除了对领域模型理解的困难以外,缺少把一个应用软件做成软件开发平台的能力,是其中很大的一个障碍。 目前在很多领域都是这样。国外的软件就是摆在那里。中国的工程师就是做不出自己的来。 有多难么?如果你经历了学习编译原理的过程,你会像易昊不再惧怕计算First和Follow集合那样,不会对实现这样的软件心存恐惧。心里不怕了,才有可能行动起来。 学编译原理学到了什么?学到了计算机的一些基础原理,一些数据结构和算法。前端有几个算法,优化方面有不少算法,后端也有几个算法。你会发现,任何软件,只要里面有几个扎扎实实的算法,别人就很难模仿和逾越。很多软件工程师,写了很多年的软件,其实连一个算法也没有用过。这种软件当然不会有什么竞争力。总是做这样的工作,水平也提不上去。 做一个软件工程师很容易,但要成为一个优秀的软件工程师,须要“心”先过关。 做一款软件也很容易,但要做那种优秀的软件,其设计者也必有一颗不凡之心! 跟易昊及各位同学共勉!
2020-08-12
Matrix
计算机语言的编译和自然语言的翻译,从编译器的角度来看,二者在“前端”上是相同的,在“中端”和“后端”上是不同的。自然语言的翻译也需要经过词法分析:获取每个单词;语法分析:分析句子的语法结构;语义分析:通过单词的含义结合句型来获取句子的含义。机器语言的编译为了生成质量更高的目标代码,“中端”会对“前端”的输出进行一系列的优化。而自然语言的翻译会直接利用“前端”的输出,将源语言翻译为目标语言。
作者回复:感谢你的分享。 我有时会把“优化”看做是“意译”的过程,也就是说,用目标语言可以更简单地表达相同的意思。从这个角度看,其实自然语言的翻译,也有类似编译器后端的工作。
2020-06-01
鱼_XueTr
自然语言与编程语言翻译基本都是经过相同的步骤流程:词法分词,语法分析,语义分析,token翻译,重组,优化结构,到最后的结果。 但是编程语言与自然语言相比: 1. 词汇量:编程语言的关键字等标识有限,自然语言的词汇量巨量无限 2. 结构化:编程语言是结构化的,自然语言是非结构化 3. 歧义性:编程语言都有确定的语义表达,自然语言不同语境不同的意思 4. 容错性:程序必须保证拼写绝对正确,自然语言更随意,也容许有错误表达 5. 易变性:编程语言的变化缓慢又小,自然语言的变化随着社会发展 6. 简略性:编程语言要求准确细致满足所有运行条件,自然语言简略干练形式不限
作者回复:你总结得太好了!手动点赞!
2020-06-01
吃鱼
老师,因为专业要学习二进制安全,所以特别想通过您的课程了解编译方面的知识,我编译原理之前学的不太扎实,您的两个课程我觉得都很硬核,应该先学哪一门比较好呢?
作者回复:两门课都是围绕编译原理,但讲述方式和侧重点不同。 《编译原理之美》是通过手工实现一款编译器的方式,带你了解这个过程中的知识点,循序渐进地讲解,最后才去介绍难度比较高的那几个算法。对编译器前端工具ANTLR的使用也比较多。如果你想学会如何快速实现一个编译器,可以先从这门课入手。 《编译原理实践课》总体的目标,是带你“行万里路”,扩大你的视野和见识。它讲述的方式是先做一些基础知识的概述(概述部分也会注意扩展你的知识面)、然后是研究多个编译器的实现,最后是总结这些编译器的实现,并探讨现代语言的设计。如果你比较想了解真实世界的编译器的情况,可以先从这门课入手。 你的专业是二进制安全,涉及后端的内容会更多,所以我觉得了解真实世界的编译器的情况会有很大的帮助。 因为编译原理的知识点比较多,所以用不同的课程体现不同的侧面。在我的出书计划中,也发现其实仅用一卷书是不能说完的。比如,有的作者用“编译器DIY”的方式就可以写一本书,但对原理和算法体现得就不够;写算法比较深入的书呢,又没有体现当前真实编译器中所采用的技术。
2020-06-01
thomas1994
赞,希望多点图,有图就直观多了
作者回复:收到。在解析具体编译器时,我画了好多图。我争取多用图来表达!
2020-06-01
Matrix
目前是在校研究生,研究方向是二进制的漏洞挖掘与利用。平常在论文、工程实现中多多少少和编译原理相关的知识有交集,如:SSA、AST、LLVM-IR等,相关的理论知识书本上学过,但没有形成较为清晰的知识体系,很多地方有一种雾里看花的感觉,希望能结合实际对编译器的内部结构和原理有更清晰的理解。
作者回复:你这个专业,肯定要多了解真实语言的实现。二进制漏洞问题本来就是实现编译器时要考虑的一个因素。比如,在使用内存的时候,要让返回的内存地址没有明显的规律,避免出现漏洞。
2020-06-01
王成
老师好 学习编译的难点:编译原理之美还没有学完,正在努力学习,由于工作学习等多方面原因,学习进度较慢 打算应用编译原理实现的东西:目前工作是实时计算,公司目前关于实时流使用了storm和flink,我想开发一套程序,使得一次开发,可以同时在两个平台运行,同时,可以做到将一个平台的代码迅速转为另一个平台可以运行的代码
作者回复:谢谢你分享自己的使用场景。非常好。我对你的名字有印象:-) 如果有可能,你也可以把自己的设计思路描述一下,我们可以多做一些探讨! 有具体需求推动,学习会更有动力。
2020-06-01
讲师

宫文学

北京原点代码 CEO

宫文学,《编译原理之美》课程作者,北京原点代码 CEO。他是国内最早做 BPM(流程管理平台)和 BI 平台(大数据平台)的创业者之一,之后也做过电子表单和快速开发平台,这些经历都与编译技术密不可分。他非常熟悉各种语言编译器的实现机制,专注于编译技术领域,并且正在设计一门新语言,...查看更多
编辑推荐
讲师的其他课程
编译原理之美
宫文学
北京原点代码 CEO

45讲 | 46206 人已学习

¥59¥129
手把手带你写一门编程语言
宫文学
北京原点代码 CEO

49讲 | 7537 人已学习

¥59¥129
包含这门课的学习路径

计算机基础知识

12门课程 96.5w人学习
看过的人还看了
数据结构与算法之美
王争
前 Google 工程师

81讲 | 283781 人已学习

¥68¥199
左耳听风
陈皓
网名“左耳朵耗子”,资深技术专家

119讲 | 180982 人已学习

¥98¥399
MySQL 实战 45 讲
林晓斌
网名丁奇,前腾讯云数据库负责人

49讲 | 224915 人已学习

¥68¥199
设计模式之美
王争
前 Google 工程师,《数据结构与算法之美》专栏作者

113讲 | 123446 人已学习

¥98¥299
趣谈网络协议
刘超
前网易研究院云计算技术部首席架构师

51讲 | 130439 人已学习

¥68¥199
深入浅出计算机组成原理
徐文浩
bothub 创始人

62讲 | 70440 人已学习

¥68¥199