对LLVM的认识与理解(LLVM与传统编译器对比)

一些写在前面的基础概念

LLVM( Lower Level Virtual Machine):是一个编译器(编译器就是把人类可读的
高级语言映射到机器执行码)基础框架、是模块化和可重用的编译器和工具链技术的集合。

LLVM的代码有 3种表示形式:内存编译器中的IR(intermediate representation  中间代码)、存于磁盘的bitcode(也称为字节码——bytecode,由两部分组成:位流bitstream,可类比字节流,以及将 LLVM IR 编码成位流的编码格式。),以及用户可读的汇编码。

交叉编译技术:所谓交叉编译,指的是我们能够在一个平台(例如 x86)编译并构建二进制文件,而在另一个平台(例如 ARM)运行。编译二进制文件的机器称为主机(host),而运行生成
的二进制文件的平台我们称为目标平台(target)。为相同平台(主机与目标机器相同)编
译代码我们称为本机编译(native assembler),而当主机与目标机器为不同平台时编译代码
则称为交叉编译(cross-compiler)。

上下文无关语法:Context-Free Grammar(CFG),X >= Y,X 可以被 Y 替换,而无须考虑 X 的上下文,在这里 X 是一个非终结符。与之对应的是上下文相关语法,aX >= Y, bX >= Z,在不同的推导规则中 X具有不同的语义,因此称之为上下文相关语法。

非终结符号:在形式语言中,非终结符号指的是,根据推导规则,可以被其他符号替换的符号。

终结符号:在形式语言中,终结符号是语言的基本符号,它不可以被分解或替换。也就是说推导到终结符号时推导过程便终结了。

抽象语法树: AST是一门编程语言源码的抽象语法结构的树形表示。各种语言组件,例如表达式、条件控制语句等,都有相应的 AST,并被区分为操作符和操作数。AST 并不表示这些代码如何由语法生成,而是表达了语言组件之间的关系。AST 忽略了一些无关紧要的元素,例如标点符号、定界符(通常是空格、换行)。AST 中的每个元素都会有一些附加的属性,在之后的编译阶段会有一定作用。例如,源码行号信息就是这样一个属性,在进行语法检查遇到语法错误时就可以输出错误代码的行号信息(在 C++的 Clang 前端中,位置、行号、列号等信息以及其他相关属性由 SourceManager 类的一个对象存储)。
 

传统编译器VSLLVM

传统编译器结构:  前端---->优化/中端---->后端

详解:传统编译器的前端主要负责对输入的源代码进行分析(eg:检查语法错误、判断各种词义类型、构建AST(抽象语法树));中端即优化,对前端处理过的源代码进行一些优化;最终由后端生成可执行的机器码。(一对一)

 LLVM结构: 多前端---->优化/中端---->多后端

详解:LLVM前端支持多种格式源代码作为输入,输入后会对源代码进词义分析、语义分析形成AST等形成IR,IR作为中端即优化的输入;当中端收到前端发来的IR后,通过LLVM的opt模块使用各种pass(pass为各种优化模块)(LLVM学习之OPT工具_What’sman 的博客-CSDN博客)等,实现对IR的各种优化;后端对优化好的IR进行合适的解释生成对应平台的机器码。(可以实现交叉编译)(多对多)

 结论:由此对比可以看出LLVM相较于传统编译器,LLVM支持多种格式语言作为前端语言输入,经过其优化器对前端语言进行各种可选择的优化,其中优化pass还可以自定义设计;将优化后的IR传给合适的后端输出合适的机器码。不仅支持多种源码输入还支持多种机器码输出,实现交叉编译。

LLVM编译过程详情

LLVM编译过程:预处理 ----> 词法分析 ----> Token ----> 语法分析 ----> AST ----> 代码生成 ----> LLVM IR ----> 优化 ----> 目标文件

        1.预处理——>词法分析

                主要是传入源代码。        

        2.词法分析——>token——>语法分析

                词法分析往往是编译程序的第一步,词法分析器把程序代码的输入流切分成token。通常来说,被解析成token的语言是基于上下文无关语法的。一个token可以是一个字符串,由一个或多个同一范畴的字符组成。对输入字符流构建成token的过程称为符号化(tokenization)。为了把输
入的字符分组成token,还需要有特定的定界符。对于词法分析来说,有自动化的词法分析工具来完成这个工作,比如LEX。

                语法分析器(parser)根据语言的语法规则来解析代码,解析阶段决定了输入的代码是否能够根据既定的语法组成token流。在此阶段会构造出一棵解析树,而语法分析器则会定义一些函数来把代码组织成一种被称为AST的数据结构。

        3.语法分析——>AST——>代码生成

                语法分析器接受这些token并把token流构建成AST。AST 中的每个元素都会有一些附加的属性,在之后的编译阶段会有一定作用。例如,源码行号信息就是这样一个属性,在进行语法检查遇到语法错误时就可以输出错误代码的行号信息(在 C++的 Clang 前端中,位置、行号、列号等信息以及其他相关属性由 SourceManager 类的一个对象存储)。AST 的使用集中在语义分析阶段,在这个阶段,编译器会检查程序和语言元素是否正确使用。此外,在语义分析阶段编译器还会基于 AST 生成符号表。完整的树遍历允许验证程序的正确性。在验证正确后,AST 还是代码生成的基础。

        4.AST——>代码生成——> LLVM IR——> 优化

                现在所有必要信息都存储于AST这一数据结构中,下一阶段即是从AST生成LLVM IR。
在代码生成的过程中我们需要使用 LLVM 的 API,通过 LLVM 内建的 API 可以生成预定义格式的 LLVM IR。

                LLVM 提供了多种多样的优化 Pass,并且允许第三方编译器实现来决定使用哪些优化,及优化的顺序等。 LLVM IR主要通过通过LLVM的opt模块使用各种pass(pass为各种优化模块)(LLVM学习之OPT工具_What’sman 的博客-CSDN博客)等,实现对IR的各种优化。

        5.优化——> 目标文件(之后进行详细补充)

更多详情可阅看《Mayur Pandey_ Suyog Sarda_ 王欢明 - LLVM Cookbook 中文版-电子工业出版社 (2016)》

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

What’smean

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值