SPIR-V 研究:编译器基本原理(一)
前面转过两篇关于SPIR-V 中间语言的介绍;接下来笔者准备深入学习一下SPIR-V的标准。根据标准,SPIR-V是以一种二进制格式存在的,并且函数还是以控制流图CFG的形式存在;数据结构也保留了高级语言里的层级关系。(https://en.wikipedia.org/wiki/Standard_Portable_Intermediate_Representation)
这样做的目的是为了更好的在目标平台上进行优化;同时Khronos也放出了官方标准的开源编译器Glslang。 所以,为了更好的了解SPIR-V,我们有必要先温习一下编译器的基本原理,特别是前端的词法分析、语法分析、语义分析和中间语言生成。
编译器基本结构
下图是一个一般编译器的编译高级语言的过程。
基本上就是预处理(比如C/C++里宏汇编),编译并汇编(每个源码文件都生成对应的.o文件,这时的代码是relocatable的),链接生成可执行文件(linker,把许多.o文件以及用到的库函数.lib文件合并并作全局优化),最后OS的加载器会加载可执行文