编译原理之美
宫文学
北京原点代码 CEO
46197 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 45 讲
开篇词 (1讲)
编译原理 · 期中考试周 (1讲)
编译原理之美
15
15
1.0x
00:00/00:00
登录|注册

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

总结
代码分析和优化
生成代码
程序的运行机制
编译器的后端技术

该思维导图由 AI 生成,仅供参考

前 18 节课,我们主要探讨了编译器的前端技术,它的重点,是让编译器能够读懂程序。无结构的代码文本,经过前端的处理以后,就变成了 Token、AST 和语义属性、符号表等结构化的信息。基于这些信息,我们可以实现简单的脚本解释器,这也从另一个角度证明了我们的前端处理工作确实理解了程序代码,否则程序不可能正确执行嘛。
实际上,学完前端技术以后,我们已经能做很多事情了,比如让软件有自定义功能,就像我们在15 讲中提到的报表系统,这时,不需要涉及编译器后端技术。
但很多情况下,我们需要继续把程序编译成机器能读懂的代码,并高效运行。这时,我们就面临了三个问题:
1. 我们必须了解计算机运行一个程序的原理(也就是运行期机制),只有这样,才知道如何生成这样的程序。
2. 要能利用前端生成的 AST 和属性信息,将其正确翻译成目标代码。
3. 需要对程序做尽可能多的优化,比如让程序执行效率更高,占空间更少等等。
弄清这三个问题,是顺利完成编译器后端工作的关键,本节课,我会让你对程序运行机制、生成代码和优化代码有个直观的了解,然后再在接下来的课程中,将这些问题逐一击破。

弄清程序的运行机制

总的来说,编译器后端要解决的问题是:现在给你一台计算机,你怎么生成一个可以运行的程序,然后还能让这个程序在计算机上正确和高效地运行?
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

编译器后端技术是关于如何将程序编译成机器能够理解和高效运行的代码。这需要解决三个问题:理解计算机运行程序的原理、将前端生成的AST和属性信息正确翻译成目标代码、对程序进行优化。首先,需要了解程序的运行机制,包括内存空间划分、程序启动和执行过程等。然后,生成目标代码,可以是汇编代码或者Java虚拟机的字节码,需要了解不同硬件平台的特点。为了降低后端工作量,提高软件复用度,引入中间代码(IR)的机制,可以独立于具体硬件,各个语言的前端可以先翻译成IR,然后再从IR翻译成不同硬件架构的汇编代码。最后,对代码进行优化,提高程序执行效率和占用空间。优化工作又分为“独立于机器的优化”和“依赖于机器的优化”两种。独立于机器的优化是基于IR进行的,可以通过对代码的分析,用更加高效的代码代替原来的代码。依赖于机器的优化则是依赖于硬件的特征。现代的计算机硬件设计了很多特性,以便提供更高的处理能力,编译器要能够充分利用硬件提供的性能。总的来说,编译器后端技术需要对代码进行的优化非常多,是编译过程中耗时最长、最体现某个编译器的功力的一类工作。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《编译原理之美》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(14)

  • 最新
  • 精选
  • 阿鼎
    老师,后段技术在实际的项目中,有什么应用?

    作者回复: 我认为有三方面: 1.如果要写一门真实使用的计算机语言,或者参与类似数据库软件之类的基础软件的开发,还是要把代码编译成字节码或机器码的,所以就需要后端技术。 2.有助于你做系统的深层优化和性能调优。淘宝的底层技术团队就曾关注Java即时编译功能,甚至还给Oracle提交了补丁。 3.从知识方面,会帮你更加理解软件运行的机制,从而对于你设计任何软件、以及设计大型系统的架构都有好处。

    2019-10-09
    16
  • nil
    把前端的ast转化成中间形式确是个漂亮的做法,可以隔离前后端之间的耦合。后端可以面向ir实现。针对不同的硬件平台,实现不同的后端编译程序。这让我想到网络协议中的ip协议。ip协议被设计成沙漏,或者说细腰结构,就是为了减少上下游之间的耦合,应用层和数据链路层中的协议多种多样,但是网络层协议基本是稳定的,ip协议和ir我感觉有着异曲同工之妙!

    作者回复: 是的,没错。感谢分享你的感受。 计算机架构里,经常出现这种中间层。中间件起这个作用,JVM也起这个作用。还有很多这种异曲同工的东西。

    2019-10-26
    9
  • A君
    前端的任务是生成AST,后端的任务有两个,一个是优化AST,剔除掉冗余操作;第二个是生成充分利用机器特性的目标代码。

    作者回复: 总结得简单清晰!

    2021-01-22
    6
  • Xylitol
    博主是厦门人?可以交个朋友~

    作者回复: 确实,我这几年是潜伏在厦门东坪山~~~ 你可以搜我的微博(虽然我很少更新),发信息约起~~~

    2020-03-23
    5
  • 刘桢
    后端还是难的呀,考研学组原脑袋都大了

    作者回复: 好在我们不会拿考试压迫同学们:-) 学好后端,可以结合你之前学过的组原、操作系统、汇编的知识,基本上就把计算机的运行原理都搞透了。

    2020-05-14
    3
  • 老师,一般我们都是在代码中实现多线程(也就是多核心的控制?),那么此处编译器后端所提到的并行性中的多个核心又具体是怎样的呢?

    作者回复: 在支持并发的时候,像C语言这样的语言,是不太需要编译器支持的。但对很多现代语言,都需要编译器和运行时配合才行。 1.并发中的同步互斥 像Java这样的语言,提供了像synchronized、volatile这样的关键字,在多个线程之间实现同步互斥。这个时候,编译器要生成相应的汇编代码。 2.对协程、Actor等并发模式的支持 除了线程之外,还有其他的并发模式,比如协程、Actor等。这个时候,编译器要生成一些代码,跟运行时协作,来进行并发调度。 在《编译原理实战课》中,专门有关于并发的内容,有三讲的内容讲解并发中的编译技术,会说得比较细。你可以去看一下。在介绍Go语言等编译器的时候,也介绍了这门语言的编译器是如何支持并发的。 总的来说,现代语言的内存管理(含垃圾收集)、并发等特性,都需要编译器的密切参与才可以。

    2021-01-07
    2
    2
  • 非洲小白领
    前端算法部分看得一脸懵逼,后端就熟悉多了

    作者回复: 看来你是偏向于搞底层编码的?

    2019-12-29
    2
  • Dylan
    熬过最不熟悉的前端,突然感觉一身轻松

    作者回复: 值得庆祝,应该喝一杯!

    2020-03-20
    1
  • Geek_103f3f
    老师,直接从这开始学可以吗,前端实在听不懂,对我的工作也没什么用

    作者回复: 后端跟前端是相对独立的,是可以单独学的。 你可以认为前端反正已经生成AST了。现在你就想办法如何把它变成IR,再变成机器码就好了。

    2019-12-26
    3
    1
  • 从这一节开始,内容就十分熟悉了,终于不用看JAVA代码了,哈哈😄

    作者回复: 我希望前端部分的代码,也用c++写一遍,等我时间更充足会补上。 第二,后端部分有的地方仍然是用java写的,比如32讲生成字节码:)

    2019-10-19
    1
收起评论
显示
设置
留言
14
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部