五款經典代碼閱讀器的使用方案對比
一、背景
談起代碼閱讀,大部分技術人員都不會陌生。無論是剛開始學習代碼的小白還是久經沙場的代碼大神,不管是學習優(yōu)秀的開源項目還是做老項目的重構,代碼閱讀都是技術人的必備技能之一。在目前業(yè)務迭代迅速的環(huán)境下,高效地梳理代碼能夠極大程度上提高開發(fā)人員的工作效率,進一步為業(yè)務創(chuàng)造新價值。
筆者搜羅了幾種業(yè)內常用的代碼閱讀方案,并從效率,易用,成本以及是否可調試四個角度進行對比,讀者可以根據(jù)自己的喜好選擇合適的代碼閱讀方案,也可以在評論區(qū)留下代碼梳理的經驗,歡迎討論。
評分僅代表個人觀點
IDE 閱讀
效率:??
易用:??????
成本:????(部分IDE需要收費使用)
是否可調試:是
IDE(Integrated Development Environment)應該是每個技術人員每天工作中接觸時間最長的一類軟件,盡管不同語言有不同的IDE,但殊途同歸,IDE的核心功能是用來做代碼編輯,很多IDE也在代碼編輯層面做了性能上的優(yōu)化。
盡管各類IDE都通過各種方式實現(xiàn)了代碼閱讀以及代碼梳理的功能,但由于其作為編輯器的本質屬性,從代碼閱讀的角度來講面對很多大型項目易用性和效率比較低,難以快速閱讀代碼。
以Java為例,目前業(yè)界比較常見的IDE包括IntelliJ IDEA和Eclipse等,筆者比較熟悉IDEA,即以IDEA舉例。
就IDEA而言,除了通過鼠標點擊追蹤(Tips: mac下默認快捷鍵Command+B,windows下默認快捷鍵Ctrl+B)的方式閱讀代碼外,還有很多輔助閱讀代碼的插件,包括RainbowBrackets(多彩括號,多重嵌套代碼分析),Statistic(代碼行數(shù)統(tǒng)計),SequenceDiagram(時序圖繪制)等。
用SequenceDiagram自動化分析fastjson(1.2.84)中核心鏈路JSON.parseObject方法,可以看到大致的鏈路情況,但由于lambda表達式等比較難以解析,鏈路顯示不夠直觀。
盡管IDE能夠覆蓋日常工作中的大部分場景,但面對大型項目的分析(如Android源碼或者linux源碼)就捉襟見肘,其效率及易用性較低的原因主要有以下幾點:
絕大多數(shù)IDE對代碼的分析速度較慢。由于大多數(shù)IDE在代碼編輯層面做了優(yōu)化,加載代碼的過程需要消耗更多的資源(代碼之間的關系識別等)。同時,在加載大型代碼時,會造成嚴重的卡頓,影響用戶體驗;
針對代碼閱讀,很多IDE要求對代碼進行編譯,否則就會產生大量“飄紅”,無法進行代碼閱讀。一個大型項目往往需要非常久的編譯時間,并且環(huán)境配置的難度極大,降低了代碼閱讀的效率;
常用的IDE往往針對某種語言進行了特化(當然也有類似CLion的跨平臺IDE),對其他語言的支持程度不高,如果項目中存在跨平臺的問題往往難以通過單一IDE進行代碼閱讀。
微軟的VSCode面世后,很多開源作者陸續(xù)推出了代碼閱讀的魔法級插件(CodeRunner,PartialDiff,TODOTree等等)以提升代碼閱讀體驗,相信在各路大神的努力下,IDE閱讀法終將成為最好的代碼梳理方法。
Source Insight
效率:??????????
易用:????
成本:??????????
是否可調試:支持第三方命令
官方網站(地址:https://www.sourceinsight.com/)
世界上只有兩種人,用過SI的人和沒用過SI的人,SI的出現(xiàn)讓很多開發(fā)人員第一次感受到了代碼閱讀的快樂(相信很多Android開發(fā)者都用這個神器閱讀過Android源碼)。如果說IDE是專注于代碼編寫的平臺,那么SI就是專注于代碼分析的神器。SI為開發(fā)人員提供了以下核心功能:
- 快速的代碼分析:SI能夠通過內置引擎快速分析代碼,并形成繼承樹以及函數(shù)調用樹,占用資源量極小。
- 準確的代碼查找:SI支持快速查看函數(shù)和變量使用位置的功能,幾乎立即自動顯示對函數(shù)、變量、類等的引用。
- 多種語言支持:Source Insight 內置了針對 C/C++、C#、Java、Objective-C 等語言的動態(tài)分析工具。
SI幾乎能夠完成代碼鏈路分析中的全部工作,但它也有著不容忽視的缺點:
- 成本較高。SI是收費軟件,需要繳納高昂的費用才能使用其全部功能。
- SI僅支持Windows平臺,Mac平臺想要使用必須安裝虛擬機(推薦下CrossOver)。
- 界面樣式較老且沒有官方中文插件,這導致了其易用性較低。
Understand
效率:????????
易用:??????????
成本:??????????
是否可調試:支持第三方命令
官網網站(https://www.scitools.com/)
Understand是一款小眾的代碼閱讀工具,國內的使用人群不多(主要原因是太貴了,并且沒有Souce Insight那么多魔法可用),但有很多外國公司利用該軟件進行日常的代碼分析以及缺陷查找工作。Understand的核心功能和Source Insight比較類似,包括:
- 強大的圖形繪制能力,包括繼承關系圖,函數(shù)調用圖,包含關系圖等等。
- 豐富的標識符信息,具有強大的代碼信息數(shù)據(jù)庫,能夠存儲代碼相關的各類符號信息。
- 方便的搜索功能,能夠快速查找及定位指定的標識符。
利用Understand通過代碼直接生成流程圖,相比較而言個人更喜歡Understand生成的各類圖形,樣式而言比Source Insight更為優(yōu)雅
相比Source Insight,Understand支持在Mac平臺及Linux平臺上運行,但從用戶的反饋看在進行代碼分析時存在著一定的資源消耗過多的現(xiàn)象。與Source Insight一樣,Understand也是需要付費的,而且沒有免費試用版本,同時也不支持中文。
OpenGrok
效率:??????
易用:??
成本:無(開源)
是否可調試:否
官網網站(https://oracle.github.io/opengrok/?)
OpenGrok是一款用 Java 編寫的高效源代碼搜索和交叉引用查詢引擎,能夠幫助開發(fā)人員深入了解代碼,主要具有以下幾個核心功能:
- 強大的依賴分析能力,借助內置的Analysis引擎,OpenGrok支持多種版本管理工具,能夠根據(jù)代碼的提交歷史進行代碼分析,并為源碼的變量/對象、結構體/類、函數(shù)/接口、宏等生成可供快速搜索的索引文件。
- 快速高效的代碼搜索功能,支持不同類別的搜索并直達代碼。
OpenGrok對代碼管理工具做了特化性的支持,能夠便捷快速地看到對應代碼行的提交信息以及提交歷史。
相對而言,OpenGrok在同類產品中具備一定的優(yōu)勢,其搜索速度以及文件加載速度較快,但其使用方法比較復雜,學習成本相對較高,并且也沒有強大的可視化能力。由于OpenGrok核心依賴于Tomcat或其他web容器服務,需要用戶根據(jù)系統(tǒng)環(huán)境自行配置(官方配置文檔,地址:https://github.com/oracle/opengrok/wiki/How-to-setup-OpenGrok),整體而言易用性較低,應根據(jù)實際需要謹慎使用。
Sourcetrail
效率:??????
易用:????????
成本:無(開源)
是否可調試:支持IDE調試
官網網站(https://github.com/CoatiSoftware/Sourcetrail)
和OpenGrok一樣,Sourcetrail也是一款開源的代碼分析工具,并支持跨平臺代碼分析。Soucetrail提供了以下幾個功能:
- 以腦圖的形式展示了函數(shù)調用鏈路。在分析代碼的同時,Sourcetrail提供了優(yōu)雅的圖形化界面以展示工程項目中的各類標識符信息以及鏈路圖,能夠讓人更為直觀地了解整個工程的鏈路信息。
- 優(yōu)秀的跨平臺支持,提供了Linux,Mac以及Windows等多個平臺的安裝包。
- 提供了擴展接口,可用于自定義語言分析。
Sourcetrail是一款非常強大的代碼分析工具,使用起來非常簡單靈活,而且還可以關聯(lián)IDE。但是其對軟件拓撲的分析存在一定局限性,并且作者已經宣布不再更新,需要根據(jù)使用場景謹慎選用。
實戰(zhàn)測試
在該模塊,我們將針對一款開源軟件的核心鏈路分別采用上述幾種代碼閱讀方案進行分析,以對比各類工具在實際操作中的效果。由于Source Insight和Understand均需要收費,本次僅采用IDE閱讀法,OpenGrok以及Sourcetrail進行核心鏈路的簡要分析。
- 目標代碼:fastjson(代碼地址:https://github.com/alibaba/fastjson)
- 代碼版本:1.2.76
- 代碼語言:Java
IDE閱讀
由于閱讀的目標是java代碼,擬采用IntelliJ IDEA進行代碼閱讀。
? 核心代碼定位
我們在閱讀代碼時常常通過一個核心方法入手,接著逐層進行代碼分析。針對本次代碼閱讀,以JSON.parseObject方法作為入口進行代碼分析。JSON.parseObject方法主要功能在于將一個JSON的字符串解析成JSONObject的形式,JSONObject相當于fastjson中的基本運行單元,代表了一個具體的JSON塊。
可以看到,parseObject存在很多重載方法,為了找到核心方法,需要逐級查找,過程比較繁瑣。
? 核心代碼鏈路分析
在鏈路分析層面,首先可以分析核心類對應的繼承關系,以初步分析各個類之間的關聯(lián)關系。
接著可以借助各類插件實現(xiàn)初步的代碼分析,繪制時序圖,UML圖等等,但想要深入了解代碼結構還需要深入源碼進行閱讀,可視化支持程度不高。
OpenGrok閱讀
OpenGrok的安裝過程比較繁瑣,有web開發(fā)經驗的同學推薦根據(jù)官方文檔的安裝方式進行安裝及配置。
? 核心代碼定位
OpenGrok有著強大的代碼搜索功能,支持正則以及各類多條件表達式,并且由于預先進行了索引分析,代碼搜索的速度比常規(guī)IDE迅速了很多,能夠快速定位核心代碼。
? 核心代碼鏈路分析
OpenGrok的一大缺點在于其不支持代碼的可視化分析,在進行代碼閱讀時需要開發(fā)人員手動梳理鏈路。但其對代碼中的各類標識符(symbol)均增加了支持快速查找的鏈接,相比ide而言,在閱讀依賴關系比較復雜的代碼過程中能夠起到比較顯著的提效作用。
Sourcetrail閱讀
Sourcetrail官方提供了支持各類平臺的二進制安裝包,支持一鍵安裝,非??旖?。
? 核心代碼定位
Sourcetrail同樣集成了高效的代碼搜索功能,用戶可以在搜索欄全局搜索代碼。相比OpenGrok,Sourcetrail的界面設計更為清晰,但建立索引的速度相對較慢,且不能查看代碼的歷史提交信息。
該工具的一大優(yōu)點在于利用腦圖的形式展示了各類方法之間的調用關系,鏈路梳理比較清晰,能夠讓用戶快速找到核心代碼所在位置。
? 核心代碼鏈路分析
在代碼鏈路分析上,Sourcetrail沒有進行代碼的拓撲關系分析,但能夠通過點擊腦圖的形式結合代碼閱讀對代碼鏈路進行梳理。通過IDE插件的形式可以將Sourcetrail與IDE關聯(lián),有效提高我們代碼閱讀的效率。
總結
技術學習是一個不斷積累和沉淀的過程,優(yōu)秀的代碼閱讀工具能夠提高我們學習和積累的效率,相信每個技術人內心都有一套自己學習技術的方法,希望筆者的文章能夠幫助你在今后的學習與工作中提高效率,勇攀高峰。
團隊介紹
我們是大淘寶平臺會員技術團隊,負責整個淘寶天貓的平臺會員成長和運營,肩負著大盤GMV增長的重要職責。旗下會員體系豐富多樣,例如,88VIP會員體系串聯(lián)整個阿里經濟體并吸引了眾多外部生態(tài)伙伴的加盟,真正幫用戶實現(xiàn)了“吃、玩、聽、看、買、游”一條龍服務;淘寶省錢卡:通過全網通用紅包利益刺激,構建了更加靈活的權益型會員體系,為全網消費者提供了最為直接有效的省錢路徑。
同時,我們圍繞會員成長的生命周期構建了完整的會員成長體系,在支撐整個淘寶天貓平臺會員業(yè)務快速發(fā)展的同時,還橫向賦能了天貓會員店、行業(yè)卡、商家付費會員等新會員形態(tài),構建了可賦能全行業(yè)的會員基礎體系。