4閱讀開原始碼工具
工欲善其事,必先利其器。閱讀原始碼最好的工具是understand,用Source Insight也可以,至於Understand工具的提示和方法參見代碼閱讀分析工具Understand使用總結這篇文章。
5閱讀原始碼的技巧
最後,對於在這篇文章中提到的分析原始碼程式的一些方法做一下小結,以作為本文的結束。
5.1分析一個原始碼,一個有效方法是:
a、閱讀原始碼的說明文檔,比如原始碼中的README, 作者寫的非常的詳細,仔細讀過之後,在閱讀程式的時候往往能夠從README檔案中找到相應的說明,從而簡化了來源程式的閱讀工作。
b、如果原始碼有文檔目錄,一般為doc或者docs, 最好也在閱讀來源程式之前仔細閱讀,因為這些文檔同樣起了很好的說明注釋作用。
c、從makefile檔案入手,分析原始碼的階層,找出哪個是主程式,哪些是函數包。這對於快速把握程式結構有很大協助。
d、從main函數入手,一步一步往下閱讀,遇到可以猜測出意思來的簡單的函數,可以跳過。但是一定要注意程式中使用的全域變數(如果是C程式),可以把關鍵的資料結構說明拷貝到一個文字編輯器中以便隨時尋找。
e、分析函數包(針對C程式),要注意哪些是全域函數,哪些是內部使用的函數,注意extern關鍵字。對於變數,也需要同樣注意。先分析清楚內建函式,再來分析外部函數,因為內建函式肯定是在外部函數中被調用的。
f、需要說明的是資料結構的重要性:對於一個C程式來說,所有的函數都是在操作同一些資料,而由於沒有較好的封裝性,這些資料可能出現在程式的任何地方,被任何函數修改,所以一定要注意這些資料的定義和意義,也要注意是哪些函數在對它們進行操作,做了哪些改變。
g、在閱讀程式的同時,最好能夠把程式存入到SVN之類的版本控制器中去,在需要的時候可以對原始碼做一些修改實驗,因為動手修改是比僅僅是閱讀要好得多的讀程式的方法。在你修改運行程式的時候,可以從SVN中把原來的代碼調出來與你改動的部分進行比較(diff命令), 可以看出一些原始碼的優缺點並且能夠實際的練習自己的編程技術。
h、閱讀程式的同時,要注意一些小工具的使用,能夠提高速度,比如vi中的尋找功能,模式比對尋找,做標記,還有grep,find這兩個最強大最常用的文本搜尋工具的使用。
i、對於一個大的項目,首先要弄清項目的架構結構和各個項目模組的功能(輸入什麼,處理以後輸出什麼). 在這一點上Ant工具做的相當到位,通過編寫build.xml和xml的良好的文法結構可以清楚的看到架構。Make工具也做比較出色。具體細節可參考GNU Make /Apache Ant Manual和程式的build.xml或makefile檔案。
j、參照原始碼和對應文檔及業務知識 掌握各個項目模組的主流程也就是先從每個模組的main函數開始,按照順序列出所用的函數,試著畫流程圖。注意:對於列出的函數我們現在只關心輸入什麼,處理後輸出什麼即函數的功能,不關心函數的實現,用UltraEdit32最新版閱讀時十分方便。(用sourceinsight或者understand閱讀原始碼工具更好)
k、以上兩步熟悉以後,在進一步熟悉各個項目模組的主流程,要弄清各個自訂函數的具體實現(標準庫函數除外 原因:由廠商提供,廠商只提供函數的功能)。
l、在每一步都要做好原始碼閱讀筆記,總結方法和技巧。每個項目的原始碼閱讀要多讀幾遍,書讀百遍,其義之見,定期與同仁切磋交流。
m、提出更好的解決方案,(按照軟體工程的設計步驟)評估方案的效能(介面,易用性,記憶體等方面).
n、每日構建 具體參考構建工具和相關文擋,接著,看一看大師是如何做的。一般,要初步瞭解人家的架構模型,(這可以通過追蹤一些核心函數/類得到一些印象,或者開發文檔等);進一步,找到核心資料結構,核心資料結構會直接影響代碼的品質。(曾經有人說:我不要看你的程式,讓我看一看你的資料結構!)事實上,當你完全讀懂它的資料結構時,在來閱讀原始碼,就是水到渠成的事了。
5.2 Unix/Linux下面以命令列方式啟動並執行程式
對於一個Unix/Linux下面以命令列方式啟動並執行程式,有這麼一些套路,大家可以在閱讀程式的時候作為參考。
a、在程式開頭,往往都是分析命令列,根據命令列參數對一些變數或者數組,或者結構賦值,後面的程式就是根據這些變數來進行不同的操作。
b、分析命令列之後,進行資料準備,往往是計數器清空,結構清零等等。
c、在程式中間有一些先行編譯選項,可以在makefile中找到相應部分。
d、注意程式中對於日誌的處理,和調試選項開啟的時候做的動作,這些對於偵錯工具有很大的協助。
e、注意多線程對資料的操作。
對於開源軟體,下列方法也不錯:
先用看看實現的功能,如果自己會咋樣設計實現,查看相關文檔,多次閱讀理解其中設計模式、架構、演算法實現細節
5.3 開源軟體
開源項目已閱讀了不少,總結下來按照下面的steps來操作比較恰當:
a閱讀features。以此來搞清楚該項目有哪些特性
b思考。想想如果自己來做有這些features的項目該如何構架
c下載並安裝demo或sample。通過demo或sample直觀地感受這個項目
d搜集能得到的doc,儘快地掌握如何使用這個項目
e如果有介紹項目架構的文檔,通過它瞭解項目的總體架構,如果沒有,通過api-doc瞭解源碼包的結構
f分兩遍來閱讀源碼。第一遍以應用為線索,以總體結構為基礎,閱讀在應用中使用到的類和方法,但不用過深挖掘細節,對於嵌套調用,只用通過函數名瞭解最上層函數的意義,這一遍的目的在於把大致結構瞭然於心。第二遍就是閱讀類和方法的實現細節,以第一遍的閱讀為基礎,帶著疑問去閱讀那些自己難以實現的模組。
g總結。回味這個項目設計上的精妙,用到了哪些設計模式,能在哪些領域可以借鑒等等。
結束語:
當然,在這篇文章中,並沒有闡述所有的閱讀原始碼的方法和技巧,也沒有涉及物件導向程式的閱讀方法。我想把這些留到以後再做討論。也請大家可以就這些話題展開討論。
6、參考文獻
1)、怎樣閱讀原始碼
2)、如何閱讀原始碼
3)、如何閱讀別人的代碼
註:因一些問題有疑惑或需要經驗的指導,在網上搜尋了一些文章,經過自己的體會整理成這篇部落格,有些文章拷貝時沒記錄原作者而只能在參考文獻中列出文章名稱,在此對原作者的開源共用精神十分感謝,也希望和大家多交流,不當之處請指教,謝謝!