是否存在用于自动可视化项目源代码内联控制流的工具?

Does a Tool for Automatically Visualizing a Project's Source Code's Control Flow In-Line Exist?

我希望能够使用一种工具,让您在程序的源代码上下文中可视化程序的控制流。澄清一下,这样的工具基本上应该通过以 multidigraph 的形式吐出一个人类可读的抽象语法树来显示程序中发生的事情,其中​​节点包含源代码翻译单元的片段。我推测,生成的图形初始节点将包含以程序入口点开始的代码块(对于 C 或 C++ 程序,该入口点为 main。)当节点需要引用时,将创建新节点另一个代码块,无论它可能在当前文件中还是在另一个文件中,箭头将连接节点。这样的工具是否存在,还是必须从头开始创建?

您不会获得现成的针对任意语言执行此操作的工具。语言太多了,每种语言都有自己的语法和语义。您以某种方式需要每种语言的工具。您可能会为非常常用的语言找到此类工具,例如 Understand for Software.

我认为做到这一点的唯一方法是构建能够相对轻松地构建特定于语言的工具的元工具。这样的工具必须具有所有此类语言处理工具所需的通用机制:强大的解析器(因此为语言编写语法相对简单)、AST 构造机制、符号 table 支持、构建控制和数据流图的例程.通过提供这样的机器,可以以适度的成本构建语言前端。

class 工具可以做到这一点,program transformation。他们中的大多数都有解析引擎,但没有我上面建议的其余机制。

我相信这足以让我投入 20 年的生命来建设 这样的元工具。我们的 DMS Software Reengineering toolkit shows its strength in being able to parse some 50+ languages, including the stunningly hard C++14 (both MS and GNU variants). It shows symbol table support and control flow graph construction 用于 COBOL,Java,C,C++。 (我们不能一次做所有事情;尽可能快地踩踏板)。 [DMS 将这些图构建为数据结构而不是 "showing" 它们;该页面上的示例是在 DOT 的额外帮助下绘制的。

尝试执行此操作的其他少数工具之一是 Clang/LLVM;这涵盖了多种流行语言。据我所知,Clang 没有任何特定的解析支持;您可以自己编写所有代码。我认为只有在将语言转换为 LLVM 之后才能获得控制流图。我也不认为它对绘制控制流图有任何具体支持。

space 中一个在多语言支持方面享有盛誉的旧工具是 CoCo/R; 我对此了解不多。我知道它解析, 并且对 AST 有一些支持;我不知道它是做什么的 关于控制流分析。