本文主要是介绍Go编译器原理笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
阶段
- 前端(frontend):对源码进行分析,生成AST源代码语法结构物。
- 后端(backend):将源代码转换为机器码,并进行优化。
1. parsing
2. AST transformation
3. SSA generation
4. machine code generation
example go1.14.0
package mainfunc main() {a := 1b := 2if true {add(a, b)}
}func add(a, b int) {println(a + b)
}
parsing 解析
解析包含1.词法分析,2.语法分析,3构建语法树。
AST(抽象语法树)转换
go tool compile -w main.go //展示抽象语法树
此阶段包含内联等优化,如果想禁用内联
go tool compile -w -l main.go//禁用内联
AST生成后,它允许编译器使用SSA表示转到较低级别的中间表示
SSA (静态单赋值)的生成
SSA阶段进行优化:1.消除死代码,2.删除不使用的分支,3.替换一些常量表达式等等。
GOSSAFUNC=main Go tool compile main.go//该命令将生成ssa.html文件。
ssa.html文件中保存了SSA完成的所有阶段过程。
- start 阶段
- opt 阶段 (opt deadcode 删除死代码)
- lower 阶段
- regalloc 阶段
- genssa 阶段
genssa后,将生成一个中间汇编代码
机器码的生成
将机器码生成到二进制文件中
这篇关于Go编译器原理笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!