什么是JavaScript解析引擎?
10年積累的成都做網(wǎng)站、網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站策劃后付款的網(wǎng)站建設(shè)流程,更有任縣免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
簡單地說,JavaScript解析引擎就是能夠“讀懂”JavaScript代碼,并準(zhǔn)確地給出代碼運(yùn)行結(jié)果的一段程序。比方說,當(dāng)你寫了 var a = 1 + 1; 這樣一段代碼,JavaScript引擎做的事情就是看懂(解析)你這段代碼,并且將a的值變?yōu)?。
學(xué)過編譯原理的人都知道,對于靜態(tài)語言來說(如Java、C++、C),處理上述這些事情的叫編譯器(Compiler),相應(yīng)地對于JavaScript這樣的動態(tài)語言則叫解釋器(Interpreter)。這兩者的區(qū)別用一句話來概括就是:編譯器是將源代碼編譯為另外一種代碼(比如機(jī)器碼,或者字節(jié)碼),而解釋器是直接解析并將代碼運(yùn)行結(jié)果輸出。 比方說,firebug的console就是一個JavaScript的解釋器。
但是,現(xiàn)在很難去界定說,JavaScript引擎它到底算是個解釋器還是個編譯器,因為,比如像V8(Chrome的JS引擎),它其實為了提高 JS的運(yùn)行性能,在運(yùn)行之前會先將JS編譯為本地的機(jī)器碼(native machine code),然后再去執(zhí)行機(jī)器碼(這樣速度就快很多),相信大家對JIT(Just In Time Compilation)一定不陌生吧。
我個人認(rèn)為,不需要過分去強(qiáng)調(diào)JavaScript解析引擎到底是什么,了解它究竟做了什么事情我個人認(rèn)為就可以了。對于編譯器或者解釋器究竟是如何看懂代碼的,翻出大學(xué)編譯課的教材就可以了。
這里還要強(qiáng)調(diào)的就是,JavaScript引擎本身也是程序,代碼編寫而成。比如V8就是用C/C++寫的。
左邊var代表了這是申明(declaration),它申明了a這個變量
右邊的+表示要將1和1做加法
中間的等號表示了這是個賦值語句
最后的分號表示這句語句結(jié)束了
上述這些就是規(guī)則,有了它就等于有了衡量的標(biāo)準(zhǔn),JavaScript引擎就可以根據(jù)這個標(biāo)準(zhǔn)去解析JavaScript代碼了。那么這里的 ECMAScript就是定義了這些規(guī)則。其中ECMAScript 262這份文檔,就是對JavaScript這門語言定義了一整套完整的標(biāo)準(zhǔn)。其中包括:
var,if,else,break,continue等是JavaScript的關(guān)鍵詞
abstract,int,long等是JavaScript保留詞
怎么樣算是數(shù)字、怎么樣算是字符串等等
定義了操作符(+,-,>,<等)
定義了JavaScript的語法
定義了對表達(dá)式,語句等標(biāo)準(zhǔn)的處理算法,比如遇到==該如何處理
??
標(biāo)準(zhǔn)的JavaScript引擎就會根據(jù)這套文檔去實現(xiàn),注意這里強(qiáng)調(diào)了標(biāo)準(zhǔn),因為也有不按照標(biāo)準(zhǔn)來實現(xiàn)的,比如IE的JS引擎。這也是為什么JavaScript會有兼容性的問題。至于為什么IE的JS引擎不按照標(biāo)準(zhǔn)來實現(xiàn),就要說到瀏覽器大戰(zhàn)了,這里就不贅述了,自行Google之。
所以,簡單的說,ECMAScript定義了語言的標(biāo)準(zhǔn),JavaScript引擎根據(jù)它來實現(xiàn),這就是兩者的關(guān)系。
從而也看出,不同瀏覽器都采用了不同的JavaScript引擎。因此,我們只能說要深入了解哪個JavaScript引擎。
看ECMAScript的標(biāo)準(zhǔn)文檔
這種方式相對直接,原汁原味,因為引擎就是根據(jù)標(biāo)準(zhǔn)來實現(xiàn)的。目前來說,可以看第五版和第三版,不過要看懂也是不容易的。
看JS引擎源代碼
這種方式最直接,當(dāng)然也最難了。因為還牽涉到了如何實現(xiàn)詞法分析器,語法分析器等等更加底層的東西了,而且并非所有的引擎代碼都是開源的。
對JavaScript本身還理解的不夠深入
如果你剛剛接觸JavaScript,或者說以前甚至都沒有接觸過。那一下子就想要去理解內(nèi)部工作原理,的確是很吃力的。首先應(yīng)該多看看書,多實踐實踐,從知識和實踐的方式來了解JavaScript預(yù)言特性。這種情況下,你只需要了解現(xiàn)象。比方說,(function(){})() 這樣可以直接調(diào)用該匿名函數(shù)、用閉包可以解決循環(huán)中的延遲操作的變量值獲取問題等等。要了解這些,都是需要多汲取和實踐的。實踐這里就不多說了,而知識汲取方面可以多看看書和博客。這個層面的書就相對比較多了,《Professional JavaScript for Web Developers》就是本很好的書(中文版請自行尋找)。
缺乏相應(yīng)的領(lǐng)域知識
當(dāng)JavaScript也達(dá)到一定深度了,但是,還是看不大明白,或者沒法很深入到內(nèi)部去一探究竟。那就意味著缺少對 應(yīng)的領(lǐng)域知識。這里明顯的就是編譯原理相關(guān)的知識。不過,其實對這塊了解個大概基本看起來就沒問題了。要再繼續(xù)深入,那需要對編譯原理了解的很深入,比如 說詞法分析采用什么算法,一般怎么處理。會有什么問題,如何解決,AST生成算法一般有哪幾種等等。那要看編譯原理方面的書,也有基本經(jīng)典的書,比如《Compilers: Principles, Techniques, and Tools》這本也是傳說中的龍書,還有非常著名的《SICP》和《PLAI》。 不過其實根據(jù)個人經(jīng)驗,對于Dmitry的文章,要看懂它,只要你對JavaScript有一定深度的了解,同時你大學(xué)計算機(jī)的課程都能大致掌握了(尤其 是操作系統(tǒng)),也就是說基礎(chǔ)不錯,理解起來應(yīng)該沒問題。因為這些文章基本沒有涉及底層編譯相關(guān)的,只是在解釋文檔的內(nèi)容,并且其中很多東西都是相通的,比 如:context的切換與CPU的進(jìn)程切換、函數(shù)相關(guān)的的局部變量的棧存儲、函數(shù)退出的操作等等都是一致的。