如何从复杂算法中提取活动代码路径

How to extract the active code path from a complex algorithm

本文关键字:提取 活动 代码 路径 算法 复杂      更新时间:2023-10-16

最近我被一个有趣的想法所迷惑。

我想知道是否有一种(已知的)方法可以从大型复杂算法中提取已执行的源代码。我将试着详细说明这个问题:

场景:这个复杂的算法很多人已经研究了很多年。该算法为复杂的测量设备创建测量描述。

算法的输入是一大组输入参数,我们称其为recipe。基于这个配方,执行算法,配方确定算法中遵循哪些函数、循环和if-then-else结构。算法完成后,输出一组计算得到的测量参数。有了这些输出测量参数,设备就可以进行测量了。

现在,有一个问题。由于算法随着时间的推移变得如此复杂和庞大,当您想为食谱添加新功能时,很难在算法中找到自己的方式。基本上,一个人只希望修改受其配方影响的函数和代码块,但他/她必须深入整个算法并分析代码,以查看哪些代码与他/她的配方相关,只有在此过程之后,才能在正确的位置添加新功能。即使是简单的添加,人们也容易迷失在大量复杂的代码中。

解决方案:提取活动代码路径?我对这个问题进行了头脑风暴,我认为如果有一种方法可以处理带有输入参数(配方)的算法,并且只将活动函数和代码块提取到一组新的源文件或代码结构中,那将是非常棒的。我这里说的是提取真正的源代码。

当活动代码被提取和隔离时,这将导致源代码的一个子集,它只是原始源代码结构的一小部分,并且对于人们分析代码,理解代码并进行修改将会容易得多。最终,这些更改可以合并回算法的原始源代码,或者修改后的提取的源代码也可以单独执行,就好像它是原始算法的"精简"版本。

额外信息:我们讨论的是一个包含C和c++代码的算法,大约有200个文件,可能有10万行代码。代码是用基于Visual Studio的自定义构建环境编译和构建的。

所以…:我真的不知道这个想法是幼稚和愚蠢的,还是在适当的软件工程下是可行的。我可以想象在软件工程的世界里还有更多类似的情况,但我就是不知道。

我在软件工程方面有一些经验,但绝对不是在设计大型复杂系统的水平上。

我将感谢任何形式的回答,建议或评论。

提前感谢!

其他反对者说你不能这样做。我不同意。

标准的静态分析是确定通过代码的控制和数据流路径。有时这样的工具必须对可能发生的事情做出假设,因此这样的分析往往是"保守的",并且可能包含比实际最小值更多的代码。但是任何不相关代码的消除听起来都会对你有所帮助。

此外,您可以为特定的程序输入提取控制和数据流路径。然后,在提取算法不确定可能发生什么情况的地方,它可以检查特定的输入会导致什么情况发生。这将以必须向工具提供有效输入为代价获得更精确的结果。

最后,使用测试覆盖率工具,您可以相对容易地确定为感兴趣的特定输入执行的代码,以及为不那么感兴趣的情况执行的另一个输入的代码,并计算集差。这给出了有趣的情况下执行的代码,这与无趣的情况不同。

我的公司构建构建程序分析工具(参见我的个人简介)。我们通过静态分析来提取c++源代码上的控制和数据流路径,并且可以相当容易地照亮所涉及的代码。我们还制作了c++测试覆盖工具,它可以收集有趣的和无趣的集合,并显示叠加在源代码上的差异。

恐怕你的尝试在数学上是不可能的。问题是这个

当算法完成后将会输出一组计算出来的测量参数。

是不可能通过静态代码分析确定的。

你所遇到的本质上是停机问题的一个变体,这个问题已经被证明,不可能有一个算法/程序可以确定,如果一个算法输入它,是否会在有限的时间内产生一个结果。