mirror of
https://github.com/NohamR/knowledge-kit.git
synced 2026-05-24 20:00:37 +00:00
docs: refine
This commit is contained in:
102
Chapter1 - iOS/1.102.md
Normal file
102
Chapter1 - iOS/1.102.md
Normal file
@@ -0,0 +1,102 @@
|
||||
# LLVM
|
||||
|
||||
[LLVM](https://llvm.org/) 项目是模块化、可重用的编译器以及工具链技术的集合
|
||||
|
||||
> The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.
|
||||
|
||||
## 结构
|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
LLVM 由三部分构成:
|
||||
|
||||
- FrontEnd(前端):词法分析、语法分析、语义分析、生成中间代码
|
||||
|
||||
- Optimizer(优化器):优化中间代码
|
||||
|
||||
- Backend(后端):生成目标程序(机器码)
|
||||
|
||||

|
||||
|
||||
正是由于这样的设计,使得 LLVM 具备很多有点:
|
||||
|
||||
- 不同的前端后端使用统一的中间代码 LLVM Intermediate Representation (LLVM IR)
|
||||
|
||||
- 如果需要支持一种新的编程语言,那么只需要实现一个新的前端
|
||||
|
||||
- 如果需要支持一种新的硬件设备,那么只需要实现一个新的后端
|
||||
|
||||
- 优化阶段是一个通用的阶段,它针对的是统一的LLVM IR,不论是支持新的编程语言,还是支持新的硬件设备,都不需要对优化阶段做修改
|
||||
|
||||
- 相比之下,GCC 的前端和后端没分得太开,前端后端耦合在了一起。所以 GCC 为了支持一门新的语言,或者为了支持一个新的目标平台,就
|
||||
变得特别困难
|
||||
|
||||
LLVM现在被作为实现各种静态和运行时编译语言的通用基础结构(GCC家族、Java、.NET、Python、Ruby、Scheme、Haskell、D等)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## Clang
|
||||
|
||||
[Clang](http://clang.llvm.org/) 是 LLVM 的一个子项目,基于 LLVM 架构的 c/c++/Objective-C 语言的编译器前端
|
||||
|
||||
GCC 是 c/c++ 等的编译器
|
||||
|
||||
Clang 相较于 GCC,具备下面优点:
|
||||
|
||||
- 编译速度快:在某些平台上,Clang的编译速度显著的快过GCC(Debug模式下编译OC速度比GGC快3倍)
|
||||
|
||||
- 占用内存小:Clang 生成的 AST 所占用的内存是 GCC 的五分之一左右
|
||||
|
||||
- 模块化设计:Clang 采用基于库的模块化设计,易于 IDE 集成及其他用途的重用
|
||||
|
||||
- 诊断信息可读性强:在编译过程中,Clang 创建并保留了大量详细的元数据 (metadata),有利于调试和错误报告
|
||||
|
||||
- 设计清晰简单,容易理解,易于扩展增强
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
### 查看编译过程
|
||||
|
||||
```shell
|
||||
clang -ccc-print-phases main.m
|
||||
```
|
||||
|
||||
对 main.m 文件
|
||||
|
||||

|
||||
|
||||
可以看到经历了:输入、预处理、编译、LLVM Backend、汇编、链接、绑定架构7个阶段。
|
||||
|
||||
|
||||
|
||||
查看 preprocessor (预处理)的结果:`clang -E main.m`。预处理主要做的事情就是头文件导入、宏定义替换等。
|
||||
|
||||
词法分析,生成 Token:`clang -fmodules -E -Xclang -dump-tokens main.m`
|
||||
|
||||
```c
|
||||
#import <Foundation/Foundation.h>
|
||||
int main(int argc, const char * argv[]) {
|
||||
int a = 1;
|
||||
int b =2;
|
||||
int c = a + b;
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
语法分析,生成语法树(AST,Abstract Syntax Tree):`clang -fmodules -fsyntax-only -Xclang -ast-dump main.m`
|
||||
|
||||

|
||||
|
||||
### LLVM IR
|
||||
|
||||
|
||||
Reference in New Issue
Block a user