gcc和g ++是用于C和C ++代码的传统GNU编译器。最近,使用LLVM的clang(和clang ++)作为替代编译器而越来越受欢迎。
clang和gcc / g ++有什么区别?使用clang有优势吗?
GCC是一大包软件。据我了解,典型的过程是让GCC前端lex解析代码,转换为GCC的内部寄存器传输语言,然后让后端写出本机代码。
因此,一个典型的流程是:C代码---> GCC的C前端---> RTL ---> GCC的x86后端---> x86机器代码。
GCC支持多种前端:C,C ++,Java,Objective C,Go和Fortran。
GCC支持多个后端:32位x86、64位x86,小端ARM,大端ARM,MIPS,SPARC,PowerPC等。
前端将文本转换为RTL,后端将RTL转换为某种机器代码。
LLVM是与机器无关的中间层计算表示,其概念类似于GCC的RTL。它是自己的类型系统和指令集,称为LLVM中间表示(IR)。如果我理解正确,与GCC的RTL相比,LLVM的IR更加丰富,更具表现力并且更加灵活,这具有许多好处。用于多种语言的LLVM编译器前端都可以编译为LLVM IR。这可以用于“常规”语言,例如C,C ++,Java等,但是也可以用于“非常规”编程任务,例如GPU着色器或sql查询
LLVM可能是两件事。LLVM-the-machine,是类型系统和指令集,可能更好地称为“ LLVM IR”;以及LLVM-the-API,这是用于在LLVM IR中操纵代码的软件,例如LLVM JIT编译器,或者也许是LLVM x86机器代码后端。
Clang是LLVM的前端,可处理C系列语言:C,C ++,Objective C,Objective C ++。Clang将C / C ++ / etc转换为LLVM IR,LLVM在IR上执行优化,并且LLVM x86后端写出x86机器代码以供执行。
尽管名称如此,LLVM并不是传统意义上的虚拟机-它是一种计算模型和表示形式,非常适合于操纵代码。
LLVM之所以受欢迎,部分原因在于它是完全标准化的编译器API。它可用于对代码执行静态分析(“此代码是否曾经偶然使用未初始化的内存吗?”),优化,代码解析(例如用于构建IDE)。GCC的内部非常紧密地耦合在一起,因此以这种方式使用GCC非常困难。一个示例是,GCC的前端在解析过程中执行了一些优化,因此不可能始终获得所键入代码的完美表示,例如,报告错误和执行花线语法突出显示,因为某些信息可能已经被删除了。丢失的。
据我了解,Clang保留了未优化的语法分析,这使第三方工具可以使用其输出并将转换等同于原始文本,最值得注意的是,Clang的错误消息更为有用,因为它们可以突出显示准确的部分。有问题的线。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句