导航:首页 > 源码编译 > llvm编译器

llvm编译器

发布时间:2022-01-14 20:37:37

㈠ 比较gcc,llvm和商用编 译器的性能差异,说明是什么原因导致差异 的出现

Apple在LLVM GCC4.2编译器中,通过XCode中的提示接口显式地为程序员提供是否将目标代码编译为ARM的选项。而在Apple LLVM3.0中,此选项没有了。
由于采用ARMv7A架构的Apple A4/A5处理器拥有Thumb-2指令集,使得Thumb代码在确保紧凑性的同时又进一步提升了计算能力。因此,Apple将工程配置默认设置为编译为Thumb代码。
而又由于LLVM的编译选项基本与GCC兼容,因此我们只需要在编译选项中手动加入-marm即可。
而传统GCC的编译选项只有-mthumb,它默认将代码编译为ARM指令集,因此可能没有提供-marm的编译选项。不过-marm在Apple LLVM3.0中确实奏效了。

㈡ 安装xcode 6后,为什么在MAC电脑的terminal里打gcc -v 会显示LLVMLLVM和GCC不是两个不同的编译器吗

Mac OS 现在都是默认使用clang+llvm编译,以前使用gcc+llvm。
只是现在还可以使用gcc命令 [编译实际还是用clang+llvm编译]。
要想用gcc, 需要自己单独装。

㈢ llvm怎样将中间代码编译为可执行二进制文件

预编译。编译器将你的.c、.cpp源代码,通过解释其中的预编译指令,将源代码转换成相应的没有任何预编译指令的代码。

编译、优化。将上一步的代码编译成汇编指令,并作一定优化,形成对应的.s汇编代码
汇编。将.s文件汇编成机器码,形成对应的.o目标文件,此时是不可执行的二进制文件。生成对应的清单文件。为了连接需要,还会生成未定向符号表、导出符号表、地址重定向表等等。
连接。先根据对应的清单文件、连接文件及之间的调用关系,决定所有的目标文件及引用的库文件在最后可执行文件中的位置;然后做一些其他事情,比如根据符号表等将目标文件中的符号地址补全等等;最终得到可执行文件。
这只是我个人的简单理解,更详尽的解答都可以写成好几本书了=_=望采纳~

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

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

㈤ 怎么告诉编译器去找llvm/support/host.h

首先是编译,然后是链接。
编译器会将所有.cpp文件编译成中间文件.o,编译时遇到.h文件则读入各种(函数,变量等)的声明,此时并不读入对应的.cpp文件。
链接时会将各个.o文件连接成可执行文件。
所以,编译器并不是看到.h文件后立即自动去找同名的.cpp文件,而是将所有的.cpp文件编译成.o文件后一并链接。

㈥ 编译器二: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

㈧ 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和clang需要多大空间

:转自知乎 蓝色 我最近和Clang/LLVM打交道比较多,目前游离在LLVM IR和IBM WCode之间。对于学习Clang/LLVM来说,其实需要看你做什么,是研究C, C++, Objective-C在Clang的实现,抑或着是想利用Clang做AST层面的事情,还是说想要利用LLVM IR来做

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

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

阅读全文

与llvm编译器相关的资料

热点内容
工作三年的大专程序员 浏览:728
java毕业设计文献 浏览:143
筹码集中度指标源码 浏览:482
listsortjava 浏览:186
plc闪光电路编程实例 浏览:299
socket编程试题 浏览:206
华为的服务器怎么设置从光驱启动 浏览:871
程序员真的累吗 浏览:328
学信网app为什么刷脸不了 浏览:874
天蝎vs程序员 浏览:996
单片机下载口叫什么 浏览:190
程序员的道 浏览:926
云服务器不实名违法吗 浏览:558
怎样查看文件夹图片是否重复 浏览:995
文件怎么导成pdf文件 浏览:808
打开sql表的命令 浏览:103
安卓手机如何面部支付 浏览:38
天元数学app为什么登录不上去 浏览:825
明日之后为什么有些服务器是四个字 浏览:104
安卓系统l1是什么意思 浏览:26