Golang 编译器代码浅析
  • 0. Golang 编译器代码浅析
  • 1. golang 编译器 - 前言
    • 1.1 编译器简介
    • 1.2 Golang 编译器
    • 1.3 Go 语言版本
    • 1.4 项目设置
    • 1.5 约定
    • 1.6 写作目的
  • 2. golang 编译器 - 词法分析
    • 2.1 简介
    • 2.2 代码结构
    • 2.3 处理字符
    • 2.4 扫描Token
    • 2.5 总结
  • 3.a 语法分析理论知识
    • 3A.1 语法分析简介
    • 3A.2 文法
    • 3A.3 语法解析
    • 3A.3.1 自顶向下(Top-Down)
    • 3A.3.2 自顶向下 - 递归下降
    • 3A.3.3 自顶向下 - LL(1)文法
    • 3A.3.4 自底向上(Bottom-Up)
    • 3A.3.5 自底向上 - LR(0)项集及SLR预测表
    • 3A.3.6 自底向上 - LR(1)、LALR
    • 3A.4 语法分析工具
    • 3A.5 总结
  • 3B. golang 编译器 - 语法分析
    • 3B.1 简介
    • 3B.2 代码结构
    • 3B.3 数据结构
    • 3B.4 构造语法树
    • 3B.5 Unit Test及AST可视化
  • 4. Golang 编译器 - 类型检查
    • 4.1 简介
    • 4.2 代码结构
    • 4.3 符号解析
    • 4.4.1 数据结构 - 作用域
    • 4.4.2 数据结构 - Package
    • 4.4.3 数据结构 - Object 对象
    • 4.4.4-1 类型数据结构 - 简介
    • 4.4.4-2 类型接口
    • 4.4.4-3 基础类型
    • 4.4.4-4 内置复合类型
    • 4.4.4-5 Struct 类型
    • 4.4.4-6 Interface 类型
    • 4.4.4-7 Named 类型
    • 4.4.4-8 Tuple 类型
    • 4.4.4-9 Sum 类型
    • 4.4.4-10 Function & Method 类型
    • 4.4.4-11 泛型类型
    • 4.4.4-12 类型的等价规则
    • 4.4.4-13 类型的比较规则
    • 4.4.4-14 总结
    • 4.4.5 类型检查器
    • 4.4.6 总结
    • 4.5.1 类型检查逻辑 - 包加载器
    • 4.5.2 类型检查逻辑 - 初始化
    • 4.5.2-1 全局作用域
    • 4.5.2-2 类型检查器
    • 4.5.3 类型检查逻辑 - 流程分析
    • 4.5.3-1.1 总体流程
    • 4.5.3-1.2 类型检查准备工作
    • 4.5.3-1.3 类型检查核心逻辑
    • 4.5.3-1.3a 总体介绍
    • 4.5.3-1.3b 类型表达式的类型检查
    • 4.5.3-1.3c 求值表达式的类型检查
    • 4.5.3-1.3d 类型兼容性检查
    • 4.5.3-1.3e 处理delayed队列
    • 4.5.3-1.4 构建初始化顺序
    • 4.5.3-1.5 总结
    • 4.5.3-2 特定问题分析
    • 4.5.3-2a 对象循环依赖检查
    • 4.5.3-2b 方法与属性查找
    • 4.5.3-2c Underlying Type
    • 4.6 如何测试
    • 4.7 总结
  • 5. Golang 编译器 - IR Tree
    • 5.1 简介
    • 5.2 代码结构
    • 5.3 数据结构
    • 5.4 处理逻辑
    • 5.5 编译日志
    • 5.6 Unit Test
    • 5.7 总结
  • 6. golang 编译器 - 初始化任务
    • 6.1 简介
    • 6.2 代码结构
    • 6.3 总体逻辑
    • 6.4 赋值语句
    • 6.5 编译日志
    • 6.6 Unit Test
    • 6.7 总结
  • 7. golang 编译器 - 清除无效代码
    • 7.1 简介
    • 7.2 处理逻辑
    • 7.3 Unit Test
  • 8. golang 编译器 - Inline
    • 8.1 简介
    • 8.2 Inline的问题
    • 8.3 代码结构
    • 8.4 处理逻辑
    • 8.4.1 遍历调用链
    • 8.4.2 内联判断
    • 8.4.3 内联操作
    • 8.4.4 编译日志
    • 8.4.5 Unit Test
    • 8.4.6 总结
  • 9. golang 编译器 - 逃逸分析
    • 9.1 什么是逃逸分析
    • 9.2 Go 的逃逸分析
    • 9.3 算法思路
    • 9.4 代码结构
    • 9.5 处理逻辑
    • 9.5.1总体逻辑
    • 9.5.2 数据结构
    • 9.5.3 构建数据流有向图
    • 9.5.4 逃逸分析
    • 9.6 编译日志
    • 9.7 Unit Test
    • 9.8 总结
  • 10. golang 编译器 - 函数编译及导出
    • 10.1 简介
    • 10.2 编译函数
    • 10.2.1 SSA
    • 10.2.2 ABI
    • 10.2.3 并发控制
    • 10.3 导出对象文件
    • 10.4 总结
  • 11. Golang 编译器 - 写在最后
