VC, GCC, Clang/LLVM区别
Background
VC, GCC和Clang/LLVM
VC主要为Windows平台设计,GCC是GNU和Linux系统的官方编译器,
LLVM包含一系列模块化的编译器组件和工具链。LLVM可以作为多种语言的编译器的背景。 Clang是一种C,C++,Objective-C或Objective-C ++编译器,它基于LLVM用C++编译。
一个好的编译器使我们能够专注于编程过程,而不是与之对抗。它可以支持最新的语言标准,可以从最抽象的代码生成优化的命令,并且可以在更短的时间内编译源代码。
LLVM发展史
LLVM源自克里斯·拉特纳(Chris Lattner)在2000年对UUIC的研究。克里斯·拉特纳(Chris Lattner)希望为所有静态和动态语言创建一种动态编译技术。 LLVM是根据BSD许可开发的一种开源软件。最初的1.0版本于2003年发布。2005年,Apple Inc.聘请Chris Lattner及其团队为Apple计算机开发编程语言和编译器,此后LLVM的开发进入了快车道。从LLVM 2.5开始,每年都会发布两个次要的LLVM版本(通常在3月和9月)。 2011年11月,LLVM 3.0发布,成为默认的XCode编译器。默认情况下,XCode 5开始使用Clang和LLVM 5.0。版本策略针对LLVM 5.0和更高版本进行了调整,并且每年发布两个主要版本。当前的稳定版本是8.0。
LLVM的名称首先是Low Level Virtual Machine的缩写。由于该项目不仅限于创建虚拟机,因此经常会缩写LLVM。 LLVM开发之后,它成为许多编译工具和低级工具技术的统称,因此名称不太合适。开发人员决定放弃此缩写背后的含义。现在,LLVM已成为正式品牌名称,适用于LLVM下的所有项目,包括LLVM中间表示(LLVM IR),LLVM调试工具和LLVM C ++标准库。 LLVM可用作传统的编译器,JIT编译器,汇编器,调试器,静态分析工具,以及与编程语言相关的其他功能。
在2012年,LLVM与UNIX,WWW,TCP / IP,TeX和Java等传统系统一起获得了计算机协会(ACM)的软件系统奖。 LLVM大大简化了新编程语言工具链的实施。近年来,许多新的编程语言,例如Swift,Rust和Julia,都使用LLVM作为其编译框架。此外,LLVM已成为Mac OS X,iOS,FreeBSD和Android系统的默认编译器。
Clang发展史
Clang旨在提供可以代替GCC的前端编译器。苹果公司(包括后来的NeXT)一直在使用GCC作为官方编译器。作为开源社区中的标准编译器,GCC始终表现良好。但是,Apple Inc.对编译工具有其自己的要求。一方面,Apple Inc.为Objective-C语言(甚至后来的C语言)添加了许多新功能。但是,GCC开发人员不接受这些功能,因此分配了较低的优先级来支持这些功能。后来,它们被简单地分为两个分支以进行单独的开发,因此Apple Inc.发布的GCC版本比正式版本要早得多。另一方面,GCC代码是高度耦合的,很难单独开发。此外,在更高版本中,代码质量持续下降。但是,Apple Inc.所需的许多功能(例如改进的集成开发环境(IDE)支持)必须将GCC称为模块,但是GCC从未提供这种支持。此外,GCC运行时库豁免从根本上限制了LLVM GCC的开发。同样受许可证限制,Apple Inc.无法使用LLVM进一步提高基于GCC的代码生成质量。因此,Apple Inc.决定从头开始编写C,C ++和Objective-C语言的前端Clang,以完全取代GCC。
顾名思义,Clang仅支持C,C ++和Objective-C。开发工作于2007年开始,C编译器首次完成。 2009年,用于Objective-C云的Clang会在生产环境中完全使用。对C ++的支持也在迅速发展。 Clang 3.3完全支持C ++ 11,Clang 3.4完全支持C ++ 14,Clang 5完全支持C ++ 17,当时所有这些都大大领先于GCC。
比较
与Clang和LLVM相比,GCC支持更多的传统语言,例如Ada,Fortran和Go。
GCC支持较少流行的体系结构,并且比Clang和LLVM更早支持RISC-V。
与Clang和LLVM相比,GCC支持更多的语言扩展和更多的汇编语言功能。 GCC仍然是编译Linux内核的唯一选择。 尽管业界也报道了使用Clang和LLVM进行内核编译的研究,但是如果不修改源代码和编译参数就无法编译内核。
新兴语言正在使用LLVM框架,例如Swift,Rust,Julia和Ruby。
Clang和LLVM比GCC更严格地遵守C和C ++标准。 在GCC升级过程中,不会发生GNU内联和其他问题。
Clang还支持一些扩展,例如线程安全检查的属性。
Clang提供了其他有用的工具,例如用于静态分析的scan-build和clang静态分析器,用于语法分析的clang-format和clang-tidy以及编辑器插件Clangd。
Clang提供更准确和友好的诊断信息,并突出显示错误消息,错误行,错误行提示和维修建议。 Clang将诊断信息视为功能。 诊断信息仅从GCC 5.0开始改进,并在GCC 8中逐渐成熟。