IOS-LLVM

一、LLVM概述

LLVM(Low Level Virtual Machine)是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本。

LLVM计划启动于2000年,最初由美国UIUC大学的Chris Lattner博士主持开展。2006年Chris Lattner加盟Apple Inc.并致力于LLVM在Apple开发体系中的应用。Apple也是LLVM计划的主要资助者。LLVM已经被Apple、Microsoft、Google、Facebook等各大公司采用。

二、LLVM的设计

当编译器支持多种源语言或者多种硬件架构的时候,LLVM的重大作用就体现出现了,他通过使用通用的IR代码,将源语言(C/C++,java等等)和多种硬件结构(X86、arm64等等)分离,使得他的用途广泛。

2.1 编译的过程大致可以分为三个部分:

1.编译器前端:经过词法分析、语法分析、语义分析,最后生成IR中间代码
2.优化器:对中间代码进行优化
3.编译器后端:生成指定架构模式的二进制文件

三、clang编译器

1.clang编译器是LLVM项目中的一个子项目,他诞生之初是为了取代GCC,提供更快的编译速度
2.他负责C、C++、OC的编译,属于编译器前端。
3.swift是swift编译器编译的

四、编译过程

我们以下面这段代码为例子:

#import <stdio.h>

#define A 10

int main(int argc, const char * argv[]) {
    printf("%d",A + 20);
    return 0;
}

4.1 打印源码的编译阶段:

//打印信息:
clang -ccc-print-phases main.m

0.读取源码文件
1.预处理阶段
2.编译阶段,生成ir代码
3.后端, 生成汇编代码
4.通过汇编代码生成目标文件
5.目标文件通过链接,生成镜像
6.通过不同的架构模式,生成该架构模式下的可执行文件

4.2 预处理阶段

//预处理也叫 预编译 ,处理代码里面#开头的代码,替代宏,删除注释,展开头文件
clang -E main.m

4.3 编译阶段

4.3.1 词法分析

//预处理阶段完成后,就会进行词法分析,把代码切割成一个一个Token
clang -fmodules -fsyntax-only -Xclang -dump-tokens main.m

4.3.2 语法分析

//词法分析之后就会进行语法分析,主要目的是为了检查代码语法正确,然后会生成抽象语法树(AST)
clang -fmodules -fsyntax-only -Xclang -ast-dump main.m

4.3.3 生成中间代码IR

//代码生成器 从上到下遍历抽象语法树,翻译成IR,生成.ll文件
clang -S -fobjc-arc -emit-llvm main.m
OC的代码会在这一步完成runtime的桥接:property合成,ARC处理等。

4.3.3.1 IR的一些基本语法

4.3.3.2 IR的优化

//LLVM的优化级别分为 -O0、-O1、-O2、-O3、-Os
clang -Os -S -fobjc-arc -emit-llvm main.m -o main.ll

也可以通过Xcode的optimization Level选择中之间选择:

4.3.3.3 bitCode 是IR的另一种表现形式

//开启bitCode苹果会做进一步优化,生成.bc的中间代码,我们通过优化后的IR代码生成.bc代码
clang -emit-llvm -c main.ll -o main.bc

这里也可以在Xcode 的bitCode中直接获取;一些第三方库不支持bitCode,所以这部分的使用一般都是关闭的。

4.4 生成汇编代码

//我们通过之前步骤生成的.ll 文件或者 .bc文件生成汇编代码
  clang -S -fobjc-arc main.bc -o main.s
  clang -S -fobjc-arc main.ll -o main.s
//生成的汇编代码同样可以优化
clang -Os -S -fobjc-arc main.m -o main.s

4.5 生成目标文件

//汇编代码转化为机器代形成目标文件
clang -fmodules -c main.s -o main.o

4.6 链接

//链接器把编译产生的目标文件和库文件(.dylib,.a)生成Mach-O文件
clang main.o -o main

五、总结

编译的基本过程:
源代码->预编译->编译->汇编->链接->可执行文件
posted on 2022-06-17 11:13  suanningmeng98  阅读(140)  评论(0编辑  收藏  举报