导航:首页 > 源码编译 > llvm架构前段编译器

llvm架构前段编译器

发布时间:2022-09-03 04:34:44

㈠ Gcc和llvm编译器有什么区别,我这配置哪个快

LLVM与GCC在三段式架构上并没有本质区别。LLVM与其它编译器最大的差别是,它不仅仅是Compiler Collection,也是Libraries Collection。举个例子,假如说我要写一个XYZ语言的优化器,我自己实现了PassXYZ算法,用以处理XYZ语言与其它语言差别最大的地方。而LLVM优化器提供的PassA和PassB算法则提供了XYZ语言与其它语言共性的优化算法。那么我可以选择XYZ优化器在链接的时候把LLVM提供的算法链接进来。LLVM不仅仅是编译器,也是一个SDK。

㈡ llvm是什么

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

㈢ Clang 比 GCC 好在哪里

从代码上说,clang结构更简单。因为clang只需要完成词法和语法分析,代码优化和机器代码的生成工作由llvm完成。所以和全部由自己包下的gcc比起来,clang可以更专注地做好一件事。

这种结构也使clang可以被单独拿出来用在其他的程序里。比如vim的clang_complete插件就是利用clang进行语法分析后给出精确的自动补全和语法错误提示的。而gcc就没法很方便地做到这一点。

在实用性方面,除了有更快的编译速度更快和更友好的出错提示外,clang还内置有静态分析工具,可以对代码进行静态分析(clang --analyze)。这也是gcc做不到的。

总结如下:

Clang是LLVM的前端,可以用来编译C,C++,ObjectiveC等语言。传统的编译器通常分为三个部分,前端(frontEnd),优化器(Optimizer)和后端(backEnd)。

在编译过程中,前端主要负责词法和语法分析,将源代码转化为抽象语法树;优化器则是在前端的基础上,对得到的中间代码进行优化,使代码更加高效;后端则是将已经优化的中间代码转化为针对各自平台的机器代码。Clang则是以LLVM为后端的一款高效易用,并且与IDE结合很好的编译前端。

㈣ 如何将Java bytecode编译成LLVM IR,即有没有可用的LLVM的Java前端

首先简要介绍一下LLVM。LLVM是一个针对LLVM Intermediate Representation(IR,中间语言)的跨平台优化编译器,它的模块化设计很好,使得这个编译器中的很多功能可以被单独实现或者改进,这与其C++实现无法分开。由此,LLVM可以被设计成很多语言

㈤ 编译器二:LLVM和GCC的区别

GCC: GNU Compiler Collection
GCC属于传统编译器,传统编译器的工作原理基本上都是三段式的,可以分为前端(Frontend)、优化器(Optimizer)、后端(Backend)。前端负责解析源代码,检查语法错误,并将其翻译为抽象的语法树(Abstract Syntax Tree)。优化器对这一中间代码进行优化,试图使代码更高效。后端则负责将优化器优化后的中间代码转换为目标机器的代码,这一过程后端会最大化的利用目标机器的特殊指令,以提高代码的性能。
事实上,不光静态语言如此,动态语言也符合上面这个模型,例如Java。Java Virtual Machine也利用上面这个模型,将Java代码翻译为Java bytecode。这一模型的好处是,当我们要支持多种语言时,只需要添加多个前端就可以了。当需要支持多种目标机器时,只需要添加多个后端就可以了。对于中间的优化器,我们可以使用通用的中间代码。
这种三段式的结构还有一个好处,开发前端的人只需要知道如何将源代码转换为优化器能够理解的中间代码就可以了,他不需要知道优化器的工作原理,也不需要了解目标机器的知识。这大大降低了编译器的开发难度,使更多的开发人员可以参与进来。
虽然这种三段式的编译器有很多有点,并且被写到了教科书上,但是在实际中这一结构却从来没有被完美实现过。做的比较好的应该属Java和.NET虚拟机。虚拟机可以将目标语言翻译为bytecode,所以理论上讲我们可以将任何语言翻译为bytecode,然后输入虚拟机中运行。但是这一动态语言的模型并不太适合C语言,所以硬将C语言翻译为bytecode并实现垃圾回收机制的效率是非常低的。
GCC也将三段式做的比较好,并且实现了很多前端,支持了很多语言。但是上述这些编译器的致命缺陷是,他们是一个完整的可执行文件,没有给其它语言的开发者提供代码重用的接口。即使GCC是开源的,但是源代码重用的难度也比较大。
LLVM: Low Level Virtual Machine
LLVM最初是[Low Level Virtual Machine]的缩写,定位是一个虚拟机,但是是比较底层的虚拟机。它的出现正是为了解决编译器代码重用的问题,LLVM一上来就站在比较高的角度,制定了LLVM IR这一中间代码表示语言。LLVM IR充分考虑了各种应用场景,例如在IDE中调用LLVM进行实时的代码语法检查,对静态语言、动态语言的编译、优化等。
LLVM与GCC在三段式架构上并没有本质区别。LLVM与其它编译器最大的差别是,它不仅仅是Compiler Collection,也是Libraries Collection。举个例子,假如说我要写一个XYZ语言的优化器,我自己实现了PassXYZ算法,用以处理XYZ语言与其它语言差别最大的地方。而LLVM优化器提供的PassA和PassB算法则提供了XYZ语言与其它语言共性的优化算法。那么我可以选择XYZ优化器在链接的时候把LLVM提供的算法链接进来。LLVM不仅仅是编译器,也是一个SDK。

