开篇词 | 在真实世界的编译器中游历

你好,我是宫文学,一名技术创业者,现在是北京物演科技的CEO,很高兴在这里跟你见面。

我在IT领域里已经工作有20多年了。这其中,我个人比较感兴趣的,也是倾注时间精力最多的,是做基础平台类的软件,比如国内最早一批的BPM平台、BI平台,以及低代码/无代码开发平台(那时还没有这个名字)等。这些软件之所以会被称为平台,很重要的原因就是拥有很强的定制能力,比如流程定制、界面定制、业务逻辑定制,等等。而这些定制能力,依托的就是编译技术。

在前几年,我参与了一些与微服务有关的项目。我发现,前些年大家普遍关注那些技术问题,比如有状态的服务(Stateful Service)的横向扩展问题,在云原生、Serverless、FaaS等新技术满天飞的时代,不但没能被很好地解决,反而更恶化了。究其原因就是,状态管理还是被简单地交给数据库,而云计算的场景使得数据库的压力更大了,数据库原来在性能和扩展能力上的短板,就更加显著了。

而比较好的解决思路之一,就是大胆采用新的计算范式,发明新的计算机语言,所以我也有意想自己动手搞一下。

我从去年开始做设计,已经鼓捣了一阵了,采用了一些很前卫的理念,比如云原生的并发调度、基于Actor的数据管理等。总的目标,是要让开发云原生的、有状态的应用,像开发一个简单的单机应用一样容易。那我们就最好能把云架构和状态管理的细节给抽象掉,从而极大地降低成本、减少错误。而为编程提供更高的抽象层次,从来就是编译技术的职责。

Serverless和FaaS已经把无状态服务的架构细节透明掉了。但针对有状态的服务,目前还没有答案。对我而言,这是个有趣的课题。
在我比较熟悉的企业应用领域,ERP的鼻祖SAP、SaaS的鼻祖SalesForce,都用自己的语言开发应用,很可惜国内的企业软件厂商还没有做到这一点。而在云计算时代,设计这样一门语言绕不过去的一个问题,就是解决有状态服务的云化问题。我希望能为解决这个问题提供一个新工具。当然,这个工具必须是开源的。

正是因为给自己挖了这么大一个坑,也促使我更关心编译技术的各种前沿动态,也非常想把这些前沿的动态、理念,以及自己的一些实战经验都分享出来。

所以去年呢,我在极客时间上开了一门课程《编译原理之美》,帮你系统梳理了编译技术最核心的概念、理论和算法。不过在做第一季的过程中呢,我发现很多同学都跟我反馈:我确实理解了编译技术的相关原理、概念、算法等,但是有没有更直接的方式,能让我更加深入地把知识与实践相结合呢?

为什么要解析真实编译器?

说到把编译技术的知识与实践相结合,无外乎就是解决以下问题:

  • 我已经知道,语法分析有自顶向下的方法和自底向上的方法,但要自己动手实现的话,到底该选择哪个方法呢?是应该自己手写,还是用工具生成呢?
  • 我已经知道,在语义分析的过程中要做引用消解、类型检查,并且会用到符号表。那具体到自己熟悉的语言,这些工作是如何完成的呢?有什么难点和实现技巧呢?符号表又被设计成什么样子呢?
  • 我已经知道,编译器中会使用IR,但实际使用中的IR到底是什么样子的呢?使用什么数据结构呢?完成不同的处理任务,是否需要不同的IR呢?
  • 我已经知道,编译器要做很多优化工作,但针对自己熟悉的语言,这些优化是如何发生的?哪些优化最重要?又要如何写出便于编译器优化的代码呢?

类似的问题还有很多,但总结起来其实就是:真实世界的编译器,到底是怎么写出来的?

那弄明白了这个问题,到底对我们有什么帮助呢?

第一,研究这些语言的编译机制,能直接提高我们的技术水平。

一方面,深入了解自己使用的语言的编译器,会有助于你吃透这门语言的核心特性,更好地运用它,从而让自己向着专家级别的工程师进军。举个例子,国内某互联网公司的员工,就曾经向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的编译器。

