1. The LLVM Project is a collection of modular and reusable compiler and toolchain technologies,LLVM项目是模块化、可重用的编译器以及工具链技术的集合.LLVM并不是首字母的什么的缩写,它是项目的全名,它就叫做LLVM项目
Source Code ---> Frontend ---> Optimizer ---> Backend ---> machine Code
源代码 前端 优化器 后端 机器码
Frontend(前端): 词法分析、语法分析、语义分析、生成中间代码
Optimizer(优化器): 中间代码优化
Backend(后端): 生成机器码
不同的语言使用的前端编译器是不一样的 后端也是不一样的架构,但是中间的优化器是一样的
Fronted Optimizer Backend
C ---> Clang C/C++/Objc LLVM X86 Backend ---> X86
Fortran ---> llvm-gcc LLVM Optimizer LLVM PowerPC Backend ---> PowerPC
Haskell ---> GHC LLVM ARM Backend ---> ARM
不同的前端后端使用的都是统一的中间代码 LLVM Intermediate Representation (LLVM IR)
不管什么编程语言,不管编译器的前端是什么,只要是基于LLVM架构的,最终生成的中间代码格式都是LLVM IR
如果需要支持一种新的编程语言,那么只需要实现一个新的前端即可
如果需要支持一种新的硬件设备,那么只需要实现一个新的后端即可
优化阶段是一个通用的阶段,它针对的是统一的LLVM IR,不论是支持新的编程语言还是新的硬件设备,都不需要对优化阶段做修改
相比之前,GCC的前端和后端没分得太开,前端后端耦合在一起.所以GCC为了支持一门新的语言,或者支持新的设备,就变的很难, 因为GCC需要实现9个编译器,而LLVM只需要实现6个即可
LLVM现在被作为实现各种静态和运行时编译语言的通用基础结构(GCC、Java、.NET、Python、Ruby等)
Clang是LLVM项目的一个子项目. 是基于LVVM架构的C/C++/Objective-C编译器前端, 即Clang是属于LLVM架构的前端
编译速度快: Clang编译速度显著快过GCC
占用内存小: Clang生成的AST(语法树)占用的内存是GCC的五分之一
模块化设计: Clang采用基于库的模块化设计,易于IDE集成及其他用途的重用
诊断信息可读性强: 编译过程,clang创建并保留了大量的元数据,利于调试和
设计清晰简单,容易理解.易于扩展增强
LLVM架构
词法分析
语法分析
语意分析、生成中间代码 以上均属于Clang
|
代码优化 优化器
|
生成目标程序 后端
C/C++/OC ---> Frontend ---> IR ---> pass ---> IR ---> pass ---> IR ---> Backend ---> machine Code
clang ----------------------LLVM Proper------------------
广义的LLVM指的就是整个LLVM架构; 狭义的LLVM指的就是LLVM后端(代码优化、目标代码生成)
命令行查看编译的过程: clang -ccc-print-phases main.m
查看预处理的结果: clang -E main.m
swfit使用前端编译器swiftc,降级编译成IR,再通过后端编译器LLVM生成.o可执行文件
OC使用前端编译器Clang编译出IR,再通过后端编译器LLVM生成.o可执行文件
swift源码--->Parse--->AST--->Sema--->SILGen--->SIL--->IRGen--->IR--->LLVM--->*.o文件
Parse解析:swift源码通过词法分析、语法分析生成AST抽象语法树:xcrun swiftc -dump-ast main.swift
SILGen:生成swift中间语言,要在此阶段之后获得未优化的 SIL代码:xcrun swiftc -emit-silgen main.swift
SIL优化:对生成的SIL执行一些性能优化获取到SIL文件(类似OC探索中的cpp文件):xcrun swiftc -emit-sil main.swift
IRGen: 通过IRGen生成IR:xcrun swiftc -emit-ir main.swift
最终生成二进制代码
swiftc -h :查看swiftc有哪些命令
swiftc -dump-ast main.swift :语法和类型检查,打印AST语法树
swiftc -dump-parse main.swift :语法检查,打印AST语法树
swiftc -emit-ir main.swift :展示IR中间代码
swiftc -emit-sil main.swift :展示标准的SIL文件
swiftc -emit-silgen main.swift :展示原始SIL文件
swiftc -parse main.swift :解析文件
swiftc -print-ast main.swift :解析文件并打印(漂亮/简洁的)语法树
swiftc -emit-sil main.swift > ./main.sil :生成标准的SIL文件到指定的目录下
SIL文件中可能会混写一些数字字母的字符串(类似@$s4main6personAA7TeacherCvp),我们可以通过xcrun命令还原混写后的字符串
localhost:test1111111 baicai$ xcrun swift-demangle s4main6personAA7TeacherCvp
$s4main6personAA7TeacherCvp ---> main.person : main.Teacher
localhost:test1111111 baicai$