利用開源更好的學習

今天看見一個FreeBSD郵件列表上很早的一封郵件,

http://lists.freebsd.org/pipermail/freebsd-current/2010-August/019310.html

是當時GNU grep的原作者向當時FreeBSD grep的作者介紹GNU grep運行更快的原因,我大致看了一下,基本就屬於大牛們之間交流,這之中沒有炫耀與嘲諷,有的只是單純的自由交流、分享與探討。這就是自由軟件的美麗文化所在。

不知道有沒有人注意到,Mike寫的郵件標題是why GNU grep is fast,他用的是fast而不是faster。他發這封郵件的緣由是很多開發者都反映GNU的grep更快,所以Mike在此背景下主動向FreeBSD的作者說明自己程序的設計,他用fast我覺得是一種謙虛和不炫耀的表達,意思是“我來說明一下我儘量讓grep運行更快所用的方法”,隱含的意思應該包括“我們來探討一下彼此設計的優缺點”。 這是多麼平和的態度,多麼自由的氛圍。如果改用faster,那就性質就完全變了。連這樣的大牛們都能如此的謙和,我們是不是應該學習呢?


好了,以上是我的個人見解,並不代表Mike在說。下面我們言歸正傳,本文的用意是說一下使用linux系統利用開源軟件來學習的好處之一,本文並不介紹上述郵件中的算法,因爲這篇是給Linux新手寫的,讓沒有接觸過開源的人有一個先入的大致概念。


就以這個GNU grep爲例,假如現在你剛剛看到了上面的文章,覺得對grep的這個算法很感興趣,那麼首先你需要選取了解那個算法的原理,wikipedia是一個很好的網站:

http://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string_search_algorithm


你瞭解了算法是怎麼回事了,你開始覺得光有理論沒有實踐,正好GNU grep自稱是這樣實現的,那麼你就需要看一下grep的源代碼了。在linux系統上獲取grep的源代碼非常簡單,就以我們早先提到的安裝的Fedora-19系統爲例,在Fedora-19的終端下,執行如下命令:

yum install yum-utils

先安裝yum-utils包。然後執行:

yumdownloader --source grep

等待一會命令會從遠程源上下載grep的源碼包。下載好後就會看到一個grep-2.14-4.fc19.src.rpm的文件,它就是grep在Fedora-19系統上的源碼包,由於我們不討論rpm包的問題,所以下面我們來粗略的解開這個源碼包,執行:

rpm2cpio grep-2.14-4.fc19.src.rpm |cpio -div

會得到很多東西,其中有一個grep-2.14.tar.xz的壓縮文件,我們再來解開這個壓縮文件:

tar xvf grep-2.14.tar.xz
下面就會得到一個grep-2.14/的目錄(注意以上的grep的後綴版本號可能會有所不同)。我們cd進這個目錄看一眼:

cd grep-2.14/; ls

------

ABOUT-NLS   ChangeLog       COPYING       lib          NEWS            src
aclocal.m4  ChangeLog-2009  doc           m4           po              tests
AUTHORS     config.hin      gnulib-tests  maint.mk     README          THANKS
build-aux   configure       GNUmakefile   Makefile.am  README-alpha    TODO
cfg.mk      configure.ac    INSTALL       Makefile.in  README-release

------

這就是grep源碼包的內部結構。關於怎麼閱讀代碼不是本文的內容,但可以先點一下,你可以藉助一些工具如cscope等檢索代碼,查找你感興趣的關鍵字。可以編譯源碼包加上調式信息或調式選項,然後用gdb跟蹤斷點來摸索出grep的執行過程,然後定位你要找的代碼片段。總之方法很多,不在這裏贅餘。


上面的方法是通過linux發行版的源來獲得源上的源碼包,實際上每個發行版所維護的源碼屬於downstream的代碼,而upstream的代碼由這個項目的直接維護者維護,GNU grep顧名思義,當然是由GNU組織在維護。所以我們可以到GNU的官網去找grep的上游代碼:

http://www.gnu.org/software/grep/

一般來說很多開源項目都是使用git版本控制器來維護的,在上面的GNU網站上我們可以找到這個連接:

http://savannah.gnu.org/git/?group=grep

打開看一下,裏面是給想獲得grep的項目代碼的人寫的,這就是開源世界,歡迎任何人獲取和貢獻。好了,我們來用git獲取一下這個grep項目代碼吧。