㈥ 如何利用LLVM写一个编译器

LLVM有自己的教程,如果你只想做个玩具,那可以首先试着实现LLVM Tutorial: Table of Contents的Kaleidoscope。深入的,请看他的文档http://llvm.org/docs/

Kaleidoscope是一个范式简单的脚本语言,教程里的词法,语法分析都是手写的,基本流程就是词法语法解析,利用LLVM的API生成中间代码并执行。

我用visual studio编译的LLVM(version 3.6)实现过Kaleidoscope,我遇到的坑不少,如果你想以visual studio编译的LLVM实现Kaleidoscope,你可能同样会遇到

1. LLVM的生成目标对象为ELF格式,在windows下使用JIT的API时会出现incompatible object format的错误警告,需要在通过重新设定Mole的triple,我的PC的getTargetTriple的结果是“i686-pc-windows-msvc”,直接在后面再加上“-elf”即可

TheMole->setTargetTriple("i686-pc-windows-msvc-elf");

2. LLVM不支持windows下通过动态链接导出函数,如果需要使用C/C++的函数,需要通过addSymbol进行注册

llvm::sys::DynamicLibrary::AddSymbol(/*std::string("_") +*/ "printd", &printd);

3. Kaleidoscope里使用的JIT的查找函数的API,getPointerToFunction已经被弃用了,需要替换为getFunctionAddress

㈦ xcode里面有llvm clang编译器吗

Xcode 中最开始使用的是 GCC,后来开始引入 LLVM 后端(前端仍然是 GCC),再后来引入 Clang 前端,再后来 Clang/LLVM 成为默认,然后从 Xcode 5.0 版本以后,Clang/LLVM 是唯一提供的编译器套件。

㈧ LLVM相比于GCC,有哪些技术上的优势

首先简要介绍一下LLVM。LLVM是一个针对LLVM Intermediate Representation(IR,中间语言)的跨平台优化编译器,它的模块化设计很好,使得这个编译器中的很多功能可以被单独实现或者改进,这与其C++实现无法分开。由此,LLVM可以被设计成很多语言编译器实现的后端,负责处理程序优化和跨平台,而前端只需将程序转换成LLVM IR即可。比如说,Clang就是基于LLVM实现的C/C++编译器,它的主要功能就是将C/C++程序转换成LLVM IR,然后由LLVM负责后续的工作。

LLVM技术上的(最大)优势就在于它的模块化设计。在LLVM中,IR的解析,优化,汇编码的生成,寄存器分配,汇编码优化以及机器码生成,各种类型的二进制文件生成全部都是接口定义清晰的模块完成的,很容易分别改进或者添加定制功能。而且由于LLVM的C++实现,很多模块理解和使用比较容易。这些特性使得LLVM可以很容易地被用在科研和生产实践当中。反观GCC,模块化做得不如LLVM好,这使得它定制或者改进比较不方便。

