是否有任何论文描述了从编译程序推断子程序的任何算法/技术?换句话说:是否有一种算法可以找到在程序中出现多次的代码块?这些块可以重新排序指令(当然没有程序行为改变),这样就更有可能找到匹配。
这个过程可以看作与编译器完成的子程序内联相反,以避免调用,但增加了二进制大小。
在我看来,这是一个非常困难的理论问题。
答案 0 :(得分:6)
嗯,这是一个有趣的问题。人们确实在这方面工作。快速搜索会返回这两个:
Keith D. Cooper,Nathaniel McIntosh:Enhanced Code Compression for Embedded RISC Processors,PLDI 1999。
Christopher W. Fraser,Eugene W. Myers,Alan L. Wendt:Analyzing and Compressing Assembly Code,SIGPLAN Notices,1984年6月。
但可能还有更多。您可以使用Google Scholar查找最近引用这些旧文章的论文。
答案 1 :(得分:3)
您正在寻找的是“克隆探测器”。您可以在源代码或目标代码上执行此操作。关键的想法是决定你想接受哪些变化点。
你可以 read about our CloneDR克隆探测器,它通过比较源文件的语法树找到重复的代码,找到精确匹配和接近未命中的匹配。它跨多个文件而不是仅在一个源文件中。这有点像“常见的子表达式”检测,但它适用于声明和可执行代码。当匹配不准确时,它可以确定“子程序”(抽象)的参数。
请参阅我在Clone Detection Using Abstract Syntax trees上的论文获取算法说明。
CloneDR使用language-precise front end parsers为多种语言执行此操作。
该网站介绍了CloneDR的工作原理,并将CloneDR与其他一些克隆检测工具进行了比较。
CloneDR不处理“指令重新排序”。通过比较PDG找到重复项的可扩展性较低的方法可以做到这一点。这些非常接近于比较数据流图,这可能有助于查找机器指令代码匹配。
答案 2 :(得分:-1)
也许这是愚蠢的..但考虑“差异”。它基本上是一个受限制的版本。