Compiler construction clang(和LLVM)和gcc/g++;? GCC和G++是传统的C和C++代码的GNU编译器。最近,使用LLVM的clang(和clang++)作为替代编译器越来越流行

Compiler construction clang(和LLVM)和gcc/g++;? GCC和G++是传统的C和C++代码的GNU编译器。最近,使用LLVM的clang(和clang++)作为替代编译器越来越流行,compiler-construction,Compiler Construction,clang和gcc/g++之间有什么区别?使用clang有什么好处吗?GCC是一大袋软件。据我所知,典型的过程是GCC前端到lex并解析代码,转换到GCC的内部寄存器传输语言,然后后端写出本机代码 所以一个典型的流程是:C代码-->GCC的C前端-->RTL-->GCC的x86后端-->x86机器代码 支持GC、C++、java、ObjialCo、GO和FORTRAN。 GCC支持多个后端:32位x86、64位x86、little-endian ARM、big-endian ARM、MIPS、S

clang和gcc/g++之间有什么区别?使用clang有什么好处吗?

GCC是一大袋软件。据我所知,典型的过程是GCC前端到lex并解析代码,转换到GCC的内部寄存器传输语言,然后后端写出本机代码

所以一个典型的流程是:C代码-->GCC的C前端-->RTL-->GCC的x86后端-->x86机器代码

支持GC、C++、java、ObjialCo、GO和FORTRAN。 GCC支持多个后端:32位x86、64位x86、little-endian ARM、big-endian ARM、MIPS、SPARC、PowerPC等

前端将文本转换为RTL,后端将RTL转换为某种机器代码

LLVM是一种中间层机器无关计算表示,在概念上类似于GCC的RTL。它是自己的类型系统和指令集,称为LLVM中间表示(IR)。如果我理解正确的话,LLVM的IR比GCC的RTL更丰富、更具表现力、更灵活,后者有很多好处。许多不同语言的LLVM编译器前端都可以编译到LLVM IR。这可以用于“常规”语言,如C、C++、java等,但它也可以用于“非常规”编程任务,如GPU着色器或

那么,LLVM可能是两件事。LLVM机器,它是类型系统和指令集,最好称为“LLVM IR”;还有LLVM API,它是用于在LLVM IR中操作代码的软件,例如LLVM JIT编译器,或者LLVM x86机器代码后端

CLAN是处理C族语言的LLVM的前端:C、C++、Objic C、Obj+C++。Clang将C/C++/etc转换为LLVM IR,LLVM在IR上执行优化,LLVM x86后端写出x86机器代码以供执行

尽管名称不同,LLVM并不是传统意义上的虚拟机——它是一种计算模型和表示,非常适合处理代码

LLVM的流行部分源于它是一个完全具体化的编译器API。它可以用于对代码执行静态分析(“此代码是否曾意外使用未初始化内存?”)、优化、代码解析(例如用于构建IDE)。GCC的内部是高度耦合的,因此以这种方式使用GCC非常困难。一个例子是,GCC的前端在解析过程中执行一些优化,因此不可能始终获得代码类型的完美表示,例如,报告错误和执行扭曲线语法高亮显示,因为一些信息可能已经丢失


据我所知,Clang保留了未优化的解析语法,使第三方工具能够使用其输出并将转换等同于原始文本,最显著的是,Clang的错误消息更有帮助,因为它们可以突出显示问题所在行的确切部分。

它们是各自系统的后端和前端,彼此之间没有关系。@Mehrdad这没有多大帮助。哪一个是后端(我假设这意味着代码生成和链接),哪一个是前端(我假设这意味着编译器驱动程序),与现有的前端和后端相比,它们的动机是什么?我还认为,虽然严格来说,gcc可执行文件只是一个前端,但习惯上,从源代码到可执行文件的整个工具链都被称为“gcc”。其他编译器不是也是这样吗?这也是胡说八道,“gcc”和“g++”都不是前端,也不是后端。它们是根据需要运行编译器、汇编程序和/或链接器的驱动程序。gcc/g++运行的编译器可执行文件具有前端和后端.LLVM程序集,通常称为IR(中间表示),而不是IF。谢谢。“我几乎什么都不懂,”萨皮说。有人能给出一个更容易理解的版本,而不是像“物化”这样的术语吗?@SujayPhadke-reafied:to make real;充分实现的执行;把某物抽象化并具体化。如果您打算设计一个库来专门提供一个编译器API,除了发出机器代码之外,编译器还可以做其他事情,那么它会是什么样子呢?表面上,GCC的主要目标是获取文本并将其转换为机器代码。LLVM的目标不止于此,如果我理解正确的话。1.GCC和LLVM都需要特定于体系结构的后端(64位x86、ARM等)。2.LLVM的好处是,它在转换到某些中间表示时没有GCC做的那么多,因此人们可以用LLVM IR比GCC RTL做更多的工作(例如,分析)?