前幾天,我開始想寫前端生態周邊之瀏覽器幕後的文章。其實也是是對於零碎知識進行整合。但願能給你們帶來從0-1,而非模塊 的認識。另一個初衷也是做爲前端的視角到底應該瞭解瀏覽器的什麼內容。(不少人想深刻要看下WebKit源碼,V8源碼我的感受稍微有點離譜 並不適合每一個前端同窗去實踐 會讓你感受到絕望)前端
但願你們在認真閱讀的過程當中可以糾正個人問題。快來打我臉!
今天來到了你們平常接觸最多的模塊 JS引擎相關的內容;本篇文章的內容包含:node
爲了更好地理解Event Loop,請看下圖
上圖中,主線程運行的時候,產生堆(heap)和棧(stack),棧中的代碼調用各類外部API,它們在"任務隊列"中加入各類事件(onClick,onLoad)。只要棧中的代碼執行完畢,主線程就會去讀取"任務隊列",依次執行那些事件所對應的回調函數。
執行棧中的代碼,老是在讀取"任務隊列"以前執行。git
執行棧(execution context stack)
是JavaScript執行事件任務的線程。
請看下面這個gif圖:github
任務隊列(task queue)
是進行存放異步任務運行結果事件 一種是同步任務(synchronous),另外一種是異步任務(asynchronous):
請看下面這個gif圖:
(學過C++語言都知道main做爲主入口。不瞭解的不要緊此處main函數可作忽略)~~正則表達式
console.log("end);進入主線程執行算法
執行順序爲 2-5-4-3
event-loop
能夠理解爲一個處理機制。
主線程任務執行==主線程從"任務隊列"中讀取事件==執行...,這是個循環的過程。這種運行機制稱爲Event Loop(事件循環)
對照上面的動畫 簡單理解爲主線程爲空時就從任務隊列讀取待執行的事件(timer1,timer2)進入主線程進行執行。express
JavaScript 引擎 是一個程序或者執行 JavaScript 代碼的解釋器。一個JavaScript 引擎能夠做爲一個單獨的解釋器實現或者經過某種方式將 JavaScript 編譯爲字節碼的即時編譯器。json
常說的JavaScript 引擎:後端
下面介紹一下V8的一些內部實現,優點。
// 函數 function greet() { console.log("wlove"); } // AST樹 json {"type":"Program","start":0,"end":47,"body":[{"type":"FunctionDeclaration","start":0,"end":46,"id":{"type":"Identifier","start":9,"end":14,"name":"greet"},"expression":false,"generator":false,"async":false,"params":[],"body":{"type":"BlockStatement","start":17,"end":46,"body":[{"type":"ExpressionStatement","start":23,"end":44,"expression":{"type":"CallExpression","start":23,"end":43,"callee":{"type":"MemberExpression","start":23,"end":34,"object":{"type":"Identifier","start":23,"end":30,"name":"console"},"property":{"type":"Identifier","start":31,"end":34,"name":"log"},"computed":false,"optional":false},"arguments":[{"type":"Literal","start":35,"end":42,"value":"wlove","raw":"\"wlove\""}],"optional":false}}]}}],"sourceType":"module"}
字節碼解釋器TurboFan
內部也存在不少工做內容簡單列取幾點:api
Ignition
(字節碼解釋器) + TurboFan
(JIT編譯器) 的組合;後面的應用也是愈來愈廣 )虛擬機(垃圾回收,內存管理等)
V8 使用了分代和大數據的內存分配,在回收內存時使用精簡整理的算法標記未引用的對象,而後消除沒有標記的對象,最後整理和壓縮那些還未保存的對象,便可完成垃圾回收。
內存分配:
大對象:爲那些須要使用較多內存對象分配內存,固然一樣可能包含數據和代碼等分配的內存,一個頁面只分配一個對象。
內存(垃圾)回收:
主要類以下所示:
Script
:Script類 包含JS代碼,和編譯後的本地代碼。(此處爲編譯入口)Compiler
:編譯器類:Script類調用編譯生成代碼 包括生成AST,本地代碼等。AstNode
:抽象語法樹node類(做爲節點基類,包含不少子類爲後續生成代碼作輔助)AstVisitor
:抽象語法樹訪問類,主要用來遍歷異構的抽象語法樹;FullCodeGenerator
:訪問類可調用來遍歷AST來爲JS生成本地可執行代碼。編譯過程大概爲:
主要類以下所示:
Script
此處爲運行入口 編譯以後生成的本地代碼;Execution
:JS運行過程當中的輔組類;包含一些函數 如call函數;JSFunction
:須要執行的JavaScript函數表示類;Runtime
:運行這些本地代碼的輔組類,主要提供運行時所需的輔組函數,如:屬性訪問、類型轉換、編譯、算術、位操做、比較、正則表達式等;Heap
:運行本地代碼須要使用的內存堆類;MarkCompactCollector
:垃圾回收機制的主要實現類,用來標記、清除和整理等基本的垃圾回收過程;SweeperThread
:負責垃圾回收的線程。
執行過程大概爲:
固然V8內部還有不少例如隱藏類,擴展機制等等。有興趣能夠看一下
《WebKit技術內幕》
若是想要讀源碼推薦從
代碼量還少的V8 開始閱讀。加油少年。
分享一下最近: 工做很忙很忙(對接外部資源,整合內部,作技術探索研發...);生活很忙很忙(有一點就是運動必定要堅持下來..) 而後呢寫做也會堅持下來(每週1-3篇)。你們有任何想了解的內容隨時留言 只要我知道的就會馬上分享出來幫助你們。若是不知道我能夠去學。嘿嘿
下一篇待定吧 加油 前程似錦 靚仔靚女!!!
上文圖片部分來源網絡 侵權請聯繫刪除 謝謝。