重新編輯:
要在我的建議闡述用於確定相同的功能,下面的流可被提示:
等級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