2009-02-10 59 views
2

如果我想了解一般情況下的模式識別,那麼這將是一個很好的起點(推薦一本書)?查找源代碼中的模式

另外,有沒有人有任何經驗/知識如何去應用這些算法來找到程序中的抽象模式? (重複的代碼,做同樣的事情,但方式略有不同的代碼塊等)

感謝

編輯:我不介意計算密集型的書籍。事實上,這將是一件好事。

回答

2

如果你有合理的數學信心,那麼Chris Bishop的書籍「模式識別與機器學習」或「神經網絡模式識別」對學習模式識別非常有用。

+0

我不認爲這些對源代碼很有效,特別是大型系統。神經網絡需要檢查一百萬行代碼有多少輸入?它會有多少輸出節點,他們會認出什麼呢?請參閱CloneDR答案,瞭解實現此功能的實用工具(不使用神經網絡)。 – 2010-03-23 22:49:35

0

我會建議看一些開源項目的代碼(例如FindBugsSIM) ,這樣做的事情你在談論。

0

其他有趣的項目是PMDEclipse

Eclipse爲任何項目中的所有源代碼使用AST(抽象語法樹)。然後,工具可以註冊某些類型的AST(如Java源代碼)並獲得預處理視圖,在這些視圖中可以添加其他信息(如鏈接到文檔,錯誤標記等)。

1

如果您有權訪問編譯期間生成的分析樹,它會有所幫助。通過這種方式,您可以查找類似樹的碎片,忽略比您所查看的節點更深的節點,這樣您就可以挑選例如將兩個子表達式相乘的節點忽略子表達式的內容。您可以將相同的邏輯應用於一組節點,例如,您希望找到兩個子表達式的乘法,其中這兩個子表達式是更多子表達式的添加。你首先尋找乘法,然後檢查乘法下面的兩個節點是否是加法,忽略任何更深的。

+0

「尋找相似的樹的碎片」。有一件事要說,有效實施它是另一回事。請參閱CloneDR答案,它完全如此。 – 2010-04-06 08:16:46

0

您可以看到的另一個項目是Duplo - 它是一個開源/ GPL項目,因此您可以通過從SourceForge獲取代碼來仔細研究他們的方法。

0

這是特定於.Net和Visual Studio,但它會在您的項目中找到重複的代碼。它確實報告了我發現的一些誤報,但它可能是一個開始的好地方。

Clone Detective

0

一種模式是已經通過克隆複製和粘貼方法的代碼。請參閱CloneDR,該工具通過比較相關語言的抽象語法樹來自動找到此類代碼,儘管佈局變化甚至克隆體的變化。

CloneDR可以使用各種語言:C,C++,C#,Java,JavaScript,PHP,COBOL,Python ...該網站顯示各種編程語言的克隆檢測報告。