我选择剖析这些语言的编译器,有三方面的原因:

  • 第一,它们足够有代表性,是你在平时很可能会用到的。这些语言中,除了Julia比较小众外,都比较流行。而且,虽然Julia没那么有名,但它使用的LLVM工具很重要。因为LLVM为Swift、Rust、C++、C等多种语言提供了优化和后端的支持,所以Julia也不缺乏代表性。
  • 第二,它们采用了各种不同的编译技术。这些编译器,有的是编译静态类型的语言,有的是动态类型的语言;有的是即时编译(JIT),有的是提前编译(AOT);有高级语言,也有DSL(SQL);解释执行的话,有的是用栈机(Stack Machine),有的是用寄存器机,等等。不同的语言特性,就导致了编译器采用的技术会存在各种差异,从而更加有利于你开阔视野。
  • 第三,通过研究多种编译器,你可以多次迭代对编译器的认知过程,并通过分析对比,发现这些编译器之间的异同点,探究其中的原因,激发出更多的思考,从而得到更全面的、更深入的认知。

看到这里,你可能会有所疑虑:有些语言我没用过,不怎么了解,怎么办?其实没关系。因为现代的高级语言,其实相似度很高。

一方面,对于不熟悉的语言,虽然你不能熟练地用它们来做项目,但是写一些基本的、试验性的程序,研究它的实现机制,是没有什么问题的。

另一方面,学习编译原理的人会练就一项基本功,那就是更容易掌握一门语言的本质。特别是我这一季的课程,就是要帮你成为钻到了铁扇公主肚子里的孙悟空。研究某一种语言的编译器,当然有助于你通过“捷径”去深入地理解它。

我是如何规划课程模块的?

这门课程的目标,是要让你对现代语言的编译器的结构、所采用的算法以及设计上的权衡,都获得比较真切的认识。其最终结果是,如果要你使用编译技术来完成一个项目,你会心里非常有数,知道应该在什么地方使用什么技术。因为你不仅懂得原理,更有很多实际编译器的设计和实现的思路作为你的决策依据。

为了达到本课程的目标,我仔细规划了课程的内容,将其划分为预备知识篇、真实编译器解析篇和现代语言设计篇三部分。

预备知识篇,我会简明扼要地帮你重温一下编译原理的知识体系,让你对这些关键概念的理解变得更清晰。磨刀不误砍柴工,你学完预备知识篇后,再去看各种语言编译器的源代码和相关文档时,至少不会被各种名词、术语搞晕,也能更好地建立具体实现跟原理之间的关联,能互相印证它们。

真实编译器解析篇,我会带你研究语言编译器的源代码,跟踪它们的运行过程,分析编译过程的每一步是如何实现的,并对有特点的编译技术点加以分析和点评。这样,我们在研究了Java、Java JIT、Python、JavaScript、Julia、Go、MySQL这7个编译器以后,就相当于把编译原理印证了7遍。

现代语言设计篇,我会带你分析和总结前面已经研究过的编译器,进一步提升你对相关编译技术的认知高度。学完这一模块以后,你对于如何设计编译器的前端、中端、后端、运行时,都会有比较全面的了解,知道如何在不同的技术路线之间做取舍。

好了,以上就是这一季课程的模块划分思路了。你会发现,这次的课程设计,除了以研究真实编译器为主要手段外,会更加致力于扩大你的知识版图、增加你的见识,达到“行万里路”的目的。

可以说,我在设计和组织这一季课程时,花了大量的时间准备。因此这一季课程的内容,不说是独一无二的,也差不多了。你在市面上很少能找到解析实际编译器的书籍和资料,这里面的很多内容,都是在我自己阅读源代码、跟踪源代码执行过程的基础上梳理出来的。

写在最后

近些年,编译技术在全球范围内的进步速度很快。比如,你在学习Graal编译器的时候,你可以先去看看,市面上有多少篇围绕它的高质量论文。所以呢,作为老师,我觉得我有责任引导你去看到、理解并抓住这些技术前沿。

我也有一个感觉,在未来10年左右,中国在编译技术领域,也会逐步有拿得出手的作品出来,甚至会有我们独特的创新之处,就像我们当前在互联网、5G等领域中做到的一样。

