Go 编译原理
在编译型语言中,当使用类似 build 命令进行编译时,在其内部会严格进行内部转换,从编码层转变为机器层(汇编语言),从而使代码赋予的逻辑运行在机器上。但是这一过程对于我们开发者来说是不可见(黑盒)的,接下来从 go build main.go 来解释这其中发生了什么? 引用: AST生成: https://pkg.go.dev/go/ast 编译流程概述: 词法分析 -> 语法分析 -> 类型检查 -> AST 到 SSA 转换 在一个 Go 程序被创建时,使用 go build 指令编译后运行二进制文件的过程中,其中经历了多次转换,最终运行在操作系统之上(在Go中,最终编译为汇编语言) 例如我们最熟悉不过的代码,输出 Hello, world(下文所有分析依据于此片段): package main import "fmt" func main() { fmt.Println("Hello, world") } 无疑是我们最为常见,但从保存文件到运行,中间做了什么操作,无从得知,得到的只有结果,而中间的过程是不会显示的。 在使用 Go自带的 run 命令后,程序从编译态(Go 为静态语言)到运行态的过程,首先经过编译器,而其主要负责以下操作: 构建 AST,此操作为多数语言编译的前提操作,构建抽象语法树。当前阶段主要负责分析、检查和代码生成 加载 Runtime 运行,主要是在 main 函数之前加载代码 在执行 build 或者 run 命令后,Go 编译器是怎样进行处理的? Terminal 中执行命令:GOSSAFUNC=main go build main.go GOSSAFUNC=main 的意思是:在编译过程中将SSA暴露出来。 命令执行后,会在当前目录下生成文件ssa.html 如下图所示 打开文件在浏览器中显示 一、解析 Go 源码 Go 语言的解析过程主要包括词法分析和语法分析两个阶段。在编译过程中,Go源代码首先会被转换成抽象语法树(AST),然后进行类型检查和代码生成等操作。 ...