亚洲最大看欧美片,亚洲图揄拍自拍另类图片,欧美精品v国产精品v呦,日本在线精品视频免费

  • 站長資訊網(wǎng)
    最全最豐富的資訊網(wǎng)站

    javascript依賴于什么支持

    javascript依賴于底層javascript引擎的支持。javascript運行在瀏覽器,主要依靠瀏覽器的js引擎解釋執(zhí)行js代碼;JavaScript引擎是一個專門處理JavaScript腳本的虛擬機,一般會附帶在網(wǎng)頁瀏覽器之中,用于解釋和執(zhí)行js腳本。

    javascript依賴于什么支持

    前端(vue)入門到精通課程:進入學習
    API 文檔、設計、調(diào)試、自動化測試一體化協(xié)作工具:點擊使用

    本教程操作環(huán)境:windows7系統(tǒng)、javascript1.8.5版、Dell G3電腦。

    javascript依賴于底層js引擎的支持。

    javascript運行在瀏覽器,主要依靠瀏覽器的js引擎解釋執(zhí)行js代碼。其他帶有js引擎的軟件也可以運行js,但是一般js和網(wǎng)頁關系較大,所以一般在瀏覽器當中運行。

    javascript引擎

    JavaScript引擎是一個專門處理JavaScript腳本的虛擬機,一般會附帶在網(wǎng)頁瀏覽器之中,用于解釋和執(zhí)行js腳本。

    著名的js引擎:

        Mozilla:SpiderMonkey引擎,世界第一款JavaScript引擎,有C/C++編寫,用于Mozilla Firefox 1.0~3.0版本

        Google:V8引擎,由C++/匯編語言編寫,用于chrome瀏覽器

        微軟:Chakra(查克拉,笑)引擎,用于Internet Explorer 9的32位版本

    瀏覽器內(nèi)核和JS引擎的關系

    以webkit為例:

    javascript依賴于什么支持

    V8引擎

    1、V8引擎的原理

    V8引擎是用C++編寫的Google開源高性能的JavaScript和WebAssembly引擎,用于Chrome和Node.js等。

    它能夠實現(xiàn)ECMAScript和WebAssembly,并在Windows7或者更高版本,macOS 10.12+和使用x64,IA-32,ARM或MIPS處理器的Linux系統(tǒng)上運行。

    V8引擎可以獨立運行,也可以嵌入到任何C++應用程序中運行。例如,可以將V8引擎中使用Node.js看做是將將V8引擎嵌入到了應用程序中,那么Node.js就具備了執(zhí)行JavaScript代碼的能力。

    原理圖:

    javascript依賴于什么支持

    ①、Parse模塊會將JavaScript代碼轉換成AST,這是因為解釋器并不直接認識JavaScript代碼。如果函數(shù)沒有被調(diào)用,是不會被轉換為AST的

    ②、Ignition是一個解釋器,會將AST轉換為ByteCode。同時會收集TurboFan優(yōu)化所需的信息(比如函數(shù)參數(shù)的類型信息,有了類型才能真實的運算)。如果函數(shù)只調(diào)用一次,Ignition將AST轉換為ByteCode

    ③、為什么最后轉化為字節(jié)碼,而不是直接轉化為機器碼?

    因為JS代碼在什么樣的環(huán)境下執(zhí)行并不固定,有可能是使用Windows環(huán)境、或者是mac環(huán)境、或者是Linux環(huán)境的瀏覽器上,也可能是在Node.js中,環(huán)境不固定,不同環(huán)境中就會有不同的CPU,不同的CPU擁有不同的CPU架構,不同的架構能夠執(zhí)行的機器指令是不一樣的。

    javascript依賴于什么支持

    轉化為V8引擎規(guī)定好的字節(jié)碼,不管在什么環(huán)境下都可以執(zhí)行,是跨平臺的,最后V8引擎會把字節(jié)碼轉化匯編指令,再轉化為不同環(huán)境對應的CPU指令。

    但是每次都走這套流程,還是不夠方便。比如有一個函數(shù)是重復使用的,但是使用前面一套流程,每次使用這個函數(shù)的時候,都需要被轉化為字節(jié)碼,然后再變?yōu)镃PU指令,性能比較低,如果可以直接將這個函數(shù)變?yōu)闄C器指令保存下來,使用這個函數(shù)的時候,直接運行機器指令,性能比較高,但是如果這個函數(shù)只運行一次,就沒有必要轉化變?yōu)闄C器代碼保存下來,會浪費空間。

    ④、使用TurboFan庫,是一個編譯器,會將字節(jié)碼編譯為CPU可以直接執(zhí)行的機器碼,他可以利用ignition來收集函數(shù)的執(zhí)行信息,了解到哪些函數(shù)執(zhí)行次數(shù)比較多,會將這類函數(shù)標記為hot ,熱函數(shù),然后就會將這個函數(shù)轉換為優(yōu)化之后的機器指令,以后再使用這個熱函數(shù)的時候,不需要上面繁瑣的過程,直接執(zhí)行機器指令就行。

    但是實際上機器碼也會被還原為ByteCode,這是因為如果后續(xù)執(zhí)行函數(shù)的過程中,類型發(fā)生改變,之前優(yōu)化的機器碼并不能正確地處理運算,就會逆向的轉換為字節(jié)碼。

    ⑤、Deoptimization: 比如有一個函數(shù)

    function  sum(num1,num2){    num1+num2 }
    登錄后復制

    調(diào)用sum函數(shù)

    sum(20,30) sum(28,30)
    登錄后復制

    如果傳入數(shù)字,調(diào)用sum函數(shù),需要做的工作就是對兩個數(shù)字進行相加,執(zhí)行的機器指令永遠是對這兩個數(shù)字進行相加.
    一旦改變傳入值的類型,如果變成字符串,那么這個函數(shù)的意思就是兩個字符串拼接。

    sum("aaa","bbb")
    登錄后復制

    這兩種類型的傳入值執(zhí)行“+”操作對應的機器指令是不同的,JavaScript是不會對傳入值的類型做檢測的,那么還是使用數(shù)字相加的機器指令,這次函數(shù)調(diào)用的結果是不能夠使用的。

    但是V8引擎中提供了一種解決辦法Deoptimization過程,這個過程是,一旦發(fā)現(xiàn)在執(zhí)行機器指令時候,執(zhí)行的操作不一樣的時候,Deoptimization會反向優(yōu)化,又轉化為字節(jié)碼,執(zhí)行后續(xù)操作。

    2、V8引擎的解析圖

    javascript依賴于什么支持

    V8執(zhí)行的細節(jié):

    ①、Blink將源碼交給V8引擎,Stream獲取到源碼并且進行編碼轉換

    ②、scanner會進行詞法分析,詞法分析之后會將代碼轉換為成tokens

    ③、tokens會被轉換為AST樹,經(jīng)過Parser和PreParser:

    Parser就是直接將tokens轉換為AST樹架構;

    PreParser預解析,為什么會需要預解析?

    1)如上圖中的函數(shù)outer(),內(nèi)部有一個函數(shù)inner(),但是并沒有任何調(diào)用inner()的代碼,那么就意味著并不是所有的JavaScript代碼,都是一開始就被執(zhí)行。對所有的JavaScript代碼進行解析,必定會影響網(wǎng)頁的運行效率。

    2)V8引擎實現(xiàn)了Lazy Parsing(延遲解析)的方案,作用是將不必要的函數(shù)進行預解析,我只需要知道有這么個函數(shù)就行,也就是只解析暫時需要的內(nèi)容,對函數(shù)的全量解析在函數(shù)被調(diào)用的時候才會執(zhí)行。

    3)例如上圖中函數(shù)outer中的inner函數(shù),它就是會執(zhí)行預解析。

    ④、生成AST樹之后,會被Ignition轉成字節(jié)碼,之后的過程就是代碼的執(zhí)行過程。

    贊(0)
    分享到: 更多 (0)
    網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號