如何从其源代码为任何应用程序创建数据流图 (DFG/SDFG)

How can one create a data flow graph (DFG/SDFG) for any application from its source code

我做了很多研究来弄清楚如何从源代码为应用程序创建 DFG。对于某些应用程序,例如 MP3 解码器、JPEG 压缩和 H.263 解码器,可以在线使用 DFG。

我一直无法弄清楚如何从其源代码为 HEVC 等应用程序创建 DFG?是否有任何工具可以立即为如此复杂的应用程序生成数据流图,还是必须手动完成?

请大家多多指教。

编辑: 我为 HEVC 使用了 Doxygen,我可以看到不同的功能是如何相互作用的。然而,每个函数都有许多入口点和出口点,一段时间后 Doxygen 的输出变得太混乱而无法理解。

我也看了 StreamIt:http://camlunity.ru/swap/Library/Conflux/Stream%20Programming/streamit-cc_stream_graph_programming_language.pdf

它看起来很方便,但它为更简单的应用程序(如 MP3 解码器)生成的图表太复杂了。 为了生成连贯的 DFG,我是否必须重写整个源代码?

您想从任意语言中提取数据流图。你暗示你想要一种单一的方法来做到这一点。手工操作不实用...你需要一个工具。

这样的工具非常难以构建。

为此,对于每种语言,您必须能够:

  • 以您在实践中找到的形式(不仅仅是语言参考手册版本)为工具定义语言。与标准相比,野外的 C++ 有很多有趣的地方。
  • 用现场发现的语言解析程序,也许是一个文件,也许是数万个;有些程序不小。
  • 构建表示语言元素及其相互关系的结构(这通常作为抽象语法树完成)
  • 确定每个文字的实际值是什么; "a\xbc" 具有非常不同的值,具体取决于语言认为它是带有转义序列的 ascii 还是 unicode 文本
  • 找到代码中的所有标识符,并根据语言范围规则
  • 为每个标识符确定与之关联的definitional/type信息
  • 确定数据源(文字值、来自外部世界的输入、表达式的结果)并跟踪这些数据值在程序的其他部分中跨各种控制流结构的使用位置
  • 大概画出结果数据流的一些图。

这些任务本身都很困难,因为语言往往很复杂。大多数可以做到这一点的语言工具(主要是编译器)只对语言的一种方言做到这一点。

要为多个 language/dialect 执行此操作,您需要一个可以针对每种语言的所有详细信息进行配置的工具,并且您必须针对所有感兴趣的语言进行配置。 [实际上你不能 "do them all";现在有数千种计算机语言在使用。

即使限制自己使用 "everyday" 通用编程语言,这也是一项 巨大的 工作量;对于一种主流语言,可能需要几年时间才能做好所有这些工作。你一个人做不到。

我的公司构建了一个单一的、统一的工具,旨在能够做到这一点:DMS Software Reengineering Toolkit. The simple "secret" is to realize that the machinery needed to accomplish the above tasks 实际上在不同语言之间非常相似,并且可以设计为针对特定语言进行配置,相对适度 (这并不意味着 "small") 努力。

经过 20 线性年的工程 与博士级工程师团队,我们有 parsers (even this is hard) for a surprising variety of languages, with full up data flow analyzers of the type you are talking about for C++ (check this link for examples)、C、COBOL 和几乎 Java 8.

我不知道有任何其他统一工具可以在您实现理想的道路上走这么远。在你决定我对此一无所知之前,先检查一下我的简历。 (Rascal/MPL 有一些雄心壮志,但在这一点上是一种研究工具;他们根本不做 C 或 C++)我们只是完成了一部分,还有许多语言和规模的战斗要打。

[DMS 的目标不是数据流分析;那只是一块垫脚石。就是做自动化的代码转换,需要数据流分析才能安全正确的做。

当然,您可能只是希望为每种语言找到一个单独的工具。如果您确实可以获得一整套此类工具,那么您将无法从不同作者的不同工具中获得一致的质量或一致的 style/granularity 数据流图。