为应用程序选择正确的接口
本文为译文,点击 此处查看原文。
Clang
提供了用于编写需要有关程序的语法和语义信息的工具的基础设施。本文将简要介绍编写clang工具的不同方法,以及它们的优缺点。
1. LibClang
LibClang
是clang的一个稳定的高级C接口。当你有疑问时,LibClang可能是您想要使用的接口。只有当您有充分的理由不使用LibClang时,再去考虑其他接口。
使用LibClang的典型例子:
- Xcode
- Clang Python Bindings
在以下情况下使用LibClang:
- 希望与 C++ 以外的其他语言的 clang 进行接口
- 需要一个稳定的接口,负责向后兼容
- 需要强大的高级抽象,比如用 cursor 遍历 AST,并且不想学习 Clang 的 AST 的所有细节。
在以下情况下不使用LibClang:
- 想要完全控制 Clang AST
2. Clang Plugins
Clang Plugins
允许您作为编译的一部分在 AST 上运行其他操作。Plugins 是由编译器在运行时加载的动态库,它们很容易集成到你的构建环境中。
使用 Clang Plugins 的典型例子:
- 为您的项目提供特殊的 lint-style 警告或错误
- 从单个编译步骤创建其他构建工件
在以下情况下使用 Clang Plugins:
- 如果任何依赖项发生更改,需要您的工具重新运行
- 希望您的工具创建或破坏一次构建
- 需要完全控制 Clang AST
在以下情况下不使用 Clang Plugins:
- 希望在您的构建环境之外运行工具
- 想要完全控制如何设置Clang,包括内存中虚拟文件的映射
- 需要在您的项目中运行一个特定的文件子集,这些文件不一定与可能引发重构的任何更改相关
3. LibTooling
LibTooling
是一个 C++ 接口,旨在编写独立的工具,并集成到运行 clang 工具的服务中。
使用 LibTooling 的典型例子:
- 一个简单的语法检查器
- 重构工具
在以下情况下使用 LibTooling:
- 希望在独立于构建系统的单个文件或文件的一个特定子集上运行工具
- 想要完全控制 Clang AST
- 想要与 Clang Plugins 共享代码
在以下情况下不使用 LibTooling:
- 希望作为依赖项更改触发的构建的一部分运行
- 希望有一个稳定的接口,这样当 AST API 发生变化时,您就不需要更改代码了
- 需要高级抽象,如 cursors 和开箱即用的代码完成
- 不想用 C++ 编写工具
Clang tools
是一组特定的开发人员工具,构建在LibTooling
基础设施之上,作为 Clang 项目的一部分。它们的目标是自动化和改进 C/C++ 开发人员的核心开发活动。
作为 Clang 项目的一部分,我们正在构建或计划的工具示例:
- 语法检查(
clang-check
) - 编译错误的自动修复(
clang-fixit
) - 自动代码格式化(
clang-format
) - 用于新语言标准中的新特性的迁移工具
- 核心重构工具