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
知乎一篇文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377000.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

跟乌克兰人学编程1

今天要Disable一个菜单,工程项目多,不容易找。 乌克兰人建议我用Spy,将靶拖到目标窗体上就可以看到类名。转载于:https://www.cnblogs.com/SunWentao/archive/2012/12/19/2825220.html

html网页转图片_HTML图片

html网页转图片HTML图片 (HTML Images) Images are visuals of something that look elegant. In web pages, images are used to create a good and appealing design. 图像是外观精美的视觉效果。 在网页中&#xff0c;图像用于创建良好且吸引人的设计。 The <img> ta…

Android学习拾遗

1. java中的flush()作用&#xff1a;强制将输出流缓冲区的数据送出。 2. 文件存储&#xff1a; 存储到内部&#xff1a;另外使用一个class实现&#xff0c;最开始初始化用了this,后来放在这里不合适&#xff0c;改成了带参数的构造方法。 包括存储、读取、追加 读取&#xff1a…

OLAP 技术之列式存储与数据压缩(快查询方法之一)

前言 列式存储和数据压缩&#xff0c;对于一款高性能数据库来说是必不可少的特性。一个非常流行的观点认为&#xff0c;如果你想让查询变得更快&#xff0c;最简单且有效的方法是减少数据扫描范围和数据传输时的大小&#xff0c;而列式存储和数据压缩就可以帮助我们实现上述两…

sql 视图嵌套视图_SQL视图

sql 视图嵌套视图SQL | 观看次数 (SQL | Views) Views in SQL are virtual tables. A view also has rows and columns as theyre during a real table within the database. We will create a view by selecting fields from one or more tables present within the database.…

Postgresql多线程hashjoin(inner join)

pg hashjoin 节点大致步骤&#xff1a; 1、分块与分桶。对一个表hash时&#xff0c;确定块数和桶数量。&#xff08;一块被划分为10个元组的桶&#xff09;确定分块号与分桶号是由hashvalue决定的。 2、执行&#xff1a; 1、顺序获取S表中所有元组&#xff0c;对每一条元组Has…

iframe实现局部刷新和回调--开篇

今天做项目遇到一个问题。就是提交表单的时候&#xff0c;验证用户名是否存在和验证码是否正确。 当验证码或者用户名存在的时候。在后台弹窗提示。可页面原本file里面符合要求的值刷新没了。用户体验不好。因为用ifream刷新技术已不是什么新鲜技术。所以网上有大把的资料可参考…

Java文件类boolean setExecutable(boolean exec_file,boolean owner_access)方法,带示例

文件类boolean setExecutable(boolean exec_file&#xff0c;boolean owner_access) (File Class boolean setExecutable(boolean exec_file , boolean owner_access)) This method is available in package java.io.File.setExecutable(boolean exec_file , boolean owner_acc…

OLTP 系统和 OLAP 系统的核心设计思想

关于 OLTP 系统和 OLAP 系统的核心设计思想 数据存储系统的关于查询的典型操作&#xff1a; -- 第一种需求&#xff1a; 根据 key&#xff08;1&#xff09; 找 value&#xff08;name,age&#xff09;&#xff0c; 单点查询 select name, age from student where id 1; stu…

虚拟机

vt-x 虚拟技术的硬盘支持。想像成“硬解码”的东东。不是装虚拟机必须的&#xff0c;但有它效果会好些。 vt-x检测工具&#xff1a;securable.exe 下载地址&#xff1a;http://pan.baidu.com/s/1kTBOvzD Hardware Virtualization选项&#xff1a; no [CPU和BIOS都不支持VT] loc…

算法(转)

欢迎自荐和推荐链接。 算法 优秀博客推荐&#xff1a;各种数据结构与算法知识入门经典&#xff08;不断更新)基本算法 贪心算法&#xff1a;贪心算法 作者&#xff1a;独酌逸醉 贪心算法精讲 作者&#xff1a;3522021224 递归和分治&#xff1a;递归与分治策略 …

sjf调度算法_如何通过静态方法预测SJF调度中未来过程的突发时间?

sjf调度算法In SJF Scheduling, CPU is assigned to the process having the smallest burst time but it can not be implemented practically, because we dont know burst time of the arrived processes in advance. 在SJF Scheduling中 &#xff0c;将CPU分配给具有最短突…

flask 知识点总结

request对象的常用属性具体使用方法如下:request.headers, request.headers.get(If-None-Match)request.json, request.json[value] 或 request.json.get(detail_msg, "")request.args, request.args.get(limit, 10)来获取query parametersrequest.form, request.for…

Postgresql中的hybrid hash join(无状态机讲解)

hybrid hash join hybrid hash join是基于grace hash join 的优化。 在postgresql中的grace hash join 是这样做的&#xff1a;inner table太大不能一次性全部放到内存中&#xff0c;pg会把inner table 和outer table按照join的key分成多个分区&#xff0c;每个分区(有一个inn…

末日中的黎明

哈哈&#xff0c; 今天是2012-12-21&#xff0c;传说中的世界末日&#xff0c;不过现在看来&#xff0c;一切都是空的。。。 在这个容易记忆的日子里&#xff0c;我的博客开通了。他将伴随我以后的学习开发&#xff0c;期望我能充分利用博客&#xff0c;帮我养成常总结、常记笔…

使用numpy.tanh()打印矢量/矩阵元素的双曲正切值 使用Python的线性代数

Prerequisite: 先决条件&#xff1a; Defining a Vector 定义向量 Defining a Matrix 定义矩阵 Numpy is the library of function that helps to construct or manipulate matrices and vectors. The function numpy.tanh(x) is a function used for generating a matrix / v…

Mahout kmeans聚类

Mahout K-means聚类 一、Kmeans 聚类原理 K-means算法是最为经典的基于划分的聚类方法&#xff0c;是十大经典数据挖掘算法之一。K-means算法的基本思想是&#xff1a;以空间中k个点为中心进行聚类&#xff0c;对最靠近他们的对象归类。通过迭代的方法&#xff0c;逐次更新各聚…

Web项目中获取SpringBean——在非Spring组件中获取SpringBean

最近在做项目的时候我发现一个问题&#xff1a;Spring的IOC容器不能在Web中被引用(或者说不能被任意地引用)。我们在配置文件中让Spring自动装配&#xff0c;但并没有留住ApplicationContext的实例。我们如果希望在我们的项目中任何位置都能拿到同一个ApplicationContext来获取…

postgresql对于HashJoin算法的Data skew优化与MCV处理

Data skew 很好理解&#xff0c;即数据倾斜。现实中的数据很多都不是正态分布的&#xff0c;譬如城市人口&#xff0c;东部沿海一个市的人口与西部地区一个市地区的人口相比&#xff0c;东部城市人口会多好几倍。 postgresql的skew的优化核心思想是"避免磁盘IO"。 优…

JavaScript | 创建对象并通过JavaScript函数在表中显示其内容

In this example, we created an object named employee with id, name, gender, city, and salary and assigned and displaying the values in the table using JavaScript function. 在此示例中&#xff0c;我们创建了一个名为employee的对象&#xff0c;其对象为id &#x…