简介LLVM

LLVM是一个编译器基础设施项目,最初以C++编写,现支持多种编程语言。它不仅是一个底层虚拟机,而是一个包含了LLVM Core、Clang、LLDB等多个子项目的编译器框架。作为iOS开发者的常用工具,LLVM逐步取代了GCC,其编译过程涉及前端(如Clang)、优化器(LLVM Core)和后端。前端负责词法和语法分析,生成AST语法树,后端则生成汇编和目标文件。
部署运行你感兴趣的模型镜像

 

LLVM到底是什么?

维基百科解释

LLVM是一个自由软件项目,它是一种编译器基础设施,以C++写成。它是为了任意一种编程语言而写成的程序,利用虚拟技术创造出编译时期链接时期运行时期以及“闲置时期”的最优化。它最早以C/C++为实现对象,而目前它已支持包括ActionScriptAdaD语言FortranGLSLHaskellJava字节码、Objective-CSwiftPythonRubyRustScala以及C#等语言。

个人理解

LLVM的全称是Low Level Virtual Machine,翻译过来是底层虚拟机.是项目早期的一个目标,如果大家通过这个思路去理解LLVM的话,会带来一定的困扰.而经十几年的发展项目早就远远超出了当时初期的目标.而现在的LLVM更多的是一个项目的名字,一个品牌与其字面意思没有太多的关系.

更准确的说LLVM是一个编译器框架,也是一个项目包含了我们熟知的工具,比如LLVM Core,Clang,LLDB,libc++和 libc++ ABI,compiler-rt等子项目.

最为一个iOS开发者,接触最多的应该GCC和LLVM两个编译器.历史上苹果首先使用的是GCC,是由GNU一个开源的非赢利组织开发的,随着iOS不断发展难以满足苹果日益庞大的需求.这个时候苹果决定自己干.然后就慢慢使用LLVM替代了GCC.

大致的过程为:

Xcode3之前,用的是GCC;
Xcode3,GCC仍然保留,但是也推出了LLVM,苹果推荐LLVM-GCC混合编译器,但还不是默认编译器; 
Xcode4,LLVM-GCC成为默认编译器,但GCC仍保留; 
Xcode4.2,LLVM3.0成为默认编译器,纯用GCC不复可能;
Xcode4.6,LLVM升级到4.2版本;
Xcode5,LLVM-GCC被遗弃,新的编译器是LLVM5.0,从GCC过渡到LLVM的时代正式完成。

到底什么是编译器?

广义的编译器概念就是将一种语言翻译成另一种语言.而我们接触的最多的就是将OC代码最终翻译成可执行的二进制代码.

那编译器是怎么做的呢?现代编译器主要分为三个部分,前端就是我们总是提到的Clang,优化器也是LLVM比较核心的优势 LLVM Core(也称opt),后端.

LLVM不止可以对OC代码在x86和arm架构上进行编译,凡是符合框架的组件都是可以使用LLVM进行编译.

LLVM到底都干了什么?

前端

预编译

词法分析

语法分析->生成AST语法树

语义分析->生成IR

优化器

优化 -> 输出IR

后端

生成汇编

生成目标文件

什么是AST语法树?

一段代码

代码块

int square(int num) {
  return num * num;
}
int main() {
  int result = square(2);
}

执行命令

代码块

clang -Xclang -ast-dump -fsyntax-only test.c

得到输出

代码块

|-FunctionDecl 0x7fba89859e30 <test.c:1:1, line:3:1> line:1:5 used square 'int (int)'
| |-ParmVarDecl 0x7fba89814960 <col:12, col:16> col:16 used num 'int'
| `-CompoundStmt 0x7fba89859fb8 <col:21, line:3:1>
|   `-ReturnStmt 0x7fba89859fa8 <line:2:2, col:15>
|     `-BinaryOperator 0x7fba89859f80 <col:9, col:15> 'int' '*'
|       |-ImplicitCastExpr 0x7fba89859f50 <col:9> 'int' <LValueToRValue>
|       | `-DeclRefExpr 0x7fba89859f10 <col:9> 'int' lvalue ParmVar 0x7fba89814960 'num' 'int'
|       `-ImplicitCastExpr 0x7fba89859f68 <col:15> 'int' <LValueToRValue>
|         `-DeclRefExpr 0x7fba89859f30 <col:15> 'int' lvalue ParmVar 0x7fba89814960 'num' 'int'
`-FunctionDecl 0x7fba8985a020 <line:5:1, line:7:1> line:5:5 main 'int ()'
  `-CompoundStmt 0x7fba8985a1f8 <col:12, line:7:1>
    `-DeclStmt 0x7fba8985a1e0 <line:6:2, col:24>
      `-VarDecl 0x7fba8985a0d0 <col:2, col:23> col:6 result 'int' cinit
        `-CallExpr 0x7fba8985a1b0 <col:15, col:23> 'int'
          |-ImplicitCastExpr 0x7fba8985a198 <col:15> 'int (*)(int)' <FunctionToPointerDecay>
          | `-DeclRefExpr 0x7fba8985a130 <col:15> 'int (int)' Function 0x7fba89859e30 'square' 'int (int)'
          `-IntegerLiteral 0x7fba8985a150 <col:22> 'int' 2

参考https://www.eryige.com/forum.php?mod=viewthread&tid=457&page=1&extra=#pid1997

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值