1

我對比較代碼以找到匹配感興趣,即查看兩個不同的代碼塊是否相同。例如,這裏有4個匹配的方法返回兩個數字的總和(以Java表示)。有沒有可以比較或解析多種語言的工具?

int sum(int a, int b){ 
    return a + b; 
} 

int sum(int a, int b){ 
    return b + a; 
} 

int sum(int a, int b){ 
    int sum = a + b; 
    return sum; 
} 

int sum(int a, int b){ 
    int total = a + b; 
    return total; 
} 

雖然很容易做到的源代碼兩塊文本比較,它的難寫的代碼,將認識到,上述比賽。這似乎是解析器或編譯器的工作,但它不需要是「完美」的,因爲它只是尋找匹配。

這是一個Rails網站,理想情況下它應該能夠在Ruby中工作,但我也可以運行一個單獨的服務。 Treetop是一種用於描述語法的語言,但描述語法也很困難。是否有現有的工具來比較多種語言(如Java,C++,Ruby和Python)的源代碼?

它只需要一次在一種語言的源代碼之間找到匹配,儘管如果它能夠在不同語言的源代碼之間找到匹配,它也會很酷。

更新:匹配不是產生相同結果的任何代碼,而是使用相同過程和步驟獲得相同結果的代碼。該工具不需要找到所有可能的匹配,但它應該能夠識別除了小差異之外相同的代碼,如變量名稱或順序(如上例所示)。

+0

你可以編寫單元測試並針對不同的實現運行它們。如果你想從Ruby測試Java方法,你需要使用JRuby。這可能值得一讀:https://github.com/jruby/jruby/wiki/CallingJavaFromJRuby –

+0

@plly,我希望它能夠找到沒有運行代碼的匹配。另外,匹配不是具有相同結果的任何代碼,而是具有相同方法的代碼(沒有文本完全匹配)。 – Ari

+1

可能的重複:http://stackoverflow.com/q/3450907/120163 –

回答

3

這個問題被稱爲功能問題:確定兩個程序是否計算相同的功能。已知是不可判定的,即這樣的工具不可能存在。

基本上,如果你有這樣的工具,那麼你可以問:一些相當於這個程序的程序P

while (true); 

,你會已經解決了停機問題。 (這不是實際上證明如何去,它要複雜多了,但是這是基本的想法。)

+0

我不需要它來查找每一個匹配,只是爲了找到比簡單文本比較更類似的匹配。例如,比較Java字節碼會比比較Java源代碼找到更多匹配。不過,我想要一些可以比較多種語言的東西,即使粗略一些。 – Ari

1

對於紅寶石看一看https://github.com/seattlerb/flay 對於C#ReSharper的可以告訴查找特定的代碼結構忽視名。不是你想要的,而是強大的。

我知道沒有什麼可以讓你比較語言....除非可能使用反射器,你可以反編譯.net字節碼回到C#然後使用resharper,從而在.net語言之間轉換。

+0

看看Flay。我想知道有一種方法可以修改它以與其他語言一起使用... – Ari

1

PMD CPD,支持多國語言,而且也有關於比較過程中忽略的東西,等

也期待在minification一些好的想法。你或許可以改進這一點,因爲你不需要結果像代碼管理員一樣仍然能夠像代碼那樣工作。但是你可能不會找到編譯語言的許多縮寫詞。還有一個我在這裏看到的潛在的陷阱 - 縮小版本,例如,只有混合參數的兩個函數可能在縮小時變得不那麼相似,這取決於縮小器如何重命名參數(它們通常只是按順序命名,例如abc,...)。

奈傑爾提到編譯。NET語言轉換爲字節碼,並反編譯 - 對於JVM字節碼甚至可能是二進制文件(或LLVM IR等)也是如此,但其中大部分對於您嘗試執行的操作而言太低級別每種方法涵蓋幾種語言,對於某些方法也可能非常困難或不可能。

如果你想對公共語言做一個非常近似的近似,你可以嘗試選擇一些常見的東西,比如函數頭,循環,花括號/縮進,並嘗試使用非常簡單的解析器使語言更加相似(使用例如文本替換和正則表達式)。例如你可以用def func(a,b)代替Java的public int func(int a, char b),對於Ruby,Scala和Python,在這種情況下你幾乎不需要做任何事情。這是一個糟糕的想法,但其中一些轉換很容易編寫,所以如果其他所有的轉換都失敗了,試着看看它是否能讓你獲得任何地方。如果你這樣做,記得寫單元測試 - 複雜語言的簡單解析器很容易破解。

編輯:另外還要看的一件事可能是編寫作業抄襲檢測器, http://theory.stanford.edu/~aiken/moss/

相關問題