随笔 - 48  文章 - 0  评论 - 0  阅读 - 11728

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   suanningmeng98  阅读(144)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示