Clang是一个C、
C++、
Objective-C和Objective-C++编译器前端,由
苹果公司主导开发,基于LLVM编译器后端。它的目标是提供一个GNU编译器套装(
GCC)的替代品,支持大多数的GCC编译设定和非官方语言扩充功能。Clang的源代码发布于BSD协议下,自
LLVM 2.6版本开始,与LLVM一起释出新版本。Clang的主要贡献者包括Apple、
微软、
谷歌、ARM、
索尼、
英特尔和
AMD等公司。Clang的特性包括支持普通lambda表达式、返回类型的简化处理以及更好的处理constexpr关键字。自Clang 15版本开始,它已经完全支持所有已发布的
C++标准,实现了大部分C++20的功能,并对即将到来的C++23标准提供了初步支持。自Clang 6.0.0版本开始,默认情况下,Clang使用GNU++14方言编译C++,该方言包含C++14标准和遵从GNU扩展的功能。
Clang是一个由Apple主导编写,基于
LLVM的C/C++/
Objective-C编译器。2013年4月,Clang已经全面支持C++11标准,并开始实现C++1y特性(也就是C++14,这是C++的下一个小更新版本)。Clang将支持其普通lambda表达式、返回类型的简化处理以及更好的处理constexpr关键字。Clang是一个
C++编写、基于LLVM、发布于LLVM BSD许可证下的C/C++/Objective-C/Objective-C++编译器。它与GNU C语言规范几乎完全兼容(当然,也有部分不兼容的内容,包括编译命令选项也会有点差异),并在此基础上增加了额外的语法特性,比如C函数重载(通过__attribute__((overloadable))来修饰函数),其目标(之一)就是超越GCC。
Clang与
LLVM配合使用,提供了替代
GCC堆栈的大部分工具链。Clang的主要目标之一是提供基于库的架构,以便编译器可以与其他与源代码交互的工具(如IDE)进行交互。Clang在编译过程中保留了比GCC更多的信息,并保留了原始代码的整体形式,这使得更容易将错误映射回原始源代码。Clang的错误报告更详细、具体和可机器读取,因此IDE可以索引编译器的输出。
编译器的模块化设计可以提供源代码索引、语法检查和其他通常与快速应用程序开发系统相关的功能。Clang只编译类似C的语言,如C、
C++、
Objective-C和Objective-C++。一个
Fortran项目Flang正在进行中,以增加对Fortran的支持。
自2005年起,
苹果公司开始在多个商业产品中广泛使用
LLVM,包括iOS SDK和Xcode 3.1。LLVM最初的用途之一是用于OS X的OpenGL代码编译器,将OpenGL调用转换为不支持某些功能的图形处理单元(GPU)的更基本的调用。这使得苹果能够在使用
英特尔GMA芯片组的
计算机上支持
OpenGL,提高了这些机器的性能。由于
GCC的源代码庞大且笨重,以及其GPLv3许可证的限制,苹果选择开发了Clang,一个支持C、
Objective-C和
C++的新编译器前端,并于2007年7月成为开源项目。
Clang历史上的重要步骤和发布包括其对C++17标准的全面支持,以及对C++20和C++23标准的实现和初步支持。自v16.0.0以来,Clang默认使用GNU++17方言进行C++编译,其中包括C++17标准和符合GNU扩展的功能。
基础架构模块库;可满足多样的客户需求(代码重构,动态分析,代码生成,等);允许集成到各种
集成开发环境中;使用
LLVM'BSD'协议;
一个不可移植的代码库;一个为
c语言、
Objective-C、
C++、Objective-C++设计的非通用(Non general-purpose)的语法解析器;与C/C++/Objective-C及它们的衍生语言具有高度一致性。
Clang与GCC兼容,其
命令行界面共享许多GCC的标志和选项。Clang实现了许多GNU语言扩展和编译器内部函数,保持与GCC生成的目标代码的ABI兼容。Clang的开发人员旨在减少内存占用和提高编译速度,与GCC相比,Clang在编译速度和内存占用方面具有优势。然而,Clang在编译Linux内核时比GCC慢,但在编译
LLVM时略快。在程序性能方面,Clang编译的程序性能落后于GCC编译的程序,但两个编译器在性能上的差距已经缩小。