javascript引擎工作原理是怎樣的-創(chuàng)新互聯(lián)

javascript引擎工作原理是怎樣的,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

朝陽(yáng)縣網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),朝陽(yáng)縣網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為朝陽(yáng)縣上千多家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)要多少錢(qián),請(qǐng)找那個(gè)售后服務(wù)好的朝陽(yáng)縣做網(wǎng)站的公司定做!

javascript引擎工作原理

  1. 什么是JavaScript解析引擎?
      簡(jiǎn)單地說(shuō),JavaScript解析引擎就是能夠“讀懂”JavaScript代碼,并準(zhǔn)確地給出代碼運(yùn)行結(jié)果的一段程序。比方說(shuō),當(dāng)你寫(xiě)了 var a = 1 + 1; 這樣一段代碼,JavaScript引擎做的事情就是看懂(解析)你這段代碼,并且將a的值變?yōu)?。

  學(xué)過(guò)編譯原理的人都知道,對(duì)于靜態(tài)語(yǔ)言來(lái)說(shuō)(如Java、C++、C),處理上述這些事情的叫編譯器(Compiler),相應(yīng)地對(duì)于JavaScript這樣的動(dòng)態(tài)語(yǔ)言則叫解釋器(Interpreter)。這兩者的區(qū)別用一句話來(lái)概括就是:編譯器是將源代碼編譯為另外一種代碼(比如機(jī)器碼,或者字節(jié)碼),而解釋器是直接解析并將代碼運(yùn)行結(jié)果輸出。 比方說(shuō),firebug的console就是一個(gè)JavaScript的解釋器。

  但是,現(xiàn)在很難去界定說(shuō),JavaScript引擎它到底算是個(gè)解釋器還是個(gè)編譯器,因?yàn)?,比如像V8(Chrome的JS引擎),它其實(shí)為了提高 JS的運(yùn)行性能,在運(yùn)行之前會(huì)先將JS編譯為本地的機(jī)器碼(native machine code),然后再去執(zhí)行機(jī)器碼(這樣速度就快很多),相信大家對(duì)JIT(Just In Time Compilation)一定不陌生吧。

  我個(gè)人認(rèn)為,不需要過(guò)分去強(qiáng)調(diào)JavaScript解析引擎到底是什么,了解它究竟做了什么事情我個(gè)人認(rèn)為就可以了。對(duì)于編譯器或者解釋器究竟是如何看懂代碼的,翻出大學(xué)編譯課的教材就可以了。

  這里還要強(qiáng)調(diào)的就是,JavaScript引擎本身也是程序,代碼編寫(xiě)而成。比如V8就是用C/C++寫(xiě)的。

  1. JavaScript解析引擎與ECMAScript是什么關(guān)系?
      JavaScript引擎是一段程序,我們寫(xiě)的JavaScript代碼也是程序,如何讓程序去讀懂程序呢?這就需要定義規(guī)則。比如,之前提到的var a = 1 + 1;,它表示:

左邊var代表了這是申明(declaration),它申明了a這個(gè)變量

右邊的+表示要將1和1做加法

中間的等號(hào)表示了這是個(gè)賦值語(yǔ)句

最后的分號(hào)表示這句語(yǔ)句結(jié)束了

  上述這些就是規(guī)則,有了它就等于有了衡量的標(biāo)準(zhǔn),JavaScript引擎就可以根據(jù)這個(gè)標(biāo)準(zhǔn)去解析JavaScript代碼了。那么這里的 ECMAScript就是定義了這些規(guī)則。其中ECMAScript 262這份文檔,就是對(duì)JavaScript這門(mén)語(yǔ)言定義了一整套完整的標(biāo)準(zhǔn)。其中包括:

var,if,else,break,continue等是JavaScript的關(guān)鍵詞

abstract,int,long等是JavaScript保留詞

怎么樣算是數(shù)字、怎么樣算是字符串等等

定義了操作符(+,-,>,<等)

定義了JavaScript的語(yǔ)法

定義了對(duì)表達(dá)式,語(yǔ)句等標(biāo)準(zhǔn)的處理算法,比如遇到==該如何處理

