- 原文地址:How Does JavaScript Really Work? (Part 1)
- 原文做者:Priyesh Patel
- 譯者:Chor
若是你是一個 JS 開發者或者是正在學習這門語言的學生,很大機率上你會遇到雙字母詞"V8"。在這篇文章中,我將會爲你簡述不一樣的 JS 引擎並深刻探究 V8 引擎的工做機制。文章的第二部分涵蓋了內存管理的概念,不久後將發佈。javascript
這篇文章是由 Bit (GitHub) 帶來的。做爲一個共享組件的平臺,Bit 幫助每一個人構建模塊化的 JavaScript 應用程序,在項目和團隊之間輕鬆地共享組件,同時實現更好&更快的構建。試試看。java
在開始講解 JavaScript 以前,咱們首先要理解任意一門編程語言的基本工做方式。電腦是由微處理器構成的,咱們經過書寫代碼來命令這臺小巧但功能強大的機器。可是微處理器能理解什麼語言?它們沒法理解 Java,Python 等語言,而只懂機器碼。
用機器語言或彙編語言編寫企業級代碼是不可行的,所以咱們須要像 Java,Python 這樣配帶一個解釋器或者編譯器用於將其轉換爲機器碼的高級語言。git
編譯器/解釋器能夠用它處理的語言或任何其餘語言來編寫。 github
解釋器: 一行一行地快速讀取和翻譯文件。這就是 JavaScript 最初的工做原理。web
編譯器: 編譯器提早運行並建立一個文件,其中包含了輸入文件的機器碼轉換。編程
有兩種途徑能夠將 JavaScript 代碼轉換爲機器碼。編譯代碼時,機器對代碼開始運行前將要發生的事情有更好的理解,這將加快稍後的執行速度。不過,在這個過程以前須要花費時間。 瀏覽器
另外一方面,解釋代碼時,執行是當即的,所以要更快,可是缺少優化致使它在大型應用程序下運行緩慢。架構
建立 ECMAScript 引擎的人很聰明,他們集兩者之長開發了 JIT(Just-in-time) 編譯器。JavaScript 同時被編譯和解釋,但實際實現和順序取決於引擎。咱們將會看到 V8 團隊採用的是什麼策略。編程語言
就 JavaScript 而言,有一個引擎將其轉換爲機器碼。和其餘語言相似,引擎能夠用任何語言來開發,所以這樣的引擎不止一個。ide
還有不少,若是你想知道 Internet Explorer 背後的引擎,查看這個維基百科頁面.
面對這麼多的引擎,你可能會問:我能夠開發本身的引擎嗎?能夠,只要遵循 ECMAScript 標準。
若是咱們打算作一個翻譯器,那麼就必須知道這兩門語言的有效字。咱們已經知道機器語言中什麼是有效的了,可是對於 JavaScript,這是須要進行標準化的。
JavaScript 的標準化工做是由 Ecma 國際組織負責的,相關規範被稱爲 ECMAScript 或者 ES。所以,當你看到一篇文章/視頻提到「ES7 有什麼新特性?」時,你就知道它表明的是 ECMAScript 標準中新增的 JS 特性。
谷歌針對瀏覽器開發了谷歌地圖,而這對瀏覽器的處理能力提出了很高的要求。那時的 JavaScript 實現尚不足以快速地運行地圖。谷歌想要吸引更多的用戶使用這項服務,從而進行廣告銷售並牟利。基於這個緣由,這項服務必須快速且穩定。所以谷歌本身用 C++ 開發了 V8 引擎並在 2008 年啓用,它的速度很快,或者就像一些人說的,它的速度是最快的。
JavaScript 文件進入引擎後,解析器進行詞法解析,它將代碼分解成 token 以肯定它們的含義。這些 token 組成了AST(抽象語法樹)。
編譯器在語義分析中驗證語言元素和關鍵詞的正確用法,而 ASTs 在這個過程當中扮演着重要的角色。以後,ASTs 被用於生成實際的字節碼或者機器碼。
在V8 的 5.9 版本推出以前,它使用兩個優化編譯器和一個基線編譯器。
JavaScript 增長了新的特性後,架構的複雜度上升,維護相同的管道對 V8 團隊來講變得更加困難了。若是你想閱讀更多相關的舊方法以及轉向新管道的緣由,能夠訪問他們的網站。
隨着更多進一步提高性能的研究的進行,V8 引擎的工做機制在將來還可能發生變化。此外,隨着 Webassembly 逐漸成形,可能會向管道添加額外步驟。
ECMAScript 引擎的實現有不少,其中以谷歌的 V8 最爲出名。但願這篇文章的簡述不只能夠幫助你理解 JavaScript 的工做原理,還能從大致上瞭解一門編程語言的工做原理。若是你想了解 V8 團隊的將來計劃或者引擎的細節,這裏有一篇很不錯的博客。
本文的第二部分將會在不久後發佈,其中將談到內存堆,棧,事件循環以及更多與 JavaScript 代碼執行相關的概念。敬請關注!
若是你不清楚 Node.js 在其中的做用,我這裏碰巧寫了一篇不錯的文章:
What exactly is Node.js?)