LLVM与Codegen技术
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
知乎一篇文章
LLVM与Codegen技术相关推荐
- 编译优化 | LLVM代码生成技术详解及在数据库中的应用
简介:作者:长别 1. 前言 随着IT基础设施的发展,现代的数据处理系统需要处理更多的数据.支持更为复杂的算法.数据量的增长和算法的复杂化,为数据分析系统带来了严峻的性能挑战.近年来,我们可以在数据库 ...
- 使用Flex Bison 和LLVM编写自己的编译器[zz]
1.介绍 我总是对编译器和语言非常感兴趣,但是兴趣并不会让你走的更远.大量的编译器的设计概念可以搞的任何一个程序员迷失在这些概念之中.不用说,我也曾 今尝试过,但是并没有取得太大的成功,我以前的尝试都 ...
- 使用 LLVM 实现一个简单编译器
作者:tomoyazhang,腾讯 PCG 后台开发工程师 1. 目标 这个系列来自 LLVM 的Kaleidoscope 教程,增加了我对代码的注释以及一些理解,修改了部分代码.现在开始我们要使用 ...
- 全图化引擎(AI·OS)中的编译技术
全图化引擎又称算子执行引擎,它的介绍可以参考从HA3到AI OS -- 全图化引擎破茧之路.本文从算子化的视角介绍了编译技术在全图化引擎中的运用.主要内容有: 1. 通过脚本语言扩展通用算子上的用户订 ...
- Keil 编译器AC6中的LLVM编译原理
关注+星标公众号,不错过精彩内容 作者 | strongerHuang 微信公众号 | 嵌入式专栏 Keil MDK中使用的是Arm编译器(Arm Compiler),目前主要是AC5和AC6. 而A ...
- Spark-SQL性能极致优化: Native Codegen Framework
EMR团队探索并开发了SparkSQL Native Codegen框架,为SparkSQL换了引擎,新引擎带来最高4倍性能提升,为EMR再次获取世界第一立下汗马功劳.来自阿里云EMR团队的周克勇将详 ...
- 【LLVM】内存计算引擎之Llvm
目录 概述 LLVM技术生态之编译器 一.传统编译器的设计 二.传统编译器模式的实现 三.LLVM的三段式实现 四.LLVM's Code Representation:LLVM IR 1.IR的表现 ...
- LLVM的源码目录结构
这是从我<一份关于各种安装LLVM的方法的总结>中分支出来的.因为这个内容写进那一篇会太杂乱. 还是以翻译+自己总结的形式写出来,官网上介绍的东西太好了. 还不完善,会持续更新其中的内容, ...
- 海量智库第5期|Vastbase G100核心技术介绍之「SQL by pass技术」
导语 SQL by pass的主要作用是针对某些简单的SQL生成的查询计划.如果查询计划是一个符合特定条件的查询计划,那么可以跳过原有迭代器模型的执行步骤,直接执行查询计划,将原有查询计划的初始化.执 ...
最新文章
- python学习随笔(七)_函数
- 论文大盘点|卷积神经网络必读的100篇经典论文,包含检测/识别/分类/分割多个领域...
- 通信与信号处理杂文目录
- 【Flutter】FutureBuilder 异步编程 ( FutureBuilder 构造方法 | AsyncSnapshot 异步计算 )
- 危机下,你还敢提加薪吗?
- unity 敌人自动攻击和寻路_【A*Pathfinding】超级简单的Unity2D寻路
- 哈工大未来计算机院士,2017年中国高校新增工程院院士名单出炉,哈工大依然很强!...
- HTML section元素
- jdbc 连接 mysql 的字符串
- 什么是 DevSecOps?系列(一)
- OpenCV C++案例实战二十《银行卡号识别》
- 【高等数学笔记】拉格朗日乘数法(Lagrange Multiplier Method):其实也没那么难嘛
- 鹤林全集·闲情志友 | 第一篇——阿鑫
- 解读 | 自监督视觉特征学习综述
- 股权的秘密:如何把握公司的控制权
- 文献阅读笔记 | Reconstructing commuters network using machine learning and urban indicators
- VideoPlayer视频播放
- 什么是单点故障【转载】
- 【飞凌嵌入式 OK3399-C+开发板试用体验】开箱上电
- 数制和码制(数制的转换的方法,BCD码<8421,2421,5421,余三码>,格雷码,原码,反码,补码,定点数和浮点数)