談談我讀源碼的心得

談談我讀源碼的心得
爲了搜索他人對gnu
gawk源碼的分析成果,在百度上搜索,發現除了我寫的一些東西,其它人沒有寫。於是,就重新操起了筆,自己接着寫。我很久沒上csdn,密碼忘記了,上次登陸沒進去。這次居然一次性還記起來了。
首先,我想,還是讀老版本的代碼,性價比高。因爲老版本的代碼,解決了最核心的問題,從0到1,這是最根本的。但一個問題,老版本的代碼編譯不了,因爲操作系統,編譯器都不同了。於是,就要修改。好在C語言變化不大。
所以讀老版本的代碼,能夠讓自己樹立讀源碼的信心。我想,我肯定比不上現在的matz,但學了這麼久,是否能和1993年的matz拼拼呢,如果人生能夠穿越的話。回到30年前。我想,應該比30年前的人不差太多。於是讀他們30年前的代碼。
讀代碼時,會遇到很多問題,比如,要複習操作系統
、編譯原理、數據結構等課程。爲此,我還是把本科時的這些課本拿出來,反覆的讀。總能讀懂的。再讀源碼。讀源碼時,一定要快,開始時不要太細了。看得太細,很容易讓人有失敗感。
爲此,我想,讀代碼之前,先把程序使用一遍。哪怕是最新版本。先用幾次。有了初步印象後,再把代碼翻一遍。爲此,如果作者寫了readme,先讀這個文件,一般作者會介紹如何使用。
接着看有無測試用例。像ruby gem
algorithms0.6中有一個spec文件夾,裏面就講解了如何測試。再對照測試用例,去打開源代碼。讀起來就快了。
總之,天下武功,唯快不破。我讀代碼時,就像看小說一樣,快速的看,先建立宏觀印象,瞭解作者的主要處理邏輯。在對全局有了解後,再從一個自己對讀懂的地方作爲切入點,一點一點的往裏鑽。
比如,讀gawk1.01時,在awk1.c中把程序的整體框架就搭起來了。main函數就在這個文件。我開始讀代碼時,就不用ctags。我先讀awk1.c,awk2.c,awk3.c這樣一個一個的通讀。等有了大致印象後,在細看時,就用ctags跳來跳去。
總之,我以爲讀源碼時,一定要有速度。今天讀awk.y中yylex()函數時,我原來一直沒讀懂,因爲我需要前面處理正則表達式的那段,就暈了。就看不下去了。今天,因爲我是調試代碼。我不管了。我把處理正則表達式的那一大段全部略過,反正我知道這段在做什麼就行了。至於具體如何做,等我把框架看懂了,再回過頭來看。於是就找到了根據讀入字符來進行處理的核心邏輯。知道了核心邏輯,我基本就把全部看懂了。
像有曾看過的oz的grep中處理正則表達式的代碼。regex.c中,它是把"a[1-9]b"翻譯爲
"chr a ccl bits chr
b"之類,這個邏輯和yylex()中不也差不多。更進一步講,yylex其實實現的就是flex工具做的事。
所以,我發現讀代碼,關鍵是要快,要建立大塊。一定要知道程序解決的問題,再詳細看如何解決的。

其次,我想說,當發現讀代碼用到的核心算法自己不懂。這時,我想,再硬着頭皮讀,意義不大,還不如先把核心算法搞明白再說。
比如,讀gem
algorithms時,遇到紅黑樹,我就先去翻算法導論,去找這個算法。再去啃代碼。
總之,一定不要害怕讀源碼,先要樹立信心,別人是一個腦袋,我也是一個腦袋。別人能寫出來,難道我讀都讀不懂?因此,要樹立信心,我一定能讀懂。
其實,要有方法。魯迅先生講,世上本無路,走的人多了,就成了路。讀源碼也一樣,你讀多了,方法就出來了。我目前的方法是,讀代碼要像看小說一樣,要一目十行。要先觀其大略。在總觀全局的基本上,再有爭對性的看局部。
最後,我想,要反覆的反芻,要總結他人是如何佈局的。反正多總結。
另外,csdn以往復制、粘貼要搞很多次,才能搞成功。現在好像一次就能搞成功了。我想,就像代碼一樣,讀得次數多了,不經意間也就理解了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章