中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

V8是怎么執行一段JavaScript代碼的

發布時間:2023-04-11 16:08:51 來源:億速云 閱讀:246 作者:iii 欄目:開發技術

這篇文章主要講解了“V8是怎么執行一段JavaScript代碼的”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“V8是怎么執行一段JavaScript代碼的”吧!

    編譯器和解釋器

    之所以存在編譯器和解釋器,是因為機器不能直接理解我們所寫的代碼,所以在執行程序之前,需要將我們所寫的代碼“翻譯”成機器能讀懂的機器語言。按語言的執行流程,可以把語言劃分為編譯型語言和解釋型語言。

    編譯型語言在程序執行之前,需要經過編譯器的編譯過程,并且編譯之后會直接保留機器能讀懂的二進制文件,這樣每次運行程序時,都可以直接運行該二進制文件,而不需要再次重新編譯了。比如 C/C++、GO 等都是編譯型語言。

    而由解釋型語言編寫的程序,在每次運行時都需要通過解釋器對程序進行 動態解釋和執行。比如 Python、JavaScript 等都屬于解釋型語言。

    編譯器解釋器 是如何“翻譯”代碼的呢?具體流程你可以參考下圖:

    V8是怎么執行一段JavaScript代碼的

    1. 生成抽象語法樹(AST)和執行上下文

    編譯器或者解釋器后續的工作都需要依賴于 AST,而不是源代碼。

    Babel 的工作原理就是先將 ES6 源碼轉換為 AST,然后再將 ES6 語法的 AST 轉換為 ES5 語法的 AST,最后利用 ES5 的 AST 生成 JavaScript 源代碼。

    ESLint 是一個用來檢查 JavaScript 編寫規范的插件,其檢測流程也是需要將源碼轉換為 AST,然后再利用 AST 來檢查代碼規范化的問題。

    通常,生成 AST 需要經過兩個階段:

    第一階段是分詞(tokenize),又稱為 詞法分析。其作用是將一行行的源碼拆解成一個個語法上不可能再分的、最小的單個字符或字符串。

    第二階段是解析(parse),又稱為 語法分析。其作用是將上一步生成的數據,根據語法規則轉為 AST。如果源碼符合語法規則,這一步就會順利完成。但如果源碼存在語法錯誤,這一步就會終止,并拋出一個“語法錯誤”。有了 AST 后,那接下來 V8 就會生成該段代碼的執行上下文。

    2. 生成字節碼

    有了 AST 和執行上下文后,那接下來的第二步,解釋器 Ignition 就登場了,它會根據 AST 生成字節碼,并解釋執行字節碼。

    字節碼就是介于 AST 和機器碼之間的一種代碼。但是與特定類型的機器碼無關,字節碼需要通過解釋器將其轉換為機器碼后才能執行。使用字節碼可以減少系統的內存使用。

    3. 執行代碼

    生成字節碼之后,接下來就要進入執行階段了。解釋器 Ignition 除了負責生成字節碼之外,它還有另外一個作用,就是解釋執行字節碼。

    在 Ignition 執行字節碼的過程中,如果發現有熱點代碼(HotSpot),比如一段代碼被重復執行多次,這種就稱為 熱點代碼,那么后臺的編譯器 TurboFan 就會把該段熱點的字節碼編譯為 高效的機器碼,然后當再次執行這段被優化的代碼時,只需要執行編譯后的機器碼就可以了,這樣就大大提升了代碼的執行效率。

    其實字節碼配合解釋器和編譯器是最近一段時間很火的技術,比如 Java 和 Python 的虛擬機也都是基于這種技術實現的,我們把這種技術稱為 即時編譯(JIT)。具體到 V8,就是指解釋器 Ignition 在解釋執行字節碼的同時,收集代碼信息,當它發現某一部分代碼變熱了之后,TurboFan 編譯器便閃亮登場,把熱點的字節碼轉換為機器碼,并把轉換后的機器碼保存起來,以備下次使用。

    JavaScript 的性能優化

    對于優化 JavaScript 執行效率,應該將優化的中心聚焦在 單次腳本的執行時間腳本的網絡下載 上,主要關注以下三點:

    提升單次腳本的執行速度,避免 JavaScript 的長任務霸占主線程,這樣可以使得頁面快速響應交互。

    避免大的內聯腳本,因為在解析 HTML 的過程中,解析和編譯也會占用主線程。

    感謝各位的閱讀,以上就是“V8是怎么執行一段JavaScript代碼的”的內容了,經過本文的學習后,相信大家對V8是怎么執行一段JavaScript代碼的這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    赣榆县| 聂拉木县| 布尔津县| 钟山县| 黄石市| 漳浦县| 碌曲县| 内江市| 呼伦贝尔市| 山阴县| 铜川市| 赫章县| 承德县| 漳州市| 东方市| 淮南市| 汕尾市| 盐源县| 通渭县| 申扎县| 房产| 瓮安县| 平南县| 新化县| 资兴市| 台前县| 昌图县| 仲巴县| 通州市| 南郑县| 平陆县| 华蓥市| 丹阳市| 石阡县| 安图县| 新丰县| 木兰县| 宜城市| 土默特左旗| 旬邑县| 彰化县|