LLVM是模块化,可重用的编译器以及工具链技术的集合,并且LLVM就是全称并不是简称,所以说LLVM是一种编译器显然是不够准确的,她至少可以代表两个,1.LLVM编译架构 2.LLVM编译器后端
基本的编译器架构前面昨天有写过就不赘述了
在LLVM架构里面优化器是恒定不变的,需要支持新的内核,比如现在是arm x86再多一个内核,就需要调整LLVM架构的后端部分,如果再多一个编程语言则只需要对应的编译器转成LLVM IR也就是LLVM能用的中间代码即可
Clang
Clang属于LLVM架构的前端,主要支持语言是C/C++/OC,Clang的编译速度是GCC的三倍,生成的语法树也只有GCC的五分之一,易于集成,报错也容易看懂,不像GCC报错你压根就看不懂(虽然但是,我感觉两个报错信息都不是人看的)
Clang的编译过程
1.预处理 一般就是#define 宏定义直接赋值比如 #define Age 4; int li = Age + 10; 这个预处理就是把这个Age 直接编译成 int li = 4 + 10;就是这种简单的处理,不赘述了
2.词法分析 所谓的词法分析,就是把程序分割成一个个token,然后看看符不符合规范,具体查看程序生成了哪些token的方式:
1.cd到程序对应的目录
2.clang -fmodules -E -Xclang -dump-tokens main.c 输入上述指令,其中main.c为文件名称
比如我生成的就如图所示,可以看出基本把所有代码都切成块