LLVM
百度百科
LLVM是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本。
LLVM 核心库提供了与编译器相关的支持,可以作为多种语言编译器的后台来使用。能够进行程序语言的编译期优化、链接优化、在线编译优化、代码生成。LLVM的项目是一个模块化和可重复使用的编译器和工具技术的集合。
优点:
- 语言无关的中间代码()
1、LLVM能够将不同的语言相互连结起来;也使得LLVM能够紧密地与IDE交互和集成。
2、发布中间代码而非目标代码能够在目标系统上更好地发挥其潜能而又不伤害可调试性(i.e. 在目标系统上针对本机的硬件环境产生目标代码,但又能够直接通过中间代码来进行行级调试)
这里再看看中间代码是个啥:
中间语言(中间代码)是一种面向语法,易于翻译成目标程序的源程序的等效内部表示代码。其可理解性及易于生成目标代码的程度介于源语言和目标语言之间。
中间语言与具体机器特性无关,一种中间语言可以为生成多种不同型号的目标机的目标代码服务。
可对中间语言进行与机器无关的优化,有利于提高目标代码的质量。
把源程序映射成中间代码表示,再映射成目标代码的工作分在几个阶段进行,使编译算法更加清晰
常用的中间语言有逆波兰表示、四元式、三元式和树表示。
mysql执行计划树我觉得就是树表示。
- 作为工具和函数库
使用LLVM提供的工具可以比较容易地实现新的编程语言的优化编译器或VM,或为现有的编程语言引入一些更好的优化/调试特性。
LLVM架构
不同的前端后端使用统一的中间代码LLVM IR。
如果需要支持一种新的编程语言,那么只需要实现一个新的前端。如果需要支持一种新的硬件设备,那么只需要实现一个新的后端。
优化阶段是一个通用的阶段,它针对的是统一的LLVM IR,不论是支持新的编程语言,还是支持新的硬件设备,都不需要对优化阶段做修改。
Codegen
来自知乎
CodeGen是在协同开发环境中工作的软件开发人员可以用来生成源代码的工具.在生成代码之前,开发人员必须声明定义如何创建给定源代码的规则。这些规则在模板文件中定义。CodeGen解释开发人员在模板文件中定义的代码和指令,以便生成有用的输出。CodeGen还需要另一个信息源来定义要生成的内容的上下文。
每次开发人员使用CodeGen生成代码时,他们通常提供两个主要信息:1. 元数据的来源,通常是存储库结构的名称。2. 定义要创建的内容的规则的模板文件的名称。每次CodeGen生成一个输出文件时,它通常做三件事:1. 从元数据源(通常是存储库结构)读取信息。2. 从模板读取规则。3. 将规则与元数据合并以创建输出文件。
那么显然上述的阐述并不能给我带来直观印象。
下面这个解释感觉更加直观。
Code Generator 是一个翻译框架,这个框架提供了把LLVM IR翻译到机器码或者汇编码的方法。
它总共包括六部分 :
- 抽象目标描述:描述机器的接口,不包含实现
- 用来生成对象的class:一些抽象的类可以表示任何目标机器的机器代码
- 用来描述目标文件层次的算法和类:表示汇编层次的构造,如标签、节、指令。
- 用来实现各阶段原生代码生成的算法
- 抽象目标接口描述的实现
- JIT
总的来说就是目标机器的描述以及机器代码的表示。
参考文献
LLVM - 百度百科
让你理解什么是LLVM
https://llvm.liuxfe.com/ The LLVM
Target-Independent Code Generator
LLVM Code Generator
知乎一篇文章