gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:32:59 24 4
gpt4 key购买 nike

gcc 和 g++ 是用于 C 和 C++ 代码的传统 GNU 编译器。最近,使用 LLVM 的 clang(和 clang++)作为替代编译器越来越受欢迎。
clang 和 gcc/g++ 有什么区别?使用 clang 有优势吗?

最佳答案

GCC 是一大包软件。据我了解,典型的过程是 GCC 前端对代码进行 lex 和解析,转换为 GCC 的内部寄存器传输语言 (RTL),然后由后端写出 native 代码。
所以一个典型的流程是: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)。如果我理解正确的话,LLVM 的 IR 比 GCC 的 RTL 更丰富、更具表现力、更灵活,后者有很多好处。许多不同语言的 LLVM 编译器前端都可以编译为 LLVM IR。这可用于“传统”语言,如 C、C++、Java 等,但也可用于“非常规”编程任务,如 GPU 着色器或 sql queries
那么,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 保留了未优化的解析语法,使 3rd 方工具可以使用其输出并将转换等同于原始文本,最值得注意的是,Clang 的错误消息更有帮助,因为它们可以突出显示的确切部分有问题的线路。

关于compiler-construction - clang(和 LLVM)和 gcc/g++ 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24836183/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com