5.2 代码结构

兼容性说明:

在前言中提到 Go 的编译器团队当前正在重写类型检查系统,ir 包便是该过程中剥离出来的一部分,与 IR Tree 相关的代码后期应该都会移动到该包内。在老版本中,IR Tree 的生成与类型检查是同时完成的,新版本的实现做了隔离,在代码结构上更加清晰。

由于类型检查器的重写还没有完成,而 IR Tree 是很多后续处理的基础,因此现在 IR Tree 中依然关联了很多旧版本类型检查器的代码,主要包括目录 cmd/compile/internal/typescmd/compile/internal/typecheck 中的代码。但我们并不需要将这些代码全部弄懂,只需要了解涉及到的一些基本的思路就可以继续学习下去,也许等到重写工作全部完成之后代码逻辑会更加清晰。

生成 IR Tree 的代码主要位于包 ir 中,在目录 cmd/compile/internal/ir/ 下;还有部分在 cmd/compile/internal/noder 中。其中入口函数是 cmd/compile/internal/noder/irgen.go 中的 irgen.generate() ,ir 包是重写类型检查器时单独剥离出来的逻辑,因此该函数在新的类型检查函数 check2() 的最后阶段被调用。

所生成的 IR Tree 保存在全局变量 typecheck.Target 内,该变量定义在文件 cmd/compile/internal/typecheck.target.go 中,包含着当前被编译的包的所有信息,是所有后续操作的基础。

最后更新于