一、 Go编译流程

二、过程说明

1. 词法解析

读取Go源文件,将字符序列转换为符号(token)序列,比如将“:=”转换为_Define

代码中的标识符、关键字、运算符和分隔符等字符串都将转化为对应的符号

2. 语法解析

根据Go语言规范对符号化的Go源文件进行解析,识别可能出现的语法错误,比如

 1 package main
2
3 import "fmt"
4
5 func main()
6 { //这里不能单独一行
7 fmt.Println("Hello world!")
8 }
9
10 # command-line-arguments
11 ./main.go:5:6: missing function body
12 ./main.go:6:1: syntax error: unexpected semicolon or newline before {

3. AST构建

AST,即抽象语法树(Abstract Syntax Tree)

4. 类型检查

a. 类型推断

b. 数组索引是否为正整数

c. 引用的结构体字段是否是大写可导出的

5. 变量捕获

主要针对闭包场景而言,闭包函数可能引用闭包外变量

变量捕获需要明确在闭包中通过值引用还是地址引用来捕获变量

6. 函数内联

函数内联是指将较小的函数直接组合进调用者的函数内

可以减少函数调用的开销

7. 逃逸分析

逃逸分析确定变量内存是分配在栈区还是堆区

8. 闭包重写

对闭包函数进行重写

9. 遍历函数

遍历函数中的声明和表达式,将操作函数替换为具体的执行函数,如map被替换为运行时mapaccess2_fast64函数

10. SSA生成

SSA,即静态单赋值(Static Single Assignment),可以理解为抽象语法树到机器码的中间代码

11. 机器码生成

a. 汇编

b. 链接

三、可执行文件

1. ELF

ELF,Executable and Linkable Format是类Unix操作系统下最常见的可执行且可链接的文件格式。

最新文章

  1. 关于TextView的setText()与Integer之间一个易犯的小错误
  2. codeforces 697B Barnicle
  3. Asp.Net在多线程环境下的状态存储问题
  4. Oracle EM 不能访问
  5. x86, x86-64, i386, IA32, IA64...
  6. Effective C++_笔记_条款11_在operator=中处理“自我赋值”
  7. linux下的watch命令
  8. wpf listview 行变色
  9. Java获取某年某周的第一天
  10. HTML的水平居中和垂直居中解决方案
  11. delphi弹出信息框大全
  12. SSL证书安装(Tomcat)腾讯云服务器
  13. C - Heavy Transportation && B - Frogger(迪杰斯变形)
  14. P2947 [USACO09MAR]向右看齐Look Up--单调栈
  15. Linux 典型应用之远程连接SSH
  16. Linux成为云计算平台的主流操作系统
  17. Git系列①之仓库管理互联网托管平台github.com的使用
  18. spring ioc beanfactory 关系图
  19. sessionStorage 、localStorage、cookie
  20. TNS-12518,TNS-12536,TNS-00506,Linux Error: 11: Resource temporarily unavailable

热门文章

  1. 从Mpx资源构建优化看splitChunks代码分割
  2. Java实现无界面计算器
  3. svn :不能打开文件“/data/svn/repo/format”: 权限不够
  4. typescript+webpack构建一个js库
  5. Servlet-3 :JDBC+重定向
  6. CSS进阶内容—盒子和阴影详解
  7. Harbor-私有镜像仓库的安装部署
  8. Java多线程交替打印
  9. 【C++】从设计原理来看string类
  10. nginx反向代理缓存配置