??

  標(biāo)準(zhǔn)的JavaScript引擎就會(huì)根據(jù)這套文檔去實(shí)現(xiàn),注意這里強(qiáng)調(diào)了標(biāo)準(zhǔn),因?yàn)橐灿胁话凑諛?biāo)準(zhǔn)來(lái)實(shí)現(xiàn)的,比如IE的JS引擎。這也是為什么JavaScript會(huì)有兼容性的問(wèn)題。至于為什么IE的JS引擎不按照標(biāo)準(zhǔn)來(lái)實(shí)現(xiàn),就要說(shuō)到瀏覽器大戰(zhàn)了,這里就不贅述了,自行Google之。

  所以,簡(jiǎn)單的說(shuō),ECMAScript定義了語(yǔ)言的標(biāo)準(zhǔn),JavaScript引擎根據(jù)它來(lái)實(shí)現(xiàn),這就是兩者的關(guān)系。

  1. JavaScript解析引擎與瀏覽器又是什么關(guān)系?
      簡(jiǎn)單地說(shuō),JavaScript引擎是瀏覽器的組成部分之一。因?yàn)闉g覽器還要做很多別的事情,比如解析頁(yè)面、渲染頁(yè)面、Cookie管理、歷史記錄 等等。那么,既然是組成部分,因此一般情況下JavaScript引擎都是瀏覽器開(kāi)發(fā)商自行開(kāi)發(fā)的。比如:IE9的Chakra、Firefox的 TraceMonkey、Chrome的V8等等。

  從而也看出,不同瀏覽器都采用了不同的JavaScript引擎。因此,我們只能說(shuō)要深入了解哪個(gè)JavaScript引擎。

  1. 深入了解其內(nèi)部原理的途徑有哪些?
      搞清楚了前面三個(gè)問(wèn)題,那這個(gè)問(wèn)題就好回答了。個(gè)人認(rèn)為,主要途徑有如下幾種(依次由淺入深):

  看講JavaScript引擎工作原理的書(shū)

  這種方式最方便,不過(guò)我個(gè)人了解到的這樣的書(shū)幾乎沒(méi)有,但是Dmitry A.Soshnikov博客上的文章真的是非常的贊,建議直接看英文,實(shí)在英文看起來(lái)吃力的,可以看譯本

  看ECMAScript的標(biāo)準(zhǔn)文檔

  這種方式相對(duì)直接,原汁原味,因?yàn)橐婢褪歉鶕?jù)標(biāo)準(zhǔn)來(lái)實(shí)現(xiàn)的。目前來(lái)說(shuō),可以看第五版和第三版,不過(guò)要看懂也是不容易的。

  看JS引擎源代碼

  這種方式最直接,當(dāng)然也最難了。因?yàn)檫€牽涉到了如何實(shí)現(xiàn)詞法分析器,語(yǔ)法分析器等等更加底層的東西了,而且并非所有的引擎代碼都是開(kāi)源的。

  1. 以上幾種方式中第一種都很難看明白怎么辦?
      其實(shí)第一種方式中的文章,作者已經(jīng)將文檔中內(nèi)容提煉出來(lái),用通俗易懂的方式闡述出來(lái)了。如果,看起來(lái)還覺(jué)得吃力,那說(shuō)明還缺少兩塊的東西:

  對(duì)JavaScript本身還理解的不夠深入

  如果你剛剛接觸JavaScript,或者說(shuō)以前甚至都沒(méi)有接觸過(guò)。那一下子就想要去理解內(nèi)部工作原理,的確是很吃力的。首先應(yīng)該多看看書(shū),多實(shí)踐實(shí)踐,從知識(shí)和實(shí)踐的方式來(lái)了解JavaScript預(yù)言特性。這種情況下,你只需要了解現(xiàn)象。比方說(shuō),(function(){})() 這樣可以直接調(diào)用該匿名函數(shù)、用閉包可以解決循環(huán)中的延遲操作的變量值獲取問(wèn)題等等。要了解這些,都是需要多汲取和實(shí)踐的。實(shí)踐這里就不多說(shuō)了,而知識(shí)汲取方面可以多看看書(shū)和博客。這個(gè)層面的書(shū)就相對(duì)比較多了,

  缺乏相應(yīng)的領(lǐng)域知識(shí)

  當(dāng)JavaScript也達(dá)到一定深度了,但是,還是看不大明白,或者沒(méi)法很深入到內(nèi)部去一探究竟。那就意味著缺少對(duì) 應(yīng)的領(lǐng)域知識(shí)。這里明顯的就是編譯原理相關(guān)的知識(shí)。不過(guò),其實(shí)對(duì)這塊了解個(gè)大概基本看起來(lái)就沒(méi)問(wèn)題了。要再繼續(xù)深入,那需要對(duì)編譯原理了解的很深入,比如 說(shuō)詞法分析采用什么算法,一般怎么處理。會(huì)有什么問(wèn)題,如何解決,AST生成算法一般有哪幾種等等。那要看編譯原理方面的書(shū),也有基本經(jīng)典的書(shū),比如《Compilers: Principles, Techniques, and Tools》這本也是傳說(shuō)中的龍書(shū),還有非常著名的《SICP》和《PLAI》。 不過(guò)其實(shí)根據(jù)個(gè)人經(jīng)驗(yàn),對(duì)于Dmitry的文章,要看懂它,只要你對(duì)JavaScript有一定深度的了解,同時(shí)你大學(xué)計(jì)算機(jī)的課程都能大致掌握了(尤其 是操作系統(tǒng)),也就是說(shuō)基礎(chǔ)不錯(cuò),理解起來(lái)應(yīng)該沒(méi)問(wèn)題。因?yàn)檫@些文章基本沒(méi)有涉及底層編譯相關(guān)的,只是在解釋文檔的內(nèi)容,并且其中很多東西都是相通的,比 如:context的切換與CPU的進(jìn)程切換、函數(shù)相關(guān)的的局部變量的棧存儲(chǔ)、函數(shù)退出的操作等等都是一致的。

關(guān)于javascript引擎工作原理是怎樣的問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

新聞標(biāo)題:javascript引擎工作原理是怎樣的-創(chuàng)新互聯(lián)
轉(zhuǎn)載注明:http://muchs.cn/article32/dsegsc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、面包屑導(dǎo)航、動(dòng)態(tài)網(wǎng)站、外貿(mào)建站、用戶體驗(yàn)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)