20 | 高效运行:编译器的后端技术
该思维导图由 AI 生成,仅供参考
弄清程序的运行机制
- 深入了解
- 翻译
- 解释
- 总结
编译器后端技术是关于如何将程序编译成机器能够理解和高效运行的代码。这需要解决三个问题:理解计算机运行程序的原理、将前端生成的AST和属性信息正确翻译成目标代码、对程序进行优化。首先,需要了解程序的运行机制,包括内存空间划分、程序启动和执行过程等。然后,生成目标代码,可以是汇编代码或者Java虚拟机的字节码,需要了解不同硬件平台的特点。为了降低后端工作量,提高软件复用度,引入中间代码(IR)的机制,可以独立于具体硬件,各个语言的前端可以先翻译成IR,然后再从IR翻译成不同硬件架构的汇编代码。最后,对代码进行优化,提高程序执行效率和占用空间。优化工作又分为“独立于机器的优化”和“依赖于机器的优化”两种。独立于机器的优化是基于IR进行的,可以通过对代码的分析,用更加高效的代码代替原来的代码。依赖于机器的优化则是依赖于硬件的特征。现代的计算机硬件设计了很多特性,以便提供更高的处理能力,编译器要能够充分利用硬件提供的性能。总的来说,编译器后端技术需要对代码进行的优化非常多,是编译过程中耗时最长、最体现某个编译器的功力的一类工作。
《编译原理之美》,新⼈⾸单¥59
全部留言(14)
- 最新
- 精选
- 阿鼎老师,后段技术在实际的项目中,有什么应用?
作者回复: 我认为有三方面: 1.如果要写一门真实使用的计算机语言,或者参与类似数据库软件之类的基础软件的开发,还是要把代码编译成字节码或机器码的,所以就需要后端技术。 2.有助于你做系统的深层优化和性能调优。淘宝的底层技术团队就曾关注Java即时编译功能,甚至还给Oracle提交了补丁。 3.从知识方面,会帮你更加理解软件运行的机制,从而对于你设计任何软件、以及设计大型系统的架构都有好处。
2019-10-0916 - nil把前端的ast转化成中间形式确是个漂亮的做法,可以隔离前后端之间的耦合。后端可以面向ir实现。针对不同的硬件平台,实现不同的后端编译程序。这让我想到网络协议中的ip协议。ip协议被设计成沙漏,或者说细腰结构,就是为了减少上下游之间的耦合,应用层和数据链路层中的协议多种多样,但是网络层协议基本是稳定的,ip协议和ir我感觉有着异曲同工之妙!
作者回复: 是的,没错。感谢分享你的感受。 计算机架构里,经常出现这种中间层。中间件起这个作用,JVM也起这个作用。还有很多这种异曲同工的东西。
2019-10-269 - A君前端的任务是生成AST,后端的任务有两个,一个是优化AST,剔除掉冗余操作;第二个是生成充分利用机器特性的目标代码。
作者回复: 总结得简单清晰!
2021-01-226 - Xylitol博主是厦门人?可以交个朋友~
作者回复: 确实,我这几年是潜伏在厦门东坪山~~~ 你可以搜我的微博(虽然我很少更新),发信息约起~~~
2020-03-235 - 刘桢后端还是难的呀,考研学组原脑袋都大了
作者回复: 好在我们不会拿考试压迫同学们:-) 学好后端,可以结合你之前学过的组原、操作系统、汇编的知识,基本上就把计算机的运行原理都搞透了。
2020-05-143 - 。老师,一般我们都是在代码中实现多线程(也就是多核心的控制?),那么此处编译器后端所提到的并行性中的多个核心又具体是怎样的呢?
作者回复: 在支持并发的时候,像C语言这样的语言,是不太需要编译器支持的。但对很多现代语言,都需要编译器和运行时配合才行。 1.并发中的同步互斥 像Java这样的语言,提供了像synchronized、volatile这样的关键字,在多个线程之间实现同步互斥。这个时候,编译器要生成相应的汇编代码。 2.对协程、Actor等并发模式的支持 除了线程之外,还有其他的并发模式,比如协程、Actor等。这个时候,编译器要生成一些代码,跟运行时协作,来进行并发调度。 在《编译原理实战课》中,专门有关于并发的内容,有三讲的内容讲解并发中的编译技术,会说得比较细。你可以去看一下。在介绍Go语言等编译器的时候,也介绍了这门语言的编译器是如何支持并发的。 总的来说,现代语言的内存管理(含垃圾收集)、并发等特性,都需要编译器的密切参与才可以。
2021-01-0722 - 非洲小白领前端算法部分看得一脸懵逼,后端就熟悉多了
作者回复: 看来你是偏向于搞底层编码的?
2019-12-292 - Dylan熬过最不熟悉的前端,突然感觉一身轻松
作者回复: 值得庆祝,应该喝一杯!
2020-03-201 - Geek_103f3f老师,直接从这开始学可以吗,前端实在听不懂,对我的工作也没什么用
作者回复: 后端跟前端是相对独立的,是可以单独学的。 你可以认为前端反正已经生成AST了。现在你就想办法如何把它变成IR,再变成机器码就好了。
2019-12-2631 - 风从这一节开始,内容就十分熟悉了,终于不用看JAVA代码了,哈哈😄
作者回复: 我希望前端部分的代码,也用c++写一遍,等我时间更充足会补上。 第二,后端部分有的地方仍然是用java写的,比如32讲生成字节码:)
2019-10-191