国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【1】解析與編譯

Meathill / 829人閱讀

摘要:解析與編譯從源程序到可以被計算機識別的目標程序主要包含兩個階段解析生成抽象語法樹編譯執行解析以引擎為例,前置的解析被分為兩種類型。解釋器就像口譯員,從源代碼第一行開始進行解析編譯執行。

解析與編譯

Javascript 從源程序到可以被計算機識別的目標程序主要包含兩個階段:

解析生成抽象語法樹

編譯執行

解析

以V8引擎為例,前置的解析被分為兩種類型:Pre-ParserFull-Parser

Pre-Parser,主要負責對整個 Javascript 源代碼進行必要的前期檢查,判斷是否存在語法錯誤。只在 Top-level 代碼執行前進行。

這里是一種比較普遍的流程,在使用某個事物之前,靠譜的做法當然是先明確下能不能用。

Full-Parser,做的工作相應比較多些,包含:

通過分詞/詞法分析解析/語法分析生成抽象語法樹(Abstract Syntax Tree,AST)

進行作用域分析,為變量分配內存,生成可用的上下文作用域。具體包括:

將形參作為 GO/AO 的屬性,賦值為實參值

將變量作為 GO/AO 的屬性,賦值為 undefind

將函數作為 GO/AO 的屬性,賦值為其函數體

創建該函數的作用域鏈等

GO (Global Object),全局環境下創建全局對象。   
AO (Active Object),函數執行前創建激活對象。

Full-Parser,在Top-level代碼和非Top-level代碼執行前都會進行。函數在被調用執行前,經過Full-Parser生成抽象語法樹提供給JIT編譯器,生成目標語言執行。

Top-level 是指源代碼初次加載時需要被首先運行到的“頂層”代碼。

V8引擎不一次性完成 Javascript 源代碼對應的 AST 信息,而是在知道要執行哪段代碼前,將這段代碼完成 AST 的生成。

想要了解 AST 信息,可查看 AST 生成工具。

問題:   
【1】變量提升的原因是因為為了提高執行效率,在代碼執行前Full-Parser階段為變量分配資源。
【2】函數聲明優先于變量聲明是因為變量聲明只檢查變量是否存在,而函數聲明需要更新變量值。
編譯執行:

在了解JS的編譯過程前,先明確兩個概念:解釋器、編譯器。
解釋器就像口譯員,從源代碼第一行開始進行解析編譯執行。
編譯器則是直接將完整的源代碼完全編譯生成目標程序,從而快速執行。
解釋器與編譯器各有各的優勢,解釋器能夠快速啟動與執行,瀏覽器能夠快速執行JS代碼對Web頁面來說是非常重要的,這也是為什么瀏覽器使用解釋器來解析JS源代碼。
但是,在使用解釋器也存在著一些弊端,比如在處理循環的時候,解釋器并沒有很好的處理重復的“翻譯”工作。所以在早期(2008年以前)JS執行的速度并不是很快。
然而,編譯器除了編譯時間長一些,可以對代碼有更好的優化,從而能夠更快的執行代碼。因而,在2008年,多種瀏覽器添加了即時編譯器(JIT, just in time),使得JS的執行速度提高了10倍。
那么JIT做了些什么事情呢?
JIT包含兩部分構成:

基線編譯器

優化編譯器

首先源代碼會經過基線編譯器解析編譯生成未優化的目標代碼。同時JS引擎有稱為監視器/分析器的部件,記錄代碼執行的次數和方式。
當某段代碼執行次數變多時,如函數頻繁調用、循環代碼塊等,基線編譯器會對這段代碼做一些優化。當這段代碼執行次數越來越多,監視器會將這段代碼交給優化編譯器,從而生成更快的版本。
為了生成更快的版本,優化編譯器必須做一些假設,并且生成的代碼也是默認這些假設都成立的。但是,如果在代碼執行過程中,某個假設失敗了,瀏覽器將執行返回到解釋器或者基線編譯的版本。
這個過程稱為去優化,所以循環中數據類型與結構的變化可能會對優化編譯過程造成影響。

具體流程如下:

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/102002.html

相關文章

  • mybatis深入理解(一)之 # $ 區別以及 sql 預編譯

    摘要:在動態解析階段,和會有不同的表現解析為一個預編譯語句的參數標記符。其次,在預編譯之前已經被變量替換了,這會存在注入問題。預編譯語句對象可以重復利用。默認情況下,將對所有的進行預編譯。總結本文主要深入探究了對和的不同處理方式,并了解了預編譯。 mybatis 中使用 sqlMap 進行 sql 查詢時,經常需要動態傳遞參數,例如我們需要根據用戶的姓名來篩選用戶時,sql 如下: sele...

    shadowbook 評論0 收藏0
  • JavaScript 啟動性能瓶頸分析解決方案

    摘要:啟動性能瓶頸分析與解決方案翻譯自的,從屬于筆者的前端入門與工程實踐。我們必須要清醒地認識到全面評測以挖掘出真正性能瓶頸的重要性。這可能是最佳的方式了,類似于這樣的模式鼓勵基于路由的分組,目前被與廣泛使用。 JavaScript 啟動性能瓶頸分析與解決方案 翻譯自 Addy Osmani 的 JavaScript Start-up Performance,從屬于筆者的Web 前端入門與工...

    SQC 評論0 收藏0
  • 讀書筆記之深入理解Java虛擬機

    摘要:前言本文內容基本摘抄自深入理解虛擬機,以供復習之用,沒有多少參考價值。此區域是唯一一個在虛擬機規范中沒有規定任何情況的區域。堆是所有線程共享的內存區域,在虛擬機啟動時創建。虛擬機上把方法區稱為永久代。 前言 本文內容基本摘抄自《深入理解Java虛擬機》,以供復習之用,沒有多少參考價值。想要更詳細了解請參考原書。 第二章 1.運行時數據區域 showImg(https://segment...

    jaysun 評論0 收藏0
  • 譯 the cost of JS

    摘要:高級開發人員可能會仔細分析他們的捆綁包,以幫助確定減少不必要依賴。在運行過程中,長時間運行的可以阻塞主線程導致頁面沒有響應。然后當最終被取出時,附加事件請注意這有內在的花銷。發送一個最小功能的頁面包含實行當前功能的。保持低這些問題。 原文 當我們構建的網頁大量依賴于Javascript,我們有些時候需要研究那些不太容易看得見的消耗。在這篇文章中,我將介紹為什么一點規則可以幫助如果你想讓...

    Yangder 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<