【问题标题】:How to determine whether 2 code snippets are functionally same?如何确定 2 个代码片段在功能上是否相同?
【发布时间】:2015-08-25 19:59:18
【问题描述】:

给定 2 个代码 sn-ps,我想检查它们在功能上是否相似。通过功能相似性,我的意思是当提供相同的输入时它们应该产生相同的输出。 我正在从给定的代码 sn-p 中提取特征集:

  1. 句法方法:使用基本的 NLP 技术,如词干提取、拆分等。
  2. 语义方法:使用 AST 规范化代码 sn-p 例如:将“for”转换为“while”等。

在形成标记后,我使用主题建模算法(如潜在狄利克雷分配、概率潜在语义索引等)在给定代码 sn-p 中查找主题并将其与其他代码 sn-p 的主题匹配。虽然我知道这是一个难题,但该方法的准确性远低于我的预期。

如果我能获得任何关于更有效的算法/技术的指针/想法,那就太好了。

编辑:我不期待通用方法。任何能给出具有一定精度的近似结果的方法都可以。

【问题讨论】:

    标签: machine-learning nlp artificial-intelligence language-features feature-extraction


    【解决方案1】:

    请参阅https://en.wikipedia.org/wiki/Rice%27s_theorem - 无法确定代码 sn-p 是否计算特定函数,因此您也无法确定两个代码 sn-ps 是否计算相同函数。所以不可能有一个通用的算法来实现你想要的。您可能会发现在某些情况下或对任何语言的特定子集都有效的东西,但在一般情况下永远不会。

    【讨论】:

    • 是的,我已经读过它(类似于停止问题)。我们不需要完全相似的匹配,我们需要能够提供不错准确性的概率方法。
    • 因此,您需要一个算法,该算法将两个代码 sn-ps 作为输入,并想决定它们是否计算类似的东西——这仍然是一个函数——你无法逃避赖斯定理。您可以实现一个算法,给定两个代码 sn-ps,它们是否具有相同的规范化表示或相同的规范化 AST - 但是您已经离开了一般情况。如果您想要通过模拟或类似的方法来获得概率方法 - 您要测试无限输入集的哪一部分?
    • 现在,如果我能够获得代码 sn-ps 的规范化表示,我会很高兴。一般情况肯定是没有问题的。任何关于标准化表示位的线索将不胜感激!
    • 我强烈怀疑这会导致一些有用的东西,而不仅仅是检测变量的简单重命名(但也许这对你来说已经足够了,然后按照你自己建议的方式去做)。您不仅需要算术表达式的规范化(a * a - b * b 必须等价于 (a+b)*(a-b),a+a+a 必须等价于 3*a,但还有各种优化的东西,比如 1+2+...+n 与 n*(n+1)/2 相同,只是为了进行一些突出的数学简化。然后你仍然远离任何简单的东西,比如剥离for 或 while 的第一次迭代。
    • 作为附加评论:只需考虑 4 种不同的方法来确定一个数字是否为素数 - 这 4 个代码的(标准化)表示根本不会相似 - 另一方面,采取一个简单的 while (n>0) n--;循环与 while (n>0) n++;循环(使用无符号整数 n) - 归一化表示将是相似的,但计算的函数根本不相似。也许让你的应用程序/目标更清楚你需要什么以及“具有相当准确性的概率方法”的含义 - 对不起,但忽略赖斯定理通常是一个时间杀手。
    猜你喜欢
    • 2012-01-16
    • 2016-10-29
    • 2015-12-02
    • 2011-06-26
    • 1970-01-01
    • 2011-08-29
    • 2012-07-24
    • 1970-01-01
    • 2022-07-19
    相关资源
    最近更新 更多