虽然这个课程不可能涵盖编译技术领域所有的创新点,但我相信,你在其中投入的时间和精力是值得的。你通过我课程中教给你的方法,可以对你所使用的语言产生更加深入的认知,对编译器的内部结构和原理有清晰理解。最重要的是,对于如何采用编译技术来解决实际问题,你也会有能力做出正确的决策。

这样,这个课程就能起到抛砖引玉的作用,让我们能够成为大胆探索、勇于创新的群体的一份子。未来中国在编译技术的进步,就很可能有来自我们的贡献。我们一起加油!

最后,我还想正式认识一下你。你可以在留言区里做个自我介绍,和我聊聊,你目前学习编译原理的最大难点在哪?或者,你也可以聊聊你对编译原理都有哪些独特的思考和体验,欢迎在留言区和我交流讨论。

好了,让我们正式开始编译之旅吧!

精选留言

  • Jacob.C

    2020-06-02 17:18:08

    上了去年宫老师的课后,我做了一个sql解析器,解决了我司数据仓库字段级血缘分析的难题
    作者回复

    恭喜你的成绩!
    你说的血缘分析,是Lineage Analysis吗?我以前搞元数据的时候接触过,看上去很亲切:-)

    2020-06-08 21:43:56

  • gk

    2021-04-08 19:57:01

    hello,我叫gk,也是之前看过原理之美过来的,老师讲解的很有方法,真的是深入浅出,人常言大师并不一定是好老师,而一个好老师一定是一个大师,所以就惯性买了实战课,其实对这个课程的现实期望比较少,单纯是想再听听老师讲课。老师深入浅出地谈到了一些算法,我想这块应该是对大多数人最难的,所以我的问题是,数学在计算机编译方法是不是灵魂级别的,如果是,可否带领我们见识一下数学在编译方面的角色。
    作者回复

    你问的问题很好,我都有点想针对这个问题展开,写一篇加餐了:)

    计算机科学中所用到的数学知识,基本上都体现在离散数学中了。当然,每本离散数学课本的内容不一样,有的多一些,有的少一些。

    离散数学其实涉及了好几个数学分支。但这些内容由于不是我们从中学开始学习的那些“经典”的数学内容,所以会显得有点另类。不过,离散数学确实是实实在在的数学,是解决现实问题所需要的数学工具,很多内容还很值得琢磨,在我看来是一些很“高级”的话题。

    不过,我们有时会对这些知识的应用场景不清楚,从而学起来有点抽象。而编译原理就为这些数学知识提供了很多的运用场景,我来给你梳理一下:

    1.自动机理论
    自动机理论是计算机科学的根基。这部分内容很有意思,因为它可能会触发你对一些“终极”问题的理解。首先,是对“什么是计算”的理解。我们成天都用Computer,但计算(compute)的实质到底是什么呢?小学和初中时,我们做算术题,那是计算,这个你能理解;而现在的计算机程序,也声称是在做计算,这就有点难以理解了。你明明只是在用Word做字处理,或者只是在浏览网页呀?为什么说程序在做计算?这个问题再挖下去,你会了解为什么CPU一定会发热,哪怕未来用的工艺再好也没用。会涉及到信息的熵和热力学熵的关系。很有趣。

    第二个问题是可计算性问题。图灵设计出图灵机来以后,加上哥德尔,一下子解决了希尔伯特提出来的好几个数学问题。从这里,你能看到数学和计算机科学的关联。计算机一开始就是用来解决数学问题的,比如命题的可证明性问题。

    在编译原理中,我们发现词法分析和语法分析过程,等价于某些简化的图灵机的运算过程。比如词法分析,就等价于某个NFA或DFA,所以只要构造出这么一台自动机就行了。

    2.形式语言
    接着说形式语言。这块也跟数学有很大的关系。因为数学就是一个形式系统。命题用形式系统来做表达,而推理和证明的过程,就是根据一定的规则来对这些形式进行变换的过程。定理的自动证明,一直是计算机科学的一个分枝。还有一个分枝,是自动证明你的程序是否正确。这两个都是用符号、形式做计算。在Matalab和Mathematics里,都有把用符号表达的公式进行推演、化简的能力,很有趣。用这个功能,就可以把你很多中学数学作业给干掉,你想想多好玩。

    正则文法、上下文无关文法等,都是形式语言中的文法规则。

    学会对符号进行处理,实际上是一种很强的计算机思维。有些计算机语言,如Lisp,擅长做符号处理。这也是Lisp家族的语言特别擅长做元编程的根本原因。因为你的程序就是一堆符号,一些形式。而Lisp语言又可以很方便地处理这些符号和形式。再进一步,对符号、形式的处理能力,也是学习编译原理对你的最重要的赋能之一。当你用正则表达式工具处理一个字符串的时候,你其实就能感觉到这种强大。

    3.格理论(Lattice)
    在优化算法中,有一个知识点是数据流分析框架。这里会涉及到格理论,而格理论又涉及偏序集、上界、下界等概念。不过不用怕,好消息是,其实你不懂这些数学理论,从直观上也能学会数据流分析框架。

    不过格理论确实比较有用,除了数据流分析外,在很多其他地方也会用得到。比如,现代语言的类型系统都比较复杂,而对类型进行运算,也会用到格理论。如果你阅读Julia编译器的代码,在类型处理有关的代码里就可以看到格的痕迹。

    4.图论
    在中端处理中(主要是基于IR做各种优化),我们经常会用到图这种数据结构,例如CFG等。所以,与图有关的理论就可以发挥作用了。

    5.计算复杂性理论
    也就是大O有关的理论,要知道什么是NP完全、NP难等概念。在编译中的很多算法是NP级的(比如寄存器分配、指令重排序等),所以寻找合适的启发式算法就很重要,可以降低计算量。

    6.一些运筹学知识
    在有些算法中,我们会用到动态规划这样的知识。还有的同学问过,寄存器分配是否可以用约束求解的方法来实现。这都是运筹学封面的知识点。

    7.Lambda演算等
    为了更好的理解函数式编程等概念,你还可能需要用到Lambda演算的一些知识。可以看邱齐(也就是图灵的老师)的一些成果。
    再进一步延伸,你可能还要看《范畴论》这样的东西。不过这都是想在这个领域深钻的人的要求,可以写博士论文的那种。硕士论文都不需要钻这么深。

    好了,总结起来,编译原理中用到的数学,基本上不是传统意义上的数学,但这些数学也很厉害、很有意思。对离散问题的处理,有时候更复杂。就像运筹学里面,整数规划比线性规划要更难。写到这里,我真的可能扩展一下,写一篇加餐了。你注意课程更新信息:)

    2021-04-30 16:50:25

  • 吃鱼

    2020-06-01 21:14:07

    老师,因为专业要学习二进制安全,所以特别想通过您的课程了解编译方面的知识,我编译原理之前学的不太扎实,您的两个课程我觉得都很硬核,应该先学哪一门比较好呢?
    作者回复

    两门课都是围绕编译原理,但讲述方式和侧重点不同。

    《编译原理之美》是通过手工实现一款编译器的方式,带你了解这个过程中的知识点,循序渐进地讲解,最后才去介绍难度比较高的那几个算法。对编译器前端工具ANTLR的使用也比较多。如果你想学会如何快速实现一个编译器,可以先从这门课入手。

    《编译原理实践课》总体的目标,是带你“行万里路”,扩大你的视野和见识。它讲述的方式是先做一些基础知识的概述(概述部分也会注意扩展你的知识面)、然后是研究多个编译器的实现,最后是总结这些编译器的实现,并探讨现代语言的设计。如果你比较想了解真实世界的编译器的情况,可以先从这门课入手。

    你的专业是二进制安全,涉及后端的内容会更多,所以我觉得了解真实世界的编译器的情况会有很大的帮助。

    因为编译原理的知识点比较多,所以用不同的课程体现不同的侧面。在我的出书计划中,也发现其实仅用一卷书是不能说完的。比如,有的作者用“编译器DIY”的方式就可以写一本书,但对原理和算法体现得就不够;写算法比较深入的书呢,又没有体现当前真实编译器中所采用的技术。

    2020-06-02 12:12:05

  • Matrix

    2020-06-01 18:55:20

    目前是在校研究生,研究方向是二进制的漏洞挖掘与利用。平常在论文、工程实现中多多少少和编译原理相关的知识有交集,如:SSA、AST、LLVM-IR等,相关的理论知识书本上学过,但没有形成较为清晰的知识体系,很多地方有一种雾里看花的感觉,希望能结合实际对编译器的内部结构和原理有更清晰的理解。
    作者回复

    你这个专业,肯定要多了解真实语言的实现。二进制漏洞问题本来就是实现编译器时要考虑的一个因素。比如,在使用内存的时候,要让返回的内存地址没有明显的规律,避免出现漏洞。

    2020-06-02 12:17:04

  • sugar

    2020-06-01 17:10:35

    终于见到宫老师的第二季啦~ 我来抢个首赞👍 哈哈
    作者回复

    又见到sugar!

    2020-06-02 12:33:05

  • 王成

    2020-06-01 18:24:46

    老师好
    学习编译的难点:编译原理之美还没有学完,正在努力学习,由于工作学习等多方面原因,学习进度较慢
    打算应用编译原理实现的东西:目前工作是实时计算,公司目前关于实时流使用了storm和flink,我想开发一套程序,使得一次开发,可以同时在两个平台运行,同时,可以做到将一个平台的代码迅速转为另一个平台可以运行的代码
    作者回复

    谢谢你分享自己的使用场景。非常好。我对你的名字有印象:-)
    如果有可能,你也可以把自己的设计思路描述一下,我们可以多做一些探讨!
    有具体需求推动,学习会更有动力。

    2020-06-02 12:20:29

  • 冰溢

    2020-06-10 14:46:11

    我学习这门课,需不需要先学习《编译原理之美》
    作者回复

    不需要。这两们课是并行关系,可以互相补充。

    2020-06-12 15:04:32

  • Geek_c34bd6

    2020-06-06 12:23:05

    我是物联网工程师,这个行业现在主流用的是c语言(由于内存限制以及兼容性等问题,连C++都不太有人用)。但是c的缺点太明显了,开发效率低,需要自己管理内存。所以我想写一门编程语言。这门编程语言有高级语言的一些特性,但是编译出来的代码是c代码。这样只要能用c语言点环境就能用这门语言。以牺牲编译时间为代码换取开发效率和兼容性。所以最近沉迷于编译原理
    作者回复

    以前,像Lisp等好几种语言都是编译成c语言,再用c语言的编译器来编译成目标代码。
    现在网上也有一些开源的编译器(名字不太记得了),能编译成c代码,你可以搜索一下,作为参考。

    2020-06-08 20:45:09

  • 静心

    2020-09-04 13:19:03

    祖国的编译技术有望!加油!
    作者回复

    我个人认为,中国的软件工程师们是适合做编译技术的。主要原因是,编译技术总体的变化所读没有那么快,所以我们消化存量技术还是没啥问题的。在足够多的工程师能够掌握存量的技术之后,自然就会在某些前沿做出自己的突破。
    如果技术没有问题,那就是需要生态的支持了。不管是有意还是无意(比如美国的技术封锁),中国都开始形成自己的IT技术生态,编译器自然是其中不可缺少的一环。

    2020-09-06 08:15:21

  • Geek_d0aef1

    2020-06-05 08:46:52

    宫老师,你好

    我是从编译原理之美过来的,老师的课很有深度,很喜欢
    我自己是用Qt写工具的,是抱着学习的心态来的
    作者回复

    用QT写工具,不错。
    既然叫做工具,肯定要具备各种自定义能力,使工具具有普适性。这个地方可能就要用到编译技术。

    2020-06-08 21:05:56

  • Geek_60d2f1

    2020-06-19 20:38:53

    老师您好,从您的编译原理那门课跟过来的,作为非科班的一员,终于啃下了编译这个大块头。我目前的工作中涉及到Flinlk平台开发的SQL解析开发的工作,虽然在课表上看到了老师有安排相关的课程,老师能否推荐一些相关的资料呢?谢谢老师
    作者回复

    很高兴在新课程里相遇!
    要在系统里支持SQL,有几块工作要去做。

    第一,就是你说的SQL解析了。
    这项工作用工具生成parser或者手写Parser都可以。MySQL是用Bison生成Parser的,MySQL Workbench使用Antlr生成Parser。阿里的一个开源中间件OpenCat则使用了完全手写的Parser,叫Druid。这几项工作你都可以参考。用工具实现起来会比较快,手写的话,有可能引入一些手段,导致SQL解析更快。此外,Flink的SQL解析似乎是基于Apache的另一个项目calsite? 这些都是开源项目,都可以拿来研究它们的实现机制。

    第二项任务,是语义分析。
    要基于AST生成更容易做SQL查询的数据结构,要能把一个复杂的查询语句做切割。
    对于语法正确、语义不正确的情况,要能识别出来。
    表名、字段名要做检查。
    同样存在基于作用域的引用消解问题,特别是存在子查询的情况下。

    第三项任务,是对SQL做优化。
    SQL的优化有一部分跟高级语言差不多,会有常数折叠、死代码消除等,另一部分要做执行计划的优化。

    本课程在MySQL那部分有上述内容的具体介绍。你可以根据我的提示,提前查阅一下相关资料。

    2020-06-20 10:08:24

  • 寻回光明

    2020-06-04 09:09:38

    老师你好,我是一名科班的本科生,但是编译原理这块始终不懂如何学习,希望跟老师进入这个全新的世界。
    作者回复

    嗯,知识就在那里,没有拿不下的道理,只要盯住它不放!

    2020-06-08 21:21:29

  • 林铭铭

    2020-07-13 20:03:12

    两季都买了,准备认真学习!
    作者回复

    Great!

    2020-07-17 12:34:00

  • 樱满集

    2020-06-18 19:57:55

    大学时候没有好好学这门课,现在觉得这是很重要的基础来补票了,希望可以学好这门课
    作者回复

    欢迎!

    2020-06-19 15:57:14

  • 至今未来

    2020-06-01 23:51:15

    编译原理之美 只看了一遍 差不多忘光了 宫老师 我又来了(「・ω・)「嘿
    作者回复

    欢迎!学新而忆故,温故而知新,迭代提升认知!

    2020-06-02 11:33:29

  • JoKERsunLay

    2020-06-01 23:16:58

    老师您好! 刚刚啃完Stanford的Compiler课 跟着写了lexer到cgen四个部分还是挺有意思的 很多知识也和老师的编译原理之美能相互印证

    想过来第二季实战一下😛

    另外请问老师会考虑加餐ML compiler的内容吗?
    作者回复

    看得出你很好学,手工点赞!

    你是指ML语言,还是Machine Learning?
    ML在美国经常作为教学语言。我估计,其中一个原因,就是它简单,另外便于探讨函数式编程特征。

    这一季课程,出于受众面的考虑,选择的编译器都是针对比较流行的语言的。ML的话,可以作为兴趣小组小范围讨论的话题。

    不过,我选了一个Julia,也是函数式编程语言,我觉得很有意思,你可以关注一下。

    2020-06-02 16:05:09

  • 大罗马帝国

    2020-06-01 18:15:58

    关注前端AST希望落地前端定制化
    作者回复

    感谢分享!你这个需求很重要。一个好的软件,一定要能实现定制化、平台化。

    另外,当前在流行的NoCode、LowCode开发,跟这个也很有关。
    我十年前就做过NoCode的开发平台,当时还没有这个词汇。在云计算条件时代,很多应用的开发成本很高,所以这个方向值得关注。

    2020-06-02 12:23:19

  • Fan

    2020-06-01 18:01:49

    期待宫老师多讲讲llvm方面相关的。
    作者回复

    我在部落里就看到你这个需求啦!

    我已经在Julia那部分,放了一些LLVM的内容。

    另外,昨天直播的时候,有同学提出是否将一下C++的编译器。C++是LLVM的一个前端。所以可以考虑结合这个需求,再做点加餐。

    2020-06-02 12:26:25

  • X!!

    2020-06-01 17:08:06

    第一
    作者回复

    欢迎:-)

    2020-06-02 12:33:28

  • Leesin

    2023-07-25 18:27:05

    开始打卡