简单推荐一个 c++ 工具:C++ Insights,用来从编译器视角去看 c++ 的源码。对于我们了解代码细节很有帮助。

Compiler Explorer 这种是提供从源码到汇编或 IR 的转换,转换后的内容可读性还是相对于源码差了些。而 C++ Insights 是从源码转换到更加详细的源码,把编译器看到的给展开。如 autotemplatedecltype 得到的类型、lambda 、range-for 循环的转换、潜藏的隐式类型转换等。

它是基于 clang 实现的从源码到源码(source-to-source) 的转换工具,使用了未经优化的 clang 的 AST(语法树) 来进行操作。

主要实现逻辑在 Insights.cpp 当中,可以看到使用的是 ClangTool 类去对源文件进行解析。这是使用了 LibTooling 的支持,LibTooling 是一个提供 clang 技术支持的库,用来构建独立的工具。可以直接对这个库进行使用,而不需要对 clang 可执行文件有任何的依赖。而且,APIs 被设计得更加抽象(high-level,更高层级),所以不需要考虑任何的 clang 内部细节。也就是说,这本身也是一个 Clang Tool,也即使用 LibTooling 方式构建出来的工具,比如 clang-refactor 用于重构代码。

匹配 AST 使用的是 clang::ast_matchers::MatchFinder,重写 AST 节点使用的是 clang::Rewriter 类。如果想自己写一个类似的工具,这里面的 handler 是不错的参考。

参考