2010-05-19 34 views
7

我剛剛獲得了一份新任務,看起來像是一個有趣的挑戰。新語言的靜態代碼分析。從哪兒開始?

客戶希望爲其內部開發的代碼風格檢查工具(即將被開源)編程語言在JVM上運行。語言語法非常像Java。

客戶基本上希望我能生產類似checkstyle的產品。

所以我的問題是,你會如何解決這個問題?給定一個清晰的標準,你會給客戶什麼建議?

我想我有3個選擇

  1. 寫的東西從頭開始。我更喜歡不這樣做,因爲它似乎已經解決了很多次這樣的代碼分析工具問題,所以必須有更多的「框架」或「平臺」導向的方法。

  2. 叉現有的代碼風格檢查工具和修改解析,以適應這一新的語言等等等等

  3. 延長或插入到現有的靜態代碼分析工具。 (也許寫Yasca的插件嗎?)

回答

4

這樣的工具來看看基本都實現一個編譯器前端,至少在語言的子集。最簡單的出發點往往是爲了適應現有的編譯器前端,因此您應該首先查看客戶的編譯器。如果幸運的話,它將在前端和後端之間有一個清晰的分隔,並且可以按原樣使用它,並使用AST或前端生成的任何IR來做額外的分析。

+0

是的,或者如果這是不可能的話,請使用解析器生成器。 – 2010-05-19 22:58:40

0
+0

是的,FindBugs,PMD checkstyle等等012bc該文檔聲明其可擴展性,但它看起來像所有的魔法是在字節碼級完成。因此,開箱即可檢測生成的字節碼中的問題,但將這些錯誤映射到此新語言的源代碼可能非常困難。 – tinny 2010-05-19 23:20:19

1

你不想從頭開始寫這些東西。

查看DMS Software Reengineeering Toolkit。這具有通用的編譯器機制,用於解析,構建AST,構建符號表,構造/遍歷控制流以及數據流圖和調用樹。

DMS可以通過一個完整的Java前端來獲得,該前端可以構建AST,符號表和上面的流程分析。 DMS使用aplomb處理語言方言,因此應該儘可能直接修改此前端以匹配客戶的Java變體語言並獲取所有這些分析機器。

0

PMD呢?我已經使用了PMD多年,但從未真正深入到它的內部工作。

可以通過編寫自定義語言解析器來擴展PMD,這是通過在類路徑的JAR中提供以下實現來完成的。

net.sourceforge.pmd.cpd.Language
net.sourceforge.pmd.cpd.Tokenizer

http://pmd.sourceforge.net/cpd-parser-howto.html

然後通過使用PMD rule designer我可以從所得的AST定義規則。

我喜歡關於PMD的一點是它在Java領域廣泛認可的代碼分析工具,因此有很多第三方支持。 E.g Eclipse插件,Hudson CI插件等等