编译原理实战课
宫文学
北京原点代码 CEO
26066 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 55 讲
真实编译器解析篇 (19讲)
编译原理实战课
15
15
1.0x
00:00/00:00
登录|注册

24 | Go语言编译器:把它当作教科书吧

错误处理方式
运算符优先级算法
递归下降算法
错误处理原则
算法标准化
实现位置
Unix系统设计哲学的继承
完整的语言实现
经典的算法应用
用Go语言实现
内联优化的实现差异
指令排序
指令选择
寄存器分配
重写规则
优化算法Pass
死代码删除
优化算法
函数
基本块
IR结构
AST变换
类型推导
名称消解算法
实现位置
语法分析器
词法分析器
Go语言编译器的特点
参考资料
思考
生成机器码
基于SSA格式的IR做优化
生成SSA格式的IR
语义分析
词法分析和语法分析
介绍
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
立即购买
登录 后留言

全部留言(7)

  • 最新
  • 精选
  • Geek_a71358
    老师您好,有个问题想请教您下,我想在golang上面实现一个wasm的aot执行器,是不是把wasm翻译为go的IR,然后复用go的编译器代码就可以了,主要是执行器想在golang上做不想走cgo

    作者回复: 理论上是可以的。你要为go的编译器提供IR和其他辅助信息,比如符号表等,让它有足够的信息去做后序的编译。

    2020-08-26
    2
  • Geek_02b7e6
    指令排序不受重视的真正原因是没有准确的性能度量模型。不仅仅是指令调度,很多基于解析模型的传统编译器优化正在一头撞到这堵墙上。gcc在x86上的性能改进几年加起来也就2%。。。 cpu的动态调度能力强大并不是不做静态调度的理由,静态调度和动态调度是互补而不是冲突的。

    作者回复: 感谢你分享的观点!

    2020-08-21
    1
  • fy
    老师,那些不同语言得编译器,你用的是JB(JetBrains)全家桶嘛

    作者回复: JB是IDE。它内置了一些前端的编译功能,用于实现语法变量、符号引用等功能。但在Build的时候,还是使用语言的编译器的。比如,编译Java时,会采用指定版本的JDK。 JB这套工具确实很不错。作为一个第三方厂商,在大厂的夹缝中能够生存下来,有其独特之处。JB有一套框架,能帮助它解析各种不同的语言,并形成大致相同的内部表示结构,这是它的核心技术。你阅读JB的源代码,可以学到这些技术。

    2021-04-09
  • 小豹哥
    文章质量太TM硬了,牙齿都掉了好几个
    2022-06-27
    1
  • Tintin
    请问下老师,能否出了一个使用GoLand调试go编译器的指引呢?折腾了好久没有折腾成功
    2020-11-14
    2
    1
  • VoiceWitness
    老师, 在一课一思的部分 除了思考题之外,能否再给我们布置一些基础题 ,在实践问题的过程中消化学到的知识; 现在像拥有了海克斯科技 但不知道怎么使用
    2022-10-12归属地:浙江
  • kkxue
    阅读Go源码中,很棒的指引!
    2022-06-17
收起评论
显示
设置
留言
7
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部