首先你可能得先裝git軟件:

yum install git

然後有了git工具讓我們來根據上面的說明獲取一下代碼,仔細一看有兩個clone的地址:

Anonymous clone:

git clone git://git.savannah.gnu.org/grep.git
Member clone:
git clone <membername>@git.sv.gnu.org:/srv/git/grep.git
該選擇哪個呢?第一個可以理解爲給任意的人下載瀏覽使用的,第二個是給grep項目認可的開發人員使用的。區別在於,第一個隨便下載,第二個需要認證,而且第一個沒辦法push代碼,第二個可以。



好了,我們不是grep的指定開發人員,所以我們用第一個好了,怎麼執行人家都告訴你了:


git clone git://git.savannah.gnu.org/grep.git
執行結束後可以看到一個grep的目錄,cd進去看一下。


[zorro@dhcp-65-110 grep]$ ls
AUTHORS         configure.ac  grep.spec    po              tests
bootstrap       COPYING       HACKING      README          THANKS
bootstrap.conf  doc           lib          README-alpha    TODO
build-aux       gl            m4           README-hacking
cfg.mk          gnulib        Makefile.am  README-prereq
ChangeLog-2009  gnulib-tests  NEWS         src

似乎結構和上面的差不多嘛。彆着急,執行一下: ls -ld .git,你就會發現至少這個下面多一個.git的目錄。這個就是git維護的標誌。執行一下git branch -av我們會看到如下結果:

[zorro@dhcp-65-110 grep]$ git branch -av
* master                84b18cc tests: port to non-GNU sed
  remotes/origin/HEAD   -> origin/master
  remotes/origin/master 84b18cc tests: port to non-GNU sed

這個是git的分支,git是版本控制器,功能非常強大。以後我會簡單說明怎麼用git維護一個項目代碼,對經常做電子比賽的朋友們也會很多幫助的。這裏就先不多介紹git了。


到這裏有人可能會問:這和剛纔下載的也沒什麼區別嘛,而且我們不是指定開發人員就不讓我們push代碼,那還讓我們怎麼分享?

其實是這麼回事,開源項目不能讓隨便的人直接push代碼上去,因爲如果每個匿名的人都可以直接push,那這個項目就亂套了。每個開源項目都是負責人,有的負責人很多,呈樹狀分等級,像linux項目,等級越高的人負責審覈的範圍越廣,如linus本人就負責整個linux項目的整合和審覈。當然他一個人是忙不過來的,linux項目分很多子模塊,每個子模塊有一個他信任的負責人,這些負責人下面可能還有更細的負責人。

linux項目很大,所以會這樣。如果是一個小項目可能只有兩三個人維護,甚至只有一個人,那麼push和merge代碼的就是這一兩個人。


比如你現在對grep這個項目感興趣,你對最新的項目代碼做了你的修改,你覺得改的很有意義,於是你想向上提交,那麼你需要將你的修改做成patch然後發郵件給維護者或郵件列表,你的patch會有很多人評審,然後和你溝通決定是否錄用你的patch。具體怎麼向上遊提交patch以後再說,有興趣的可以自己瞭解一下。


如果你的patch被錄用了,你的名字和郵箱應該會被記錄在git log裏(如果項目維護人員人品挺好的話,哈哈:))如果你經常貢獻代碼,是個卓越貢獻者,那麼你的名字有可能被永久記錄在一個特別的位置。如果你繼續提交,戰功卓著,佔有舉足輕重的位置,那麼你就可能被選爲某個子部分的maintainer,或者某個大塊的負責人,甚至直接等着接班像linus這樣的位置。


以上就是開源代碼好處的簡介和簡單使用,感興趣的就趕緊投入開源的懷抱吧。我上面說的連冰山一角都不算,如果你加入,你會體驗到無窮的樂趣與自由,當然如果你是一個真正的Hacker。當然你也可以在追求樂趣的同時獲得榮譽,比如你出去說你給linux提過數百個patch,或者你是linux某個模塊的mantainer,我覺得那可能比你說你是什麼什麼研究生甚至博士可能更招一些公司和人的認可。


本文純屬閒談,目的在於吸引更多的新人加入開源。如果哪位大牛路過願意更多的分享一二,那就更好了。

這裏有一個剛建立不久的GNU/Linux的QQ羣289439622,如有興趣歡迎加入交流。

好了,你還在等什麼,加入開源吧。

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