是否有任何论文描述了从编译程序中推断子程序的任何算法/技术?换句话说:是否有一种算法可以找到在程序中出现多次的代码块?这些块可以重新排序指令(当然没有程序行为改变),以便更有可能找到匹配项。
这个过程可以看作与编译器为避免调用而完成的子例程内联相反,但会增加二进制大小。
在我看来,这是一个非常困难的理论问题。
是否有任何论文描述了从编译程序中推断子程序的任何算法/技术?换句话说:是否有一种算法可以找到在程序中出现多次的代码块?这些块可以重新排序指令(当然没有程序行为改变),以便更有可能找到匹配项。
这个过程可以看作与编译器为避免调用而完成的子例程内联相反,但会增加二进制大小。
在我看来,这是一个非常困难的理论问题。
嗯,这是一个有趣的问题。人们确实在这方面工作。快速搜索会返回这两个:
Keith D. Cooper,Nathaniel McIntosh:嵌入式 RISC 处理器的增强代码压缩,PLDI 1999。
Christopher W. Fraser、Eugene W. Myers、Alan L. Wendt:分析和压缩汇编代码,SIGPLAN 通告,1984 年 6 月。
但可能还有更多。您可以使用Google Scholar查找更多引用这些旧论文的最新论文。
您正在寻找的东西称为“克隆检测器”。您可以在源代码或目标代码上执行此操作。关键思想是决定您想要接受哪些可变点。
您可以阅读我们的 CloneDR克隆检测器,该检测器通过比较源文件的语法树、查找精确匹配和未命中匹配来查找重复代码。它跨越许多文件,而不仅仅是在一个源文件中。这有点像“公共子表达式”检测,但它适用于声明以及可执行代码。当匹配不准确时,它可以确定“子程序”(抽象)的参数。
有关算法描述,请参阅我关于使用抽象语法树进行克隆检测的论文。
CloneDR 使用语言精确的前端解析器为多种语言执行此操作。
该站点描述了 CloneDR 的工作原理,并将 CloneDR 与许多其他克隆检测工具进行了比较。
CloneDR 不处理“指令重新排序”。通过比较 PDG 来查找重复项的可扩展性较差的方法可以做到这一点。这些非常接近于比较数据流图,这可能有助于查找机器指令代码匹配。
也许这很愚蠢..但考虑“差异”。它基本上是一个受限版本。