新手應該如何讀Google V8引擎源代碼?
一直在學習C++,也想閱讀點開源的C++項目,發現網上對Google V8評價不錯,於是上Github上找到了源代碼,發現有很多branched和tags,不知道都表示啥。想好好看看源代碼,求知乎大神們給個建議!
附上引擎github地址 : http://github.com/v8/v8
題主只是想學習C++,並不是對JavaScript引擎的實現本身感興趣對不對?
如果是的話,請不要從V8開始學習。這不是適合新手閱讀的東西。特別是新的版本簡直複雜,沒足夠知識儲備看了也是白看。
硬要看的話,請從非常早期的版本開始看。這是0.1.5的tag:Release 0.1.5: Made the prototype property of functions enumerable. · v8/v8 · GitHub要瀏覽文件的話,在這裡:v8/v8 at 3a1ab8c626dfee28a5cafb6632b28e284c4cffb3 · GitHub此時的V8還相對簡單一些,但已經包含許多在當時的JavaScript引擎看來非常先進的做法了,例如tagged pointer。而V8實現tagged pointer用的是很奇妙的C++奇技淫巧,真的不太適合新手用來上手…題主看下面這個函數能看懂不?v8/objects-inl.h at 3a1ab8c626dfee28a5cafb6632b28e284c4cffb3 · v8/v8 · GitHub
bool Object::IsSmi() {
return HAS_SMI_TAG(this);
}
HAS_SMI_TAG宏的定義在:v8/globals.h at 3a1ab8c626dfee28a5cafb6632b28e284c4cffb3 · v8/v8 · GitHub
#define HAS_SMI_TAG(value)
((reinterpret_cast&
如何?
網上有不少介紹V8的特性的文章其實寫的都是初期的V8,配合它們讀初期的V8代碼倒是不錯。如果真要讀的話,有啥具體問題歡迎在知乎提問討論 ^_^我這兒有個老帖,或許能對題主有用:[鏈接帖] 各JavaScript引擎的簡介,及相關資料/博客收集帖新手的不太建議讀v8源代碼。我記得某個v8的developer在wingolog一系列關於v8分析的文章(posts tagged "v8")的comment里,或者是Lars,曾經提到v8不是用來學的,因為它存在的目的就是為了最高性能,裡面用了大量的奇巧淫技,比如說small integer表示,比如說把浮點數轉化成字元串的Grisus3演算法(http://florian.loitsch.com/publications/dtoa-pldi2010.pdf?attredirects=0). 另外,處於速度考慮,v8和普通的編譯器/虛擬機不太一樣,沒有太多control flow analysis和data flow analysis(至少我看的時候是這樣)。
需要知道的是,Lars原來是做Hotspot VM的,裡面大量的思想來自大神Urs H?lzle。大名鼎鼎的on stack replacement,polymorphic inline cache等等完全可以在Urs H?lzle二十年前的博士論文里可以找的到,所以要看懂v8這些理論少不了; V8里的hydrogen指令更是用來自Hotspot的C1Visualizer可以看,所以我想如果要學習的話,還不如先看看wingolog的這一系列v8文章:posts tagged "v8",以及Urs H?lzle的博士論文和相關論文http://i.stanford.edu/pub/cstr/reports/cs/tr/94/1520/CS-TR-94-1520.pdf,最後最好還要熟悉virtual machine的實現。比如各種GC演算法,不然看v8里的對象管理你就直接暈了。
有了這些理論打底,熟悉一般的compiler和virtual machine implementation,而且還熟悉ecmascript spec,熟悉C++的話,倒是可以開始看了...
但如果你這些都熟悉,那看v8幹嘛呢?給它做code review?
比較有意思的是這些理論都熟悉了,然後比較各種javascript的實現。比如在對象表示上mozilla就不是v8的smi tag,而是利用NaN boxing;比如是直接inteprete還是像v8那樣有highlevel IR和lowlevel IR;等等。這才是有意思的地方吶新手如果通過v8學c++,估計在成功編譯之前就放棄了。
學c++看Clang 3.8吧,不僅能一邊學c++,還能一邊看c++的編譯過程 (逃
看V8可不是會C++就可以看懂的,你要先深刻理解js,要深刻理解js,你還要先深刻理解html。
如果你原來是做網站的高手,想學C++,倒是可以看看。文檔在這裡 https://github.com/v8/v8/wiki
代碼在這裡看 https://cs.chromium.org/chromium/src/v8/具體我還沒看過。有個看代碼的技巧,比如你想知道某一方面的東西,先去https://bugs.chromium.org/p/chromium/issues/list 找相關的修好了的bug,看看改動了哪些文件。
順便給你邀個應該看過的@龍泉寺掃地僧沒什麼好辦法,一是搜搜國內外的博客和書籍,肯定是有V8源碼分析的。二是翻翻GoogleV8組的相關論文和博客,有關於V8的介紹。三就是翻Makefile,根據編譯條件來看源碼,這時候你要藉助相關工具了,比如source insight
先寫個js解釋器,如果連js都不了解,解釋器也沒聽過,深度和廣度都不具備,那你還不是新手,只能算聽過c++課的大學生
作為一個前端工程師,對v8一定程度的了解也是非常有必要的,不過我看樓主的題目。。。如果沒有一定的基礎單純從新手的角度來看,你可以試著在本地編譯成功之後再問這個問題,v8涉及到的不僅僅是c++,單純編譯就需要你了解Linux,python,gyp,git。好吧,編譯成功了,那麼如果你不了解js的話,那麼對v8更是一頭霧水,比如handlescope,context這些機制,我也對v8沒有更深的了解,只能說到這了,畢竟世界上能設計出來vm的人並不多,對我這個前端來說,語言能被計算機所理解已經實屬不易,更不要說v8這麼優秀的引擎了
看這個得先學好編譯原理、操作系統等課程。
推薦閱讀:
※js中為什麼沒有自乘自除?只有自加自減,為什麼?
※如何評價Microsoft的開源項目napajs?
※HSimulate這條Hydrogen里的instruction到底是什麼意思?