LLVM最早的时候是Illinois的一个研究项目,主要负责人是Chris Lattner,他现在就职于Apple. Apple 目前也是llvm项目的主要赞助者之一,对开发者保持开放,并兼容已有脚本。
一、LLVM简介
LLVM是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time)。
在理解LLVM时,我们可以认为它包括了一个狭义的LLVM和一个广义的LLVM:
- 广义的LLVM:其实就是指整个LLVM编译器架构,包括了前端、后端、优化器、众多的库函数以及很多的模块;
- 狭义的LLVM:其实就是聚焦于编译器后端功能(代码生成、代码优化、JIT等)的一系列模块和库。
- 广义的LLVM:其实就是指整个LLVM编译器架构,包括了前端、后端、优化器、众多的库函数以及很多的模块;
二、为什么放弃GCC?
- Xcode 最早的编译器是GCC,尽管GCC是一个相对较好的编译器,但是他跟IDE 之间的匹配性并不是太好。
- 通常,编译器分为编译器前端和编译器后端。编译器前端主要负责的是展开预处理器宏定义 并将源代码转化为中间代码。编译器后端负责生成并优化机器代码。
- GCC实质上是一个后端编译器,他负责将源代码编译生成二进制代码。GCC 主要用来编译代码,而不是解析代码。这意味着苹果必须编写自己的解析器来为你提供调试功能。
- 另外,GCC 使用的是 GPL 许可协议,这使得苹果不能直使用GCC,除非苹果将Xcode 的许可协议更改为GPL。由于苹果的解析器和 GCC 的基准代码不同,GCC 和 Xcode 之间经常会出现一些不一致。
三、LLVM编译器组成
1.传统编译器分三个阶段:
前端(Frontend)– 优化器(Optimizer)– 后端(Backend)
2.llvm也分三个阶段,但是设计上略微的有些区别,提供了同一种中间表示
- 前端:词法分析,语法分析,语义分析,生成中间代码;
- 优化器:中间代码优化;
- 后端:生成机器码(比如生成Mach-o);
LLVM的优点在于,中间表示IR代码编写良好,而且不同的前端语言最终都转换成同一种的IR。优化器只对中间表示IR操作.
四、BitCode中间码
Xcode7开始,新建项目默认就打开了Bitcode设置
LLVM 是目前苹果采用的编译器工具链, Bitcode 是 LLVM 编译器的中间代码的一种编码。
LLVM的前端可以理解为C/C++/OC/Swift等编程语言,LLVM的后端可以理解为各个芯片平台上的汇编指令或者可执行机器指令数据,BitCode就是位于这两者直接的中间码
LLVM的编译工作原理是前端负责把项目程序源代码翻译成Bitcode中间码,然后再根据不同目标机器芯片平台转换为相应的汇编指令以及翻译为机器码.
这样设计就可以让LLVM成为了一个编译器架构,可以轻而易举的在LLVM架构之上发明新的语言(前端),以及在LLVM架构下面支持新的CPU(后端)指令输出,虽然Bitcode仅仅只是一个中间码不能在任何平台上运行,但是它可以转化为任何被支持的CPU架构,包括现在还没被发明的CPU架构
也就是说现在打开Bitcode功能提交一个App到应用商店,以后如果苹果新出了一款手机并CPU也是全新设计的,在苹果后台服务器一样可以从这个App的Bitcode开始编译转化为新CPU上的可执行程序,可供新手机用户下载运行这个App.
对应 iOS,bitcode 是可选的。
对于 watchOS,bitcode 是必须的。
Mac OS 不支持 bitcode。
五、Clang和LLVM关系
Clang:
- llvm项目的一个子项目;
- 基于llvm架构的c/c++/objective-c编码器前端;
clang 作为llvm编译器的前端,只负责对源代码词法分析,语法分析,语义分析,生成中间代码等功能,只是编译器的一部分。
Clang相比于GCC有什么优势呢?
其实,这也是Clang当初在设计开发的时候所主要考虑的原因。Clang是一个高度模块化开发的轻量级编译器,它的编译速度快、占用内存小、非常方便进行二次开发。
六、oc源文件的编译过程
LLVM编译一个源文件的过程:预处理 -> 词法分析 -> Token -> 语法分析 -> AST -> 代码生成 -> LLVM IR -> 优化 -> 生成汇编代码 -> Link -> 目标文件
- 0:导入源文件main.m的oc文件;
- 1:preprocessor 预编译过程,生成对于cpp输出文件;(词法分析,语法分析)
- 2:compiler编译,通过使用ir (中间代码LLVM Intermediate Representation (Bitcode)) 编译;
- 3:后端部分,生成对应的汇编代码;
- 4:汇编代码生成目标文件;
- 5:linker;
- 6:生成对于的二进制文件;
- 本文作者: Grx
- 本文链接: https://ruixiaoguo.github.io/Grx.github.io/Grx.github.io/2021/11/12/谈一谈LLVM编译器/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!