clang(和LLVM)与gcc / g ++有什么区别?

托马斯·约翰逊(Thomas Johnson)

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

clang(和LLVM)和gcc / g ++有什么区别?

来自分类Dev

在Regex中,(?!^)\ G和\ G(?!^)有什么区别?

来自分类Dev

useradd中的-g和-G选项有什么区别

来自分类Dev

“gcc -g”和“gcc -g3”有什么区别?

来自分类Dev

“ shutdown / r”和“ shutdown / g”有什么区别?

来自分类Dev

perl-rename-/ g'和/'有什么区别?

来自分类Dev

2.4G和5G无线有什么区别?

来自分类Dev

调用“ id -G”和“ id -G -r”有什么区别?

来自分类Dev

Clang,LLVM和g ++

来自分类Dev

Clang,LLVM和g ++

来自分类Dev

G1:混合gc和完整gc有什么区别?

来自分类Dev

vim中的:g和:%s命令之间有什么区别

来自分类Dev

选择带别名和不带oracle 11g有什么区别?

来自分类Dev

以 G_ 和 GTK_ 开头的函数有什么区别?

来自分类Dev

“ as?”,“ as!”和“ as”有什么区别?

来自分类Dev

$ *和$ @有什么区别

来自分类Dev

$和〜有什么区别?

来自分类Dev

/ * ... * /和/ ** ... * /有什么区别

来自分类Dev

!=和<>有什么区别?

来自分类Dev

ö和ö有什么区别?

来自分类Dev

$ *和$ @有什么区别?

来自分类Dev

“ ==”和“ =〜”有什么区别?

来自分类Dev

= +和+ =有什么区别

来自分类Dev

$ @和$ *有什么区别

来自分类Dev

+ =和+有什么区别?

来自分类Dev

$ _和!$有什么区别?

来自分类Dev

\ 和 \\ 有什么区别

来自分类Dev

#include <filename>和#inlude特定于LLVM / Clang的“文件名”之间有什么区别?

来自分类Dev

gcc和dpkg -l有什么区别?grep gcc