如何从复杂算法中提取活动代码路径
How to extract the active code path from a complex algorithm
最近我被一个有趣的想法所迷惑。
我想知道是否有一种(已知的)方法可以从大型复杂算法中提取已执行的源代码。我将试着详细说明这个问题:
场景:这个复杂的算法很多人已经研究了很多年。该算法为复杂的测量设备创建测量描述。
算法的输入是一大组输入参数,我们称其为recipe。基于这个配方,执行算法,配方确定算法中遵循哪些函数、循环和if-then-else结构。算法完成后,输出一组计算得到的测量参数。有了这些输出测量参数,设备就可以进行测量了。
现在,有一个问题。由于算法随着时间的推移变得如此复杂和庞大,当您想为食谱添加新功能时,很难在算法中找到自己的方式。基本上,一个人只希望修改受其配方影响的函数和代码块,但他/她必须深入整个算法并分析代码,以查看哪些代码与他/她的配方相关,只有在此过程之后,才能在正确的位置添加新功能。即使是简单的添加,人们也容易迷失在大量复杂的代码中。
解决方案:提取活动代码路径?我对这个问题进行了头脑风暴,我认为如果有一种方法可以处理带有输入参数(配方)的算法,并且只将活动函数和代码块提取到一组新的源文件或代码结构中,那将是非常棒的。我这里说的是提取真正的源代码。
当活动代码被提取和隔离时,这将导致源代码的一个子集,它只是原始源代码结构的一小部分,并且对于人们分析代码,理解代码并进行修改将会容易得多。最终,这些更改可以合并回算法的原始源代码,或者修改后的提取的源代码也可以单独执行,就好像它是原始算法的"精简"版本。
额外信息:我们讨论的是一个包含C和c++代码的算法,大约有200个文件,可能有10万行代码。代码是用基于Visual Studio的自定义构建环境编译和构建的。
所以…:我真的不知道这个想法是幼稚和愚蠢的,还是在适当的软件工程下是可行的。我可以想象在软件工程的世界里还有更多类似的情况,但我就是不知道。
我在软件工程方面有一些经验,但绝对不是在设计大型复杂系统的水平上。
我将感谢任何形式的回答,建议或评论。提前感谢!
其他反对者说你不能这样做。我不同意。
标准的静态分析是确定通过代码的控制和数据流路径。有时这样的工具必须对可能发生的事情做出假设,因此这样的分析往往是"保守的",并且可能包含比实际最小值更多的代码。但是任何不相关代码的消除听起来都会对你有所帮助。
此外,您可以为特定的程序输入提取控制和数据流路径。然后,在提取算法不确定可能发生什么情况的地方,它可以检查特定的输入会导致什么情况发生。这将以必须向工具提供有效输入为代价获得更精确的结果。最后,使用测试覆盖率工具,您可以相对容易地确定为感兴趣的特定输入执行的代码,以及为不那么感兴趣的情况执行的另一个输入的代码,并计算集差。这给出了有趣的情况下执行的代码,这与无趣的情况不同。
我的公司构建构建程序分析工具(参见我的个人简介)。我们通过静态分析来提取c++源代码上的控制和数据流路径,并且可以相当容易地照亮所涉及的代码。我们还制作了c++测试覆盖工具,它可以收集有趣的和无趣的集合,并显示叠加在源代码上的差异。
恐怕你的尝试在数学上是不可能的。问题是这个
当算法完成后将会输出一组计算出来的测量参数。
是不可能通过静态代码分析确定的。
你所遇到的本质上是停机问题的一个变体,这个问题已经被证明,不可能有一个算法/程序可以确定,如果一个算法输入它,是否会在有限的时间内产生一个结果。
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 如何从 std::atomic 中提取指针 T<T>?
- 为什么istream不支持右值提取
- 如何设置一个范围来提取我想要获得的信息
- 视觉工作室项目.提取源文件夹名称
- C++17 - 使用自定义分配器的节点提取/重新插入 - 适用于 clang++/libc++,但不适用于 libstd
- 从字符串中提取整数并形成一个数组
- C ++中的StringStream有助于使用向量从字符串中提取逗号分隔的整数,而不是空格分隔的整数,为什么?
- asn1c 不会从 asn.1 模块中提取八位字节字符串的默认值
- 从 std::vector<无符号字符>切片中提取 int?
- 在C++中使用重载提取运算符时出现问题
- 在 Qt(C++) 中使用 QProcess 解压缩 - 提取目录问题
- C++(.cpp文件和.h文件)拆分代码并添加一个函数,提取 - 这很容易吗?
- 无法从 std::string 中提取C++ Unicode 符号
- 当可输入框在窗口中处于活动状态时获得通知的任何方法
- 如何从也包含C++字母的文本文件中提取某些数字?
- 如何从适合一定范围的数字中提取数字?
- C++从通用引用中提取实际类型
- 从运行服务的应用程序代码中提取窗口句柄
- 如何从复杂算法中提取活动代码路径