LLVM和iOS文件编译过程

编译器背景

GCC

LLVM和iOS文件编译过程_第1张图片
image

LLVM

LLVM比gcc的优势是模块化,中间端都是统一的,添加新的语言的话,只需要添加一个新的前端就行

LLVM和iOS文件编译过程_第2张图片
image

Clang

clang是LLVM的子项目,是LLVM架构里C族编译器的前端


LLVM和iOS文件编译过程_第3张图片
image

对比GCC优点:

  • 编译速度快
  • 占用内存小,clang生成的语法树(AST)是GCC的五分之一左右
  • 诊断信息丰富准确
  • 模块化,容易拓展

OC文件的编译过程

#import "Person.h"
#import 

@implementation Person

- (void)test {
    UIApplication *app = [UIApplication sharedApplication];
    UIView *statusBar = [app valueForKey :@"statusBar"];
    NSLog(@"%@", statusBar);
}

@end

终端输入clang -ccc-print-phases Person.m,可以查看编译过程

LLVM和iOS文件编译过程_第4张图片
image
  1. 找到这个文件

  2. 预处理,替换import,include,宏定义

    终端输入clang -E Person.m,可以查看预处理结果

  3. 词法分析,生成token,后面的loc代表行号和第几个字符

    终端输入clang -fmodules -E -Xclang -dump-tokens Person.m

LLVM和iOS文件编译过程_第5张图片
image
  1. 语法分析,token拼接,生成语法树(AST)

    终端输入clang -fmodules -fsyntax-only -Xclang -ast-dump Person.m

LLVM和iOS文件编译过程_第6张图片
image
  1. 生成中间代码,IR
    LLVM IR有3种表现形式

    • text,便于阅读的文本格式,类似汇编,拓展名为.ll,clang -S -emit-llvm main.m
    • memory,内存格式
    • bitcode,二进制格式,拓展名为.bt,clang -c -emit-llvm main.m
  2. 汇编

  3. 链接

  4. 转成目标可执行文件

你可能感兴趣的:(LLVM和iOS文件编译过程)