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

a_s*_*sid 5 algorithm parallel-processing open-source dataflow data-structures

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

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

请就此事给我建议。

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

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

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

Ira*_*ter 5

您想从任意语言中提取数据流图。你暗示你想要一种方法来做到这一点。手工这不切实际……你需要一个工具。

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

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

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

这些任务中的每一个本身都很困难,因为语言往往很复杂。大多数完全可以执行此操作的语言工具(主要是编译器)仅针对该语言的一种方言执行此操作。

要为一种以上的语言/方言执行此操作,您需要一个可以针对每种语言的所有详细信息进行配置的工具,并且必须针对所有感兴趣的语言进行配置。[实际上你不能“全部完成”;现在有成千上万种计算机语言在使用]。

即使将自己限制在“日常”通用编程语言中,这也是一项巨大的工作;对于一种主流语言来说,做好这一切可能需要几年时间。你自己不会成功地做到这一点。

我的公司构建了一个单一的、统一的工具,旨在能够做到这一点:DMS 软件再造工具包。简单的“秘密”是意识到完成上述任务所需的机制实际上在不同语言之间非常相似,并且可以设计为以相对适度(并不意味着“小”)的努力为特定语言进行配置。

经过与博士级工程师团队的20 年的工程设计,我们拥有用于令人惊讶的各种语言的解析器(即使这很难),以及您正在谈论的C++类型的完整数据流分析器(查看此链接示例)、C、COBOL 和几乎 Java 8。

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

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

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