重新编辑:
要在我的建议阐述用于确定相同的功能,下面的流可被提示:
等级1:删除任何空白不是一个字符串的一部分;在每个{
,;
和}
之后插入换行符并进行比较。如果相等;功能是相同的,如果不是:
级别2:移动所有变量声明和赋值,这些变量声明和赋值不依赖于在同一范围内定义的其他变量的状态到它们声明的范围的开始处(或if不想实际解析JS;大括号的开始);并按行长排序;将所有变量名称视为长度为4个字符,并且在长度相同时忽略变量名称。按字母顺序重新排列所有集合,并重命名所有变量vSNN
,其中v是文字,S是嵌套花括号的数量,NN是变量遇到的顺序。
比较;如果相等,则各功能是相同的,如果不是:
级别3:与"sNN"
,其中"
和s
是文字全部替换字符串文字,和NN
是在其中遇到串的顺序。比较;如果不相等,则功能相同:
级别4:根据字母顺序使用具有最高优先级的函数的名称标准化已知的任何函数的名称(在下面的示例中,到p_strlen()
任何呼叫将与c_strlen()
代替重复重新排序按如有必要1水平比较;如果相等,则各功能是相同的,如果不是,该功能几乎肯定是不相同
。原始回答:
我想你会发现你的意思是“相同”,而不是“相同”。
的区别,因为你会发现,是至关重要的:
两个功能相同如果按照规范化的某种方式,(除去非字面空格,重命名和重新排序变量标准化秩序,用占位符替换字符串文字,...)他们比较字面上相等。
两个函数是相同如果在任何给定的输入值被调用时它们会给出相同的返回值。在一般情况下,考虑一种编程语言,它计算了零终止字符串(如果您愿意的话,可以使用混合Pascal/C字符串)。函数p_strlen(str)
可能会查看字符串的字符数并返回该字符。函数c_strlen(str)
可能会计算字符串中的字符数并返回该字符数。
虽然这些函数肯定不会相同,但它们将是相同的:对于任何给定的(有效)输入值,它们将给出相同的值。
我的观点是:
确定阉两个功能是相同的(你似乎想达到什么)是(中等)很重要的问题,做你描述。
确定这两个函数是否真的是一样的(你可能想要实现的)是不平凡的;事实上,它很难完成,可能与Halting Problem有关,而不是静态分析可以做到的。
编辑:当然,这是相同的功能也相同;但以完全分析的高度特异且很少有用的方式。
对于第一级,您的计划将无法一直工作。例如,0011与00011“相同”,但空白标准化将不会看到那个;对于所有其他具有相同值的变体“拼写”也可以是字符,数字或字符串。对于JavaScript,你也担心“可选”分号。 – 2011-05-16 22:14:46