很幸運,nodejs被創造出來了。nodejs在js的基礎上,使用v8提供的能力,極大地拓展、豐富了js的能力。尤其是網路和檔案。這樣我就不僅可以使用js,還可以使用網路、檔案等功能。這是我逐漸轉向nodejs方向的原因之一。也是我開始研究nodejs原始碼的原因之一。因為nodejs滿足了我喜好和技術上的需求。不過一開始的時候,我並沒有全身心地投入**的研究,只是偶爾會看一下某些模組的實現。真正的開始,是為了做我首先從libuv開始研究,因為libuv是nodejs的核心之一。因為曾經研究過一些linux的原始碼,也一直在學習作業系統的一些原理和實現,所以在閱讀libuv的時候,算是沒有遇到太大的困難。c語言函式的使用和原理,基本都可以看明白。重點在於業務邏輯上,需要把各個邏輯捋清楚。我使用的方法就是注釋和畫圖。我個人比較喜歡寫注釋。雖然說**是最好的注釋,但是我還是願意花時間用注釋去把**的背景和意義闡述一下,因為並不是每個程式設計師都能做到**即注釋這一境界。而且注釋會讓大部分人更快地能讀懂**的含義。讀libuv的時候,也穿插地讀了一些js和c++層的**。閱讀nodejs原始碼的方式是,選擇乙個模組,垂直地從js層分析到c++層,然後到libuv層。
讀完libuv,接下來讀的是js層的**,js雖然容易看懂,但是js層的**非常多,而且我感覺邏輯上也非常繞,所以至今,我還有很多沒有細讀。這個作為後續的計畫。nodejs中,c++算是膠水層,很多時候,不會c++,其實也不影響nodejs原始碼的閱讀,因為c++很多時候,只是一種透傳的功能,他把js層的請求,通過v8,傳給libuv。然後再反過來。所以c++層我是放到最後才細讀。c++層我覺得是最難的,難的不是看不懂他的**邏輯。而是真正明白他的工作原理,這時候,我又不得不開始讀v8的原始碼了,v8的原始碼可以說,非常難。我選取的幾乎是最早的版本0.1.5。然後結合8.x版本。通過早期版本,先學習v8的大概原理和一些早期實現上的細節。因為後續的版本雖然變化很大,但是也只是功能的增強和優化,有很多核心的概念還是沒有變化的,這是我選取早期版本的原因,避免一開始就陷入無窮無盡的**中,迷失了方向,失去了動力。哪怕是早期的版本,有很多內容依然非常複雜。結合新版本是因為有些功能在早期版本裡沒有實現,這時候要明白他的原理,就只能看新版的**,有了早期版本的經驗,閱讀新版的**也有一定的好處。多多少少也知道了一些閱讀技巧。
nodejs的大部分**都在c++和js層,所以目前仍然是在不斷地閱讀這兩層的**。還是按照模組垂直分析。閱讀nodejs**,讓我更了解nodejs的原理,也更了解js。不過**量非常大,需要源源不斷的時間和精力投入。所以我也一直在尋找志同道合的人一起分析,加快對nodejs原始碼的研究,不過真正能啃原始碼的人不多。原始碼的閱讀可能並不一定能幫助你的工作變得更好,很多時候也往往不需要深入到這種程度。不像學乙個框架,一門語言一樣,我們立刻就能看到效果,這極大地增強了我們的積極性。就像現在可能很少人學c、c++一樣,使用底層語言,實現乙個能用的東西,會變得異常不容易。但是使用一些指令碼語言,我們很快就能看到我們想要的東西。最主要的是,使用更難的語言,並不會增加我們的工資。所以,這是乙個選擇的問題,不是對錯的問題。做技術,知其然知其所以然的感覺是非常美妙的,你靠著一門技術謀生,卻對他知之甚少,這種感覺並不好。閱讀原始碼,雖然不會為你帶來直接的、迅速的收益,但是有幾個好處是必然的。第一是他會決定你的高度,第二你寫**的時候,你看到的不再是一些冰冷冷、無生命的字元。這可能有點誇張,但是你了解了技術的原理,你在使用技術的時候,的確會有不同的體驗,你的思維也會有了更多的變化。第三是提高了你的學習能力,當你對底層原理有了更多的了解和理解,你在學習其他技術的時候,就會更快地學會,比如你了解了epoll的實現,那你看nginx、redis、libuv等原始碼的時候,關於事件驅動的邏輯,基本上就沒有太大的壓力了。
這幾年,大部分業餘時間和精力都花在了各種原始碼分析中,linux、nginx、v8、nodejs、執行緒庫、libuv。過程是非常難的,這需要投入長期的時間和精力,還需要專注、不斷的思考。但是閱讀這些原始碼讓我對技術和計算機原理有了更多、更深的了解和理解。也希望能利用技術做更多的事情。同時也看到很多同學在做各個方向的原始碼研究,期待有更多人去做這樣的事情。閱讀nodejs原始碼的初衷是讓自己深入理解nodejs的原理,然後也會輸出一些內容,希望讓大家也能從中受益。這是不容易走的路,但是,正確的、喜歡的路,慢點、難點又有什麼所謂呢。
cita 原始碼研究
適用環境 vim youcompleteme使用 github 源,不能使用 ustc 源 git clone depth 1 recusive所有 cargo.toml 中的庫版本號全部改為精確的細版本號,不能是粗略的大版本號 所有 cargo.toml 中的非官方託管庫,均改為 形式 第 2 3...
原始碼編譯安裝nodejs
有個站友在看我寫的visualeditor安裝筆記時,碰到了nodejs的版本問題。簡述一下我的安裝過程。我當時用的是v6.9.5,現在看來下最新的已經到了v6.10.0了,其實都差不多。cd usr local src wget 安裝編譯要使用的 gcc 及 gcc c yum install g...
nodeJS之eventproxy原始碼解讀
1.原始碼縮影 原始碼解讀 上面大致展示了eventproxy的結構,首先它使用閉包的形式保證了 的整潔 其次為了適應不同的使用場合,中都做了必要的處理,而我們使用最多的無疑是作為nodejs的模組 檢查exports,如果存在,則構建為nodejs模組 module.exports definit...