㈨ 怎么用llvm编译器编写c语言

LLVM的帮助。对于这个工具,我不知道改怎么去形容它,但是他给我的这个编译器的确带... 我们使用的工具是基于C/...LLVM是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-tim...

㈩ LLVM每日谈之一 LLVM是什么

写在前面的话: 最近接触llvm比较多,在这个上面花了不少的时间。感觉llvm要完全理解透是个很不容易的事情,需要在学习过程中好好的整理下自己的思路。刚好又阅读了开源项目Storm的作者Nathan Marz的博客《You should blog even if you have no readers》,就打开自己的blog,开始了这个llvm每日谈的系列。希望自己能坚持的久一点,多写写llvm的每个方面,多写写自己的理解。 llvm是low level virtual machine的简称,其实是一个编译器框架。llvm随着这个项目的不断的发展,已经无法完全的代表这个项目了,只是这种叫法一直延续下来。 llvm是一个开源的项目。它最早的时候是Illinois的一个研究项目,主要负责人是Chris Lattner,他现在就职于Apple. Apple 目前也是llvm项目的主要赞助者之一。 llvm的主要作用是它可以作为多种语言的后端,它可以提供可编程语言无关的优化和针对很多种CPU的代码生成功能。此外llvm目前已经不仅仅是个编程框架,它目前还包含了很多的子项目,比如最具盛名的clang. llvm的优点是开源,有一个表达形式很好的IR语言,模块化作的特别好。 llvm这个框架目前已经有基于这个框架的大量的工具可以使用。 llvm的官方网站地址是:llvm.org。在这里可以下载最新的发布代码,也可以找到介绍llvm的相关文档。 附录:llvm目前支持的工具(描述来自网络) llvm-as 将人类可读的 .ll 文件汇编成字节代码 llvm-dis 将字节代码文件反编成人类可读的 .ll 文件 opt 在一个字节代码文件上运行一系列的 LLVM 到 LLVM 的优化 llc 为一个字节代码文件生成本机器代码 lli 直接运行使用 JIT 编译器或者解释器编译成字节代码的程序 llvm-link 将几个字节代码文件连接成一个 llvm-ar 打包字节代码文件 llvm-ranlib 为 llvm-ar 打包的文件创建索引 llvm-nm 在 字节代码文件中打印名字和符号类型 llvm-prof 将 'llvmprof.out' raw 数据格式化成人类可读的报告 llvm-ld 带有可装载的运行时优化支持的通用目标连接器 llvm-config 打印出配置时 LLVM 编译选项、库、等等 llvmc 一个通用的可定制的编译器驱动 llvm-diff 比较两个模块的结构 bugpoint 自动案例测试减速器 llvm-extract 从 LLVM 字节代码文件中解压出一个函数 llvm-bcanalyzer 字节代码分析器 (分析二进制编码本身,而不是它代表的程序) FileCheck 灵活的文件验证器,广泛的被测试工具利用 tblgen 目标描述阅读器和生成器 lit LLVM 集成测试器,用于运行测试

阅读全文

与llvm架构前段编译器相关的资料

热点内容
哪里有专门注册app实名的 浏览:273
魔爪mx稳定器app去哪里下载 浏览:469
excel如何批量处理电话号码加密 浏览:324
ark命令 浏览:39
seal是不是对称密钥算法 浏览:29
免费学习的app在哪里下载 浏览:177
rfid与单片机 浏览:590
5s相当于安卓什么手机 浏览:689
哈佛商学院pdf 浏览:978
app的ip哪里买 浏览:909
移动天文台app在哪里下载 浏览:923
phpjsonencode乱码 浏览:587
t3的服务器名是什么几把 浏览:69
高中算法语句 浏览:549
安卓充电接头坏如何直接线 浏览:2
mcu编译成库 浏览:296
python官网访问不了了 浏览:98
库卡逻辑编程 浏览:919
加密币驱动 浏览:982
怎么解压后的文件夹没有激活工具 浏览:809