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,一经查实,立即删除!

相关文章

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…

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刷新技术已不是什么新鲜技术。所以网上有大把的资料可参考…

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分配给具有最短突…

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…

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…

基于socket的简单文件传输系统

【实验目的及要求】 在 Uinx/Linux/Windows 环境下通过 socket 方式实现一个基于 Client/Server 文件传输程序。 【实验原理和步骤】 1. 确定传输模式:通过 socket 方式实现一个基于 Client/Server 或 P2P 模式的文件传输程序。 2. 如果选择的是 Client/Server 模式的文件传输…

Postgresql的HashJoin状态机流程图整理

状态机 可以放大观看。 HashJoinState Hash Join运行期状态结构体 typedef struct HashJoinState {JoinState js; /* 基类;its first field is NodeTag */ExprState *hashclauses;//hash连接条件List *hj_OuterHashKeys; /* 外表条件链表;list of …

JqueryUI入门

Jquery UI 是一套开源免费的、基于Jquery的插件&#xff0c;在这里记录下Jquery UI 的初步使用。 第一、下载安装 下载Jquery,官网&#xff1a;http://jquery.com;  下载Jquery UI&#xff0c;官网&#xff1a;http://jqueryui.com/ Jquery的部署就不说了&#xff0c;说下Jqu…

IO多路复用的三种机制Select,Poll,Epoll

IO多路复用的本质是通过系统内核缓冲IO数据让单个进程可以监视多个文件描述符&#xff0c;一旦某个进程描述符就绪(读/写就绪)&#xff0c;就能够通知程序进行相应的读写操作。 select poll epoll都是Linux提供的IO复用方式&#xff0c;它们本质上都是同步IO&#xff0c;因为它…

qt中按钮贴图

一.QT之QPushButton按钮贴图 二.QT之QToolButton按钮贴图 一.QT之QPushButton按钮贴图具体操作流程 1. Qt Designer中拖入一Tool Button 2. 选择图标的图片放入工程目录下&#xff0c;如放在Resources内 3. 双击工程的Resource Files下的qrc文件&#xff0c;如图 4. 在弹出的窗…

Android Activity类讲解(一)

--by CY[kotomifigmail.com] &#xff11;&#xff0e;protected void onCreate(Bundle savedInstanceState) { throw new RuntimeException("Stub!");   } 当创建一个Activity时&#xff0c;系统会自动调用onCreate方法来完成创建工作&#xff0e;该创建工作包括布…

Mysql的undo、redo、bin log分析

目录关于undo log关于redolog关于binlog一个事务的提交流程undo log :记录数据被修改之前的样子 redo log&#xff1a;记录数据被修改之后的样子 bin log&#xff1a;记录整个操作。 关于undo log 关于undo log&#xff1a; 在执行一条涉及数据变更的sql时&#xff0c;在数据…

JPA概要

本文最新版已更新至&#xff1a;http://thinkinside.tk/2012/12/30/JPA.html JPA定义了Java ORM及实体操作API的标准。本文摘录了JPA的一些关键信息以备查阅。 如果有hibernate的基础&#xff0c;通过本文也可以快速掌握JPA的基本概念及使用。 Table of Contents 1 JPA概述2 实…

如何配置能让fiddler抓去https的请求?

1、打开fiddler&#xff0c;>>Tools>>Fiddler Options&#xff0c; 打开如图所示的HTTPS配置项&#xff1a;点击Export Rppt Certifica to Desktop :桌面上多了一个证书&#xff1a;下面就是将证书导入&#xff1a;点击开始-运行&#xff0c;输入&#xff1a;mmc,…

【闲聊】Baidu Map,excellent !!!Diaoyv island is China 's

【钓鱼岛】钓鱼岛是中国的&#xff01;Diaoyu Islands are Chinas! 釣魚島は中国のアール! ————————————youngLaker转载于:https://www.cnblogs.com/younglaker/archive/2012/12/31/2840190.html