1、简介
LLVM项目是模块化、可重用的编译器以及工具链技术的集合。官网地址:llvm.org。它的创始人是Chris Lattner,也是swift之父。地址二
2、传统编译器的架构
从代码到机器码,编译器工作分为三个阶段(编译器的架构),前端(Frontend)、优化器(Optimizer)、后端(Backend)。
其中前端的工作是词法分析,语法分析,语义分析,和生成中间代码(IR)。优化器的工作就是进行中间代码的优化,分为多个pass。而后端就是生成机器码的工作。
前端是适应多种语言,后端是适应多种硬件设备。不同的前端后端使用统一的中间代码LLVM Intermediate Representation (LLVM IR)。
clang是基于LLVM架构的C/C++/Objective-C编译器前端,它是LLVM的一个子项目,官网:clang.llvm.org
相比于GCC,Clang具有如下优点:
- 编译速度快:在某些平台上,Clang的编译速度显著的快过GCC(Debug模式下编译OC速度比GGC快3倍)
- 占用内存小:Clang生成的AST所占用的内存是GCC的五分之一左右
- 模块化设计:Clang采用基于库的模块化设计,易于 IDE 集成及其他用途的重用
- 诊断信息可读性强:在编译过程中,Clang 创建并保留了大量详细的元数据 (metadata),有利于调试和错误报告
- 设计清晰简单,容易理解,易于扩展增强
3、通过命令行了解OC源文件的编译过程
命令行查看编译的过程: Xcode新建一个命令行工具,cd到main.m上层目录,执行 clang -E main.m
1. 前端过程一,词法分析,生成Token:
$ clang -fmodules -E -Xclang -dump-tokens main.m
2. 前端过程二,语法分析,生成语法树(AST,Abstract Syntax Tree):
$ clang -fmodules -fsyntax-only -Xclang -ast-dump main.m
3. 前端过程三,语义分析并生成中间代码(IR),LLVM IR有3种表示形式:
- text:便于阅读的文本格式,类似于汇编语言,拓展名.ll, $ clang -S -emit-llvm main.m
IR基本语法:官方语法参考:llvm.org/docs/LangRe…
- 注释以分号 ; 开头
- 全局标识符以@开头,局部标识符以%开头 p alloca,在当前函数栈帧中分配内存
- i32,32bit,4个字节的意思
- align,内存对齐
- store,写入数据
- load,读取数据
- memory:内存格式
- bitcode:二进制格式,拓展名.bc, $ clang -c -emit-llvm main.m
4、源码下载
1. 下载LLVM,大小 648.2 M,仅供参考:
- $ git clone git.llvm.org/git/llvm.gi…
2. 下载clang,大小 240.6 M,仅供参考:
- $ cd llvm/tools
- $ git clone git.llvm.org/git/clang.g…
5、 源码编译
1、通过辅助工具编译(快很多)
-
安装cmake和ninja(先安装brew,brew.sh/)
- $ brew install cmake
- $ brew install ninja,ninja如果安装失败,可以直接从github获取release版放入【/usr/local/bin】中,github.com/ninja-build…。
-
编译,编译完毕后, 【llvm_build】目录大概 21.05 G(仅供参考)
- 在LLVM源码同级目录下新建一个【llvm_build】目录(最终会在【llvm_build】目录下生成【build.ninja】
- $ cd llvm_build
- $ cmake -G Ninja ../llvm -DCMAKE_INSTALL_PREFIX=LLVM的安装路径
- 更多cmake相关选项,可以参考: llvm.org/docs/CMake.…
-
安装,安装完毕后,安装目录大概 11.92 G(仅供参考)
- $ ninja install
2、生成Xcode项目再进行编译,但是速度很慢(可能需要1个多小时)
- 在llvm同级目录下新建一个【llvm_xcode】目录
- $ cd llvm_xcode
- $ cmake -G Xcode ../llvm
6、LLVM应用与实践
1. libclang、libTooling(语法树分析、语言转换等)
官方参考:clang.llvm.org/docs/Toolin…
2. Clang插件开发,官方参考,代码检查(命名规范、代码规范)等
3. Pass开发(代码优化、代码混淆等)
4. 开发新的编程语言
- llvm-tutorial-cn.readthedocs.io/en/latest/i…
- kaleidoscope-llvm-tutorial-zh-cn.readthedocs.io/zh_CN/lates…
7、相关书籍推荐
- 编译原理
- LLVM CookBook