LLVM是模块化,可重用的编译器以及工具链技术的集合,用它可以给Xcode开发插件,开发语言。
传统编译器架构
LLVM架构
相比于传统架构LLVM的耦合度更低,不同语言只要实现一个新的编译器前端。
要支持一个新[图片上传中...(屏幕快照 2019-06-23 12.34.25.png-ac921b-1561264477034-0)]
的硬件,只需要实现一个新的后端。都不需要对中间优化阶段做修改。
Clang:LLVM的子项目,基于LLVM架构的C/C++/Objective-C编译器前端
查看编译过程命令clang -ccc-print-phases main.m
- preprocessor(预处理器)替换头文件宏定义, 终端查看命令(clang -E main.m)
- 编译编译成IR中间代码
- 词法分析:将代码生成一个个token(clang -fmodules -E -Xclang -dump-tokens main.m)
- 语法分析:生成语法树(AST), 查看命令(clang -fmodules -fsyntax-only -Xclang -ast-dump main.m)
- 生成中间代码:中间代码有三种表现形式(txt,内存格式,bitCode二进制格式)
- 中间代码优化(开发者可以按自己的意愿优化中间代码)
- 后端生成适合某个架构的机器码
我们写的代码转成机器码的过程,开发者可以自己添加Pass按自己的意愿优化代码