由 GitBook 提供支持
在本页

这有帮助吗?

  1. 1. golang 编译器 - 前言

1.4 项目设置

上一页1.3 Go 语言版本下一页1.5 约定

最后更新于4年前

这有帮助吗?

要使用 master 分支的代码,就需要能够编译最新代码的环境,下列步骤是在 Linux 系统下配置项目的简易步骤(详细步骤参见):

  1. 下载 Go 语言编译器,使用即可。解压后将文件夹更名为 gobs 并移动到某目录下,例如 $HOME/Tools 下。此时 $HOME/Tools/gobs 包含着最新的 Go 预编译发行版本

  2. 设置编译工具链环境变量:

    export GOROOT_BOOTSTRAP=$HOME/Tools/gobs

    该环境变量用于搜索编译 Go 源码时的编译器工具链,因为只设置了该环境变量,所以该目录下的 go 只会在后续的编译步骤中被搜索使用到

  3. Clone 源代码并编译:

    git clone https://github.com/golang/go $HOME/Tools/go # Clone 源代码到目标目录
    cd $HOME/Tools/go/src
    git checkout d26fc68aa10dc8eda5ccdcc80d790e7df2fd9823 # checkout 与本文一致的代码
    ./all.bash                  # 编译源代码

    完成编译之后$HOME/Tools/go 下面会多出bin 与pkg 目录。bin 目录下面包含可执行文件 go, 而pkg 目录下包含着各个库编译后的对象文件(pkg/linux_amd64)、工具链(pkg/tool)以及构建时的缓存文件(pkg/obj/go-build)。可以运行 bin/go version 查看当前版本:

        ./go version
        go version devel +ce19612a36 Thu Mar 4 15:10:16 2021 +0800 linux/amd64

    注意:工程中的很多代码是在构建时自动生成的,因此如果读者重新更新了代码,一定要先运行脚本 ./all.bash, 否则 IDE 可能会提示编译错误,或者无法运行某些 UT

  4. 设置环境变量:

        export GOROOT=$HOME/Tools/go
        export GOPATH=$HOME/go
        export PATH=$GOROOT/bin:$GOPATH/bin:$PATH

    注意这样设置之后整个系统都会使用 master 分支编译出来的 go, 如果你需要在本地编译生产环境的系统或者其他工具,则需要修改 GOROOT

编译器及整个工具链的代码在目 $GOROOT/src/cmd/ 下面,该目录的结构也是一个典型的 go 语言工程,将该目录作为根目录引入 IDE 即可。

项目的配置方式不止一种,这里只是分享的基于作者自己开发环境(Archlinux)的个人配置,每个人偏爱的环境以及工具都不一样,只需要按照上述思路配置能够正常工作即可。

官方教程
最新发布版本