llvm编译器与gcc
① 安装xcode 6后,为什么在MAC电脑的terminal里打gcc -v 会显示LLVMLLVM和GCC不是两个不同的编译器吗
Mac OS 现在都是默认使用clang+llvm编译,以前使用gcc+llvm。
只是现在还可以使用gcc命令 [编译实际还是用clang+llvm编译]。
要想用gcc, 需要自己单独装。
② 单纯的只写c++,学生用的,哪个软件比较好
Visual Studio,这是最好的,没有之一。我干C++程序员10多年了,用了很多IDE,包括Eclipse、Tubo C++、C++ Builder等等,最后还是发现Visual Studio最好用,响应速度最快,功能最全。写C++的话推荐Visual Studio 2017,这个版本对C++11的支持比较全面,同时又比Visual Studio 2019稳定,基本没有Bug,学生的话安装Visual Studio 2017 Community版本,免费的。写C++一定要安装VAX插件,能提高编写代码的速度50%以上,VAX虽然是收费的,但这是中国,免费(pojie)版了解一下?
③ 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结合很好的编译前端。
④ 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好,这使得它定制或者改进比较不方便。
⑤ 比较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中确实奏效了。
⑥ armcc vs gcc,及llvm目前的使用情况是什么样的
armcc 在代码的体积上相比与开源gcc编译器更好,而且作为商业产品,能涉及到处理器的更多细节,所做出来的优化应该也更好,想比较而言,gcc就更加的保守了。llvm最近势头很猛,因为使用不同的licence,一些商业公司比较青睐,而且作为后发起的项目,在初始设计的时候就考虑到gcc现存的一些问题,更加模块化,有很多先天的优势吧。但是gcc也在一步步进化,毕竟在目前的开源界,它还是标配吧。
⑦ 适合win10系统的c语言编译器
桌面操作系统
对于当前主流桌面操作系统而言,可使用 VisualC++、GCC以及 LLVM Clang 这三大编译器。
Visual C++(简称 MSVC)只能用于 Windows 操作系统;GCC 和 LLVM Clang除了可用于Windows操作系统之外,主要用于 Unix/Linux操作系统。
像现在很多版本的 Linux 都默认使用 GCC 作为C语言编译器,而像 FreeBSD、macOS 等系统默认使用 LLVM Clang 编译器。由于当前 LLVM 项目主要在 Apple 的主推下发展的,所以在 macOS中,Clang 编译器又被称为 Apple LLVM 编译器。
MSVC 编译器主要用于 Windows 操作系统平台下的应用程序开发,它不开源。用户可以使用 Visual Studio Community 版本来免费使用它,但是如果要把通过 Visual Studio Community 工具生成出来的应用进行商用,那么就得好好阅读一下微软的许可证和说明书了。
而使用 GCC 与 Clang 编译器构建出来的应用一般没有任何限制,程序员可以将应用程序随意发布和进行商用。
MSVC 编译器对 C99 标准的支持就十分有限,加之它压根不支持任何 C11 标准,所以本教程中设计 C11 的代码例子不会针对 MSVC 进行描述。所幸的是,Visual Studio Community 2017 加入了对 Clang 编译器的支持,官方称之为——Clang with Microsoft CodeGen,当前版本基于的是 Clang 3.8。
也就是说,应用于 Visual Studio 集成开发环境中的 Clang 编译器前端可支持 Clang 编译器的所有语法特性,而后端生成的代码则与 MSVC 效果一样,包括像 long 整数类型在 64 位编译模式下长度仍然为 4 个字节,所以各位使用的时候也需要注意。
为了方便描述,本教程后面涉及 Visual Studio 集成开发环境下的 Clang 编译器简称为 VS-Clang 编译器。
嵌入式系统
而在嵌入式系统方面,可用的C语言编译器就非常丰富了,比如:
用于 Keil 公司 51 系列单片机的 Keil C51 编译器;
当前大红大紫的 Arino 板搭载的开发套件,可用针对 AVR 微控制器的 AVRGCC 编译器;
ARM 自己出的 ADS(ARM Development Suite)、RVDS(RealView Development Suite)和当前最新的 DS-5 Studio;
DSP 设计商 TI(Texas Instruments)的 CCS(Code Composer Studio);
DSP 设计商 ADI(Analog Devices,Inc.)的 Visual DSP++ 编译器,等等。
- 通常,用于嵌入式系统开发的编译工具链都没有免费版本,而且一般需要通过国内代理进行购买。所以,这对于个人开发者或者嵌入式系统爱好者而言是一道不低的门槛。
- 不过 Arino 的开发套件是可免费下载使用的,并且用它做开发板连接调试也十分简单。Arino 所采用的C编译器是基于 GCC 的。
- 还有像树莓派(Raspberry Pi)这种迷你电脑可以直接使用 GCC 和 Clang 编译器。此外,还有像 nVidia 公司推出的 Jetson TK 系列开发板也可直接使用 GCC 和 Clang 编译器。树莓派与 Jetson TK 都默认安装了 Linux 操作系统。
- 在嵌入式领域,一般比较低端的单片机,比如 8 位的 MCU 所对应的C编译器可能只支持 C90 标准,有些甚至连 C90 标准的很多特性都不支持。因为它们一方面内存小,ROM 的容量也小;另一方面,本身处理器机能就十分有限,有些甚至无法支持函数指针,因为处理器本身不包含通过寄存器做间接过程调用的指令。
- 而像 32 位处理器或 DSP,一般都至少能支持 C99 标准,它们本身的性能也十分强大。而像 ARM 出的 RVDS 编译器甚至可用 GNU 语法扩展。
- 下图展示了上述C语言编译器的分类。
⑧ LLVM/GCC中如何使用Intel格式的汇编
尽管本人接触GCC已经很久了,但对于AT&T汇编还是不忒习惯,尤其是写SSE的时候很别扭,呵呵。因此如果能写Intel格式汇编的话就会非常舒服。下面提供此方法(注:此方法已经在Apple LLVM1.6编译器下成功通过)
int main(int argc, const char * argv[]){__asm__ volatile(".intel_syntax /n/t" "mov r8, qword ptr [r8] /n/t" "mov r9, r9");
__asm__ volatile(".att_syntax /n/t" "mov %r8, %r8 /n/t" "mov %r9, %r9");}
上述代码中,第一行使用了Intel格式的内联汇编;第二行则是AT&T的。
上述代码对应的反汇编将是:Ltmp5:## InlineAsm Start
.intel_syntax
mov r8, qword ptr [r8]mov r9, r9## InlineAsm EndLtmp6:## InlineAsm Start
.att_syntax
mov %r8, %r8
mov %r9, %r9
## InlineAsm End
这里要注意的是,当你用完Intel内联汇编后,务必再切换回AT&T格式,否则编译器可能会发生故障,呵呵�6�8�6�8比如:int main(int argc, const char * argv[]){NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
__asm__ volatile(".intel_syntax /n/t" "mov r8, qword ptr [r8] /n/t" "mov r9, r9 /n/t"
".att_syntax /n/t");
[pool drain];return 0;}
如果上述代码中,最后没有切换AT&T语法格式,那么编译器会有莫名其妙的错误。上述代码内联汇编部分所对应的反汇编是:
## InlineAsm Start
.intel_syntax
mov r8, qword ptr [r8]mov r9, r9
这里要注意的是,从LLVM2.0开始,其自带的汇编器就不再支持Intel汇编语法了。
⑨ LLVM和GCC的区别
LLVM与GCC在三段式架构上并没有本质区别。LLVM与其它编译器最大的差别是,它不仅仅是Compiler
Collection,也是Libraries
Collection。举个例子,假如说我要写一个XYZ语言的优化器,我自己实现了PassXYZ算法,用以处理XYZ语言与其它语言差别最大的地方。而LLVM优化器提供的PassA和PassB算法则提供了XYZ语言与其它语言共性的优化算法。那么我可以选择XYZ优化器在链接的时候把LLVM提供的算法链接进来。LLVM不仅仅是编译器,也是一个SDK。
⑩ 编译器二: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。