子程序推断

时间:2011-12-06 21:39:16

标签: assembly compiler-theory computation-theory information-theory

是否有任何论文描述了从编译程序推断子程序的任何算法/技术?换句话说:是否有一种算法可以找到在程序中出现多次的代码块?这些块可以重新排序指令(当然没有程序行为改变),这样就更有可能找到匹配。

这个过程可以看作与编译器完成的子程序内联相反,以避免调用,但增加了二进制大小。

在我看来,这是一个非常困难的理论问题。

3 个答案:

答案 0 :(得分: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)

也许这是愚蠢的..但考虑“差异”。它基本上是一个受限制的版本。