美文网首页
LLVM编译原理

LLVM编译原理

作者: 史记_d5da | 来源:发表于2020-05-17 22:09 被阅读0次

LLVM简介

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

LLVM最早的时候是Illinois的一个研究项目,主要负责人是Chris Lattner,他现在就职于Apple. Apple 目前也是llvm项目的主要赞助者之一。

在理解LLVM时,我们可以认为它包括了一个狭义的LLVM和一个广义的LLVM。广义的LLVM其实就是指整个LLVM编译器架构,包括了前端、后端、优化器、众多的库函数以及很多的模块;而狭义的LLVM其实就是聚焦于编译器后端功能(代码生成、代码优化、JIT等)的一系列模块和库。

LLVM优势

传统编译器分三个阶段:
前端(Frontend)-- 优化器(Optimizer)-- 后端(Backend)


20181112154224801.png

llvm也分三个阶段,但是设计上略微的有些区别, LLVM不同的就是对于不同的语言它都提供了同一种中间表示:


20181112154224981.png
前端可以使用不同的编译工具对代码文件做词法分析以形成抽象语法树AST,然后将分析好的代码转换成LLVM的中间表示IR(intermediate representation);中间部分的优化器只对中间表示IR操作,通过一系列的pass对IR做优化;后端负责将优化好的IR解释成对应平台的机器码。LLVM的优点在于,中间表示IR代码编写良好,而且不同的前端语言最终都转换成同一种的IR。
为什么使用三段式设计?优势在哪里?首先解决一个很大的问题:假如有N种语言(C、OC、C++、Swift...)的前端,同时也有M个架构(模拟器、arm64、x86...)的target,是否就需要N*M个编译器?三段式架构的价值就提现出来了,通过共享优化器的中转,很好的解决了这个问题。

Clang和LLVM关系

Clang是一个C++编写、基于LLVM、发布于LLVM BSD许可证下的C/C++/Objective-C/Objective-C++编译器。那么为什么已经有了GCC还要开发Clang呢?Clang相比于GCC有什么优势呢? 其实,这也是Clang当初在设计开发的时候所主要考虑的原因。Clang是一个高度模块化开发的轻量级编译器,它的编译速度快、占用内存小、非常方便进行二次开发。


579007-20160804225753028-971554834.png

其实,对应到这个图中,LLVM与Clang是C/C++编译器套件。对于整个LLVM的框架来说,包含了Clang,因为Clang是LLVM的框架的一部分,是它的一个C/C++的前端。Clang使用了LLVM中的一些功能,目前知道的就是针对中间格式代码的优化,或许还有一部分生成代码的功能。从源代码角度来讲,clang是基于LLVM的一个工具。而功能的角度来说,LLVM可以认为是一个编译器的后端,而clang是一个编译器的前端,他们的关系更加的明了,一个编译器前端想要程序最终变成可执行文件,是缺少不了对编译器后端的介绍的。

LLVM编译工具链编译流程

使用LLVM的对一门语言编译的简图如下所示


20160902192748463.png

LLVM编译一个源文件的过程:预处理 -> 词法分析 -> Token -> 语法分析 -> AST -> 代码生成 -> LLVM IR -> 优化 -> 生成汇编代码 -> Link -> 目标文件
完全需要我们手工,或者依靠其他工具如lex, yacc来做的事情,是从源代码到token的词法分析和从token到AST的语法分析;词法分析的输出是将源代码解析成一个个的token。这些token就是有类型和值的一些小单元,比如是关键字,还是数字,还是标识符,从AST转LLVM开始,LLVM就开始提供一系列的工具帮助我们快速开发。从IR(中间指令代码)到DAG(有向无环图)再到机器指令,针对常用的平台,LLVM有完善的后端。也就是说,我们只要完成了到IR这一步,后面的工作我们就享有和Clang一样的先进生产力了。
CodeGen负责将语法树从顶至下遍历,翻译成LLVM IR,LLVM IR是Frontend的输出,也是LLVM Backerend的输入,桥接前后端。

相关文章

  • iOS-底层原理 31:LLVM编译流程 & Clang插件开发

    iOS-底层原理 31:LLVM编译流程 & Clang插件开发 本文主要是理解LLVM的编译流程以及clang插...

  • LLVM编译原理

    LLVM简介 LLVM是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程...

  • LLVM架构-编译原理

    什么是LLVM LLVM项目是模块化、可重用的编译器以及工具链技术的集合 The LLVM Project is ...

  • 二十五、LLVM

    什么是编译器 LLVM概述 LLVM案例体验 LLVM源码 & 编译流程 1 什么是编译器? 1.1 Python...

  • LLVM初探

    编译 想必都知道,那么LLVM是什么?LLVM是一种编译器!LLVM编译流程是怎么样的?本篇就LLVM进行初探 首...

  • 对LLVM和跨平台的理解

    广义 LLVM 架构包括编译前端 + 中间优化 + 编译后端; 狭隘 LLVM 指的就是中间优化 + 编译后端; ...

  • Hello Trust App(高通)

    CP代码下载 CP代码编译方法 交叉编译工具下载 在高通网站上下载llvm, llvm编译器版本,可以在llvm....

  • vim YouCompleteMe(YCM) llvm编译配置

    编译环境及源码版本 cmake-3.12.0llvm-4.0.1vim-81 一. llvm-clang 编译安装...

  • 初识LLVM&Clang-开发Xcode插件

    初识LLVM&Clang-开发Xcode插件 LLVM Xcode现在使用的编译器就是LLVM。LLVM比以前使用...

  • LLVM、Clang 、dyld

    LLVM LLVM是iOS目前的构架编译器的框架系统,LLVM会对每个文件进行编译,生成 Mach-O(可执行文件...

网友评论

      本文标题:LLVM编译原理

      本文链接:https://www.haomeiwen.com/subject/qalfohtx.html