一尘不染

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

algorithm

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

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

请将此事告知我。

编辑:我将Doxygen用于HEVC,我可以看到不同的功能之间如何交互。但是,每个函数都有许多入口和出口点,过一段时间后,Doxygen的输出变得混乱不堪。

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

它似乎很方便,但是它为更简单的应用程序(如MP3解码器)生成的图形太复杂了。为了生成一致的DFG,我是否需要重写整个源代码?


阅读 971

收藏
2020-07-28

共1个答案

一尘不染

您想从任意语言中提取数据流图。您暗示您想要一种单一的方法。手动操作不可行… 您需要一个工具。

这样的工具很难构建。

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

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

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

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

即使将自己限制为“日常”通用编程语言,这也需要 大量 工作。对于一种主流语言,要花好几年才能做到所有这些。您将无法成功完成此任务。

我公司构建了一个旨在实现此目的的统一工具:DMS软件再造工具包。简单的“秘密”是要认识到,完成上述任务所需的机制实际上在各种语言中都是非常相似的,并且可以设计成以相对适度(并不意味着“小的”)的努力针对特定语言进行配置。

经过由博士级别工程师组成的团队进行了 20年的线性
工程之后,我们为各种令人惊讶的语言提供了解析器(即使是很难的),也提供了您正在谈论的C
++
类型的完整数据流分析器(请查看此链接以获取相关信息)示例),C,COBOL和几乎Java
8。

我不知道还有其他任何统一工具可以帮助您实现理想。在决定我对此一无所知之前,请检查我的简历。(Rascal /
MPL
有一些野心,但目前它只是一个研究工具;它们根本不使用C或C
++。)我们只是其中的一部分,还有许多语言和与之抗衡的规模战。

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

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

2020-07-28