词法分析
编译原理概述 在编译性语言中,当使用类似 build 指令进行编译时,在其内部会严格进行下面机制的转换,从编码层转变为机器语言层或是汇编语言,从而运行代码赋予的操作在此机器上。但是这一过程对于我们使用者来说是便捷的,不用过多的考虑构建的过程,只需要注重其结果。 在编译型语言中,常见编译过程包括: 词法分析:源码转换为 Token 语法分析:将 Token 转换为 AST 语义分析:分析校验 AST 的合法性 代码生成:AST 到 SSA 的转换 在上述流程中,其主要是将源码一步步的抽象化,这种也像在设计一种编程语言时,通过将理念抽象,获得更直观的理解,也是方便编码从业者的使用。从这一方面可以看出,对于编译也是如此。从可读语言进行抽象化,其目的旨在后续分析做铺垫。 所以说编译器主要实现的步骤则是从字符序列转换为 SSA,而这一过程,在 Golang 中可通过命令进行显式输出为 HTML。 SSA 生成 例如最为常见的一个 Go 代码(下文所有分析依据于此片段): package main import "fmt" func main() { fmt.Println("Hello, world") } 这段无疑是最为熟悉,但从保存文件到运行,中间做了什么操作,对我们来说属于黑盒,得到的只有结果,而中间的过程是不可见的。所以作为有追求有梦想的开发者,必然是会将盒子打开来一探究竟,它是如何在盒子中运作的? 在使用 Go自带的 run 命令后,程序从编译态(Go 为静态语言)到运行态的过程,首先经过编译器,而其主要负责以下操作: 通过 Token 构建 AST,构建抽象语法树。当前阶段主要负责分析、检查和代码生成 加载 Runtime 运行,在 main 函数之前加载代码,比如 GC、Schedule 等 Terminal 中执行命令:GOSSAFUNC=main go build main.go, 即可在编译过程中将转换为 SSA 的流程暴露出来。命令执行后,会在当前目录下生成文件 ssa.html。SSA(Static Single Assignment)是指静态单赋值,也是编译器优化和转换源代码的中间表示形式(这是编译的最后阶段,暂时不做解读)。 命令执行输出结果如下图所示 将ssa.html文件打开,在浏览器中显示如下图 可以大致浏览下页面,从 Source Code 到 SSA 的转换,这就是在编译过程中,将我们可读的字符序列,转换或是说抽象为特定结构。 ...