为您的应用程序选择正确的接口
Clang 提供了基础架构(infrastructure)来编写那些需要程序的句法和语义信息的工具。本文档将简要介绍编写 clang 工具的不同方法及其优缺点。
原文地址:https://releases.llvm.org/10.0.0/tools/clang/docs/Tooling.html
LibClang
LibClang 是clang的一个稳定的高级 C 语言接口。如果有疑问,LibClang可能是您要使用的接口。只有当您有充分的理由不使用 LibClang 时,才考虑其他接口。
何时使用 LibClang 的规范示例:
- Xcode
- Clang Python 绑定
当您……时使用 LibClang:
- 想与 C++ 以外的其他语言的 clang 交互时
- 需要一个稳定的接口,注意向后兼容
- 想要强大的高级抽象,例如使用游标遍历 AST,并且不想了解 Clang AST 的所有细节。
当你……时不要使用 LibClang:
- 想要完全控制 Clang AST
Clang 插件(Clang Plugins)
Clang 插件允许您在 AST 上运行附加操作(additional actions)作为编译的一部分。插件是由编译器在运行时加载的动态库,它们很容易集成到您的构建环境中。
何时使用 Clang 插件的规范示例:
- 项目的特殊lint样式(lint-style)警告或错误
- 从单个编译步骤创建额外的构建工件
当您……时使用 Clang 插件:
- 如果任何依赖项发生变化,则需要您的工具重新运行
- 希望您的工具能够构建或破坏构建(want your tool to make or break a build)
- 需要完全控制 Clang AST
当你……时不要使用 Clang 插件:
- 想要在构建环境之外运行工具
- 想要完全控制 Clang 的设置方式,包括内存中虚拟文件的映射
- 需要运行项目中的特定文件子集,该子集不一定与触发重建的任何更改相关
LibTooling
LibTooling 是一个 C++ 接口,旨在编写独立的工具,以及集成到运行 clang 工具(clang tools)的服务中。何时使用 LibTooling 的规范(Canonical)示例:
- 一个简单的语法检查器
- 重构工具
当您……时使用 LibTooling:
- 希望独立于构建系统在单个文件或特定文件子集上运行工具
- 想要完全控制 Clang AST
- 想与 Clang 插件共享代码
当你……时不要使用 LibTooling:
- 希望作为依赖项更改触发的构建的一部分运行时
- 想要一个稳定的接口,这样当 AST API 改变时你不需要改变你的代码
- 想要开箱即用的高级抽象,例如游标(cursors)和代码完成(code completion)
- 不想用 C++ 编写你的工具
Clang 工具是构建在 LibTooling 基础架构之上的特定开发人员工具的集合,作为 Clang 项目的一部分。它们旨在自动化和改进 C/C++ 开发人员的核心开发活动。
作为 Clang 项目的一部分,我们正在构建或规划的工具示例:
- 语法检查(clang-check)
- 自动修复编译错误(clang-fixit)
- 自动代码格式化(clang-format)
- 新语言标准中新功能的迁移工具
- 核心重构工具