24 | Go语言编译器:把它当作教科书吧
宫文学
该思维导图由 AI 生成,仅供参考
你好,我是宫文学。今天这一讲,我来带你研究一下 Go 语言自带的编译器,它可以被简称为 gc。
我之所以要来带你研究 Go 语言的编译器,一方面是因为 Go 现在确实非常流行,很多云端服务都用 Go 开发,Docker 项目更是巩固了 Go 语言的地位;另一方面,我希望你能把它当成编译原理的教学参考书来使用。这是因为:
Go 语言的编译器完全用 Go 语言本身来实现,它完全实现了从前端到后端的所有工作,而不像 Java 要分成多个编译器来实现不同的功能模块,不像 Python 缺少了后端,也不像 Julia 用了太多的语言。所以你研究它所采用的编译技术会更方便。
Go 编译器里基本上使用的都是经典的算法:经典的递归下降算法、经典的 SSA 格式的 IR 和 CFG、经典的优化算法、经典的 Lower 和代码生成,因此你可以通过一个编译器就把这些算法都贯穿起来。
除了编译器,你还可以学习到一门语言的其他构成部分的实现思路,包括运行时(垃圾收集器、并发调度机制等)、标准库和工具链,甚至连链接器都是用 Go 语言自己实现的,从而对实现一门语言所需要做的工作有更完整的认识。
最后,Go 语言的实现继承了从 Unix 系统以来形成的一些良好的设计哲学,因为 Go 语言的核心设计者都是为 Unix 的发展,做出过重要贡献的极客。因此了解了 Go 语言编译器的实现机制,会提高你的软件设计品味。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文深入介绍了Go语言编译器的实现细节及其在编译原理教学中的重要性。编译器完全用Go语言本身实现,采用经典算法和技术,对学习编译原理非常有帮助。文章重点讨论了基于SSA格式的IR进行优化的重要性,以及Go编译器使用的优化算法和规则。通过对IR的多步处理和优化,编译器能够消除冗余的代码并提高性能。此外,文章还提到了Go编译器与众不同的地方,即生成的汇编代码是一种“伪汇编”,在生成特定CPU的机器码时还会做一些转换。总的来说,本文通过对Go语言编译器实现细节和优化算法的介绍,为读者提供了深入了解编译原理和语言实现的机会,同时展示了Go语言编译器作为教学参考书的价值。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《编译原理实战课》,新⼈⾸单¥59
《编译原理实战课》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(7)
- 最新
- 精选
- Geek_a71358老师您好,有个问题想请教您下,我想在golang上面实现一个wasm的aot执行器,是不是把wasm翻译为go的IR,然后复用go的编译器代码就可以了,主要是执行器想在golang上做不想走cgo
作者回复: 理论上是可以的。你要为go的编译器提供IR和其他辅助信息,比如符号表等,让它有足够的信息去做后序的编译。
2020-08-262 - Geek_02b7e6指令排序不受重视的真正原因是没有准确的性能度量模型。不仅仅是指令调度,很多基于解析模型的传统编译器优化正在一头撞到这堵墙上。gcc在x86上的性能改进几年加起来也就2%。。。 cpu的动态调度能力强大并不是不做静态调度的理由,静态调度和动态调度是互补而不是冲突的。
作者回复: 感谢你分享的观点!
2020-08-211 - fy老师,那些不同语言得编译器,你用的是JB(JetBrains)全家桶嘛
作者回复: JB是IDE。它内置了一些前端的编译功能,用于实现语法变量、符号引用等功能。但在Build的时候,还是使用语言的编译器的。比如,编译Java时,会采用指定版本的JDK。 JB这套工具确实很不错。作为一个第三方厂商,在大厂的夹缝中能够生存下来,有其独特之处。JB有一套框架,能帮助它解析各种不同的语言,并形成大致相同的内部表示结构,这是它的核心技术。你阅读JB的源代码,可以学到这些技术。
2021-04-09 - 小豹哥文章质量太TM硬了,牙齿都掉了好几个2022-06-271
- Tintin请问下老师,能否出了一个使用GoLand调试go编译器的指引呢?折腾了好久没有折腾成功2020-11-1421
- VoiceWitness老师, 在一课一思的部分 除了思考题之外,能否再给我们布置一些基础题 ,在实践问题的过程中消化学到的知识; 现在像拥有了海克斯科技 但不知道怎么使用2022-10-12归属地:浙江
- kkxue阅读Go源码中,很棒的指引!2022-06-17
收起评论