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

问题描述 投票:0回答:1

gcc 和 g++ 是 C 和 C++ 代码的传统 GNU 编译器。最近,使用 LLVM 的 clang(和 clang++)作为替代编译器越来越受欢迎。

clang 和 gcc / g++ 有什么区别?使用 clang 有优势吗?

gcc clang clang++
1个回答
207
投票

GCC 是一个大包软件。据我了解,典型的过程是 GCC 前端对代码进行 lex 和解析,转换为 GCC 的内部寄存器传输语言 (RTL),然后后端写出本机代码。

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

GCC 支持多种前端:C、C++、Objective C、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 着色器或 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 的错误消息更有帮助,因为它们可以突出显示确切的部分有问题的线路。

© www.soinside.com 2019 - 2024. All rights reserved.