关键词:LLVM,Clang,Swiftc,IR,preprocessor,Mach-O,dyld
编译器
把一种编程语言(原始语言)转换为另一种编程语言(目标语言)的程序叫做编译器.
大多数编译器由两部分组成: 前端和后端.
前端负责词法分析,语法分析,生成中间代码;
后端以中间代码作为输入,进行行架构无关的代码优化,接着针对不同架构生成不同的机器码。
前后端依赖统一格式的中间代码(IR), 使得前后端可以独立的变化. 新增一门语言只需要修改前端, 而新增一个CPU架构只需要修改后端即可. Objective C/C/C++使用的编译器前端是clang, swift是swift, 后端都是LLVM.
一、LLVM
LLVM的核心库提供了现代化的source-target-independent优化器和支持诸多流行CPU架构的代码生成器. Clang 和 LLDB都是基于LLVM衍生的子项目.
二、Clang
Clang是C语言家族的编译器前端,诞生之初是为了替代GCC,提供更快的编译速度。一张图了解clang编译的大致流程:
大致看来, Clang可以分为一下几个步骤:
预处理 -> 词法分析 -> 语法分析 -> 静态分析 -> 生成中间代码和优化 -> 汇编 -> 链接
1、预处理(preprocessor)
预处理会进行如下操作:
1)头文件引入, 递归将头文件引用替换为头文件中的实际内容, 所以尽量减少头文件中的#import, 使用@class替代, 把#import放到.m文件中.
2)宏替换, 在源码中使用的宏定义会被替换为对应#define的内容, 不要在需要预处理的代码中加入太多的内联代码逻辑.
3)注释处理, 在预处理的时候, 注释被删除
4)条件编译, (#if, #else, #endif)
2、词法分析(lexical anaysis)
这一步把源文件中的代码转化为特殊的标记流. 词