Clang 编译器与其他编译器的工作流程没什么大的区别,具体分为三个阶段。 第一阶段在前端解析源代码,检查代码是否有误,并生成指定语言的抽象语法树(AST),作为输入代码。 第二阶段是优化前端生成的抽象语法树。 第三阶段也是最后一个阶段,发生在后端,负责生成机器执行的最终代码,该代码以最终目标为准。
Clang 最初由苹果公司主导编写。苹果开发人员一开始使用 GCC 作为 LLVM 的前端,但这给使用 LLVM 的开发人员带来了一些问题。GCC 系统庞大而笨重,与苹果集成开发环境(IDE)配合度差。 除此之外,LLVM 许可证也与 GCC 不兼容。在此期间,苹果软件大量使用 Objective-C,但这在 GCC 中优先级很低。这就是苹果公司在 2007 年 7 月开发 Clang 项目的原因,后来逐渐将其发展为开源工具。 Clang 的最新版本是 Clang 12。在 2020 年 11 月,Clang 12 已完全支持所有发布的 C++ 标准,部分也支持即将发布的 C++ 20 标准。
下载并安装 Clang,需要按照下列步骤进行:
Clang 的第一个版本是 Clang1.0,与 LLVM 2.6 一同发布。接下来是 Clang C++,可以解析 GCC 4.2 的 libstdc,为某些特定的程序产生可运作的代码,并编译自身。 从 Clang 3.0 到最新的 Clang 12.0.0,编译器已经发展出大量实用功能。 Clang 不断优化,变得更具扩展性,而且轻量、快速。与 GCC 相比,Clang 在编译过程中能保留更多的数据(了解什么是 GCC).,包括主代码的形式。 这种数据保留,有利于错误追踪,定位回主源代码。Clang 可提供具体而详细的错误报告,且机器可读。这样,集成开发环境就可以在编译时为编译器的输出创建索引。
参考 Alibabatech 的性能对比报告, Clang 的前端编译速度明显快于 GCC,内存占用更少。因此,在大型项目开发中,Clang 优势明显。 另外,Clang 编译器生成的诊断报告(错误和警告消息),非常实用,且一目了然。 Clang 使用基于库的体系结构,前端划分为不同的库,可以满足各类的需求,这也简化了每个堆栈层的时间计算及成本预估过程。 Clang 以代码库为基础的工作流程,对新手很友好。因为程序员只需了解基础原理就能轻松上手。 Clang 可支持多样化的客户端,帮助增量编译,也便于连接到集成开发环境中的用户界面。Clang 设计周到、细致,为 C++、Object C 和 C 语言的新工具使用带来了极大的便利。 Clang 可进行广泛地语言扩展。这些扩展与 Microsoft、GCC 和等大多流行编译器兼容,因此,Clang 性能进一步强化。 Clang 编译器还能够与 IDE 集成,让用户能更清楚直观地洞察整个项目。Clang 在LLVM 的 BSD 授权协议下处理商业项目,因为 Clang 本身不是一个可以独立运作的编译器。 Clang 编译器可以嵌入第三方应用程序库。在 BSD 授权协议下,用户可以浏览并改进源代码,从而增强编译器性能。对比了解 GCC vs Clang.
Visual Studio 完全支持 Clang/LLVM 工具集,因此也适合在 Windows 上使用 Clang 的集成开发环境。在 Windows 上安装 Clang 工具很容易。Windows 包含一个 Clang 编译器,这是一个可选的组件,用于 C++ 桌面开发,这将帮助 Clang 在 Windows 中进行进程开发。为了在集成开发环境中获得最好的功能,建议使用 Clang 最新版本。
如果远程 Linux 机器已安装 Visual Studio,且需要用 Clang/LLVM,您需要将 Clang 与包管理器的 Distributor 一起安装。一旦“which-clang”功能可以检测到编译器,就可以正常运转了。 此外,每个 Linux/GNU 发行版或 BSD 都提供 Clang,因为这是打包系统的一部分。Clang 是 macOS X 到 Xcode 4.2 的默认编译器。 如希望以最快速度进行增量构建,强烈建议使用 Ninja 构建系统。 生成的 Visual Studio 项目文件可用于编辑 Clang 的源代码,Clang 将生成用于运行测试的第二个构建目录。
Clang 可以通过 Visual Studio Code 或 Homebrew 安装在 macOS 机器上。
Incredibuild 可以大幅提升 Visual Studio 集成开发环境中 Chang/LLVM 的编译速度,或其他编译工具的编译进程,如 CMake、Ninja 等等。借助其独特的进程虚拟化技术,Incredibuild 充分利用网络中的数百个远程内核资源,将 Clang 编译进程无缝分发,大大加快了 Clang 的编译时间。类似的,Incredibuild 也为虚幻引擎分发 Clang++ 进程提供了更多支持。