JavaScript運行原理解析

JavaScript運行原理

知其然,也要知其因此然,這裏主要談一談對JavaScript運行原理的理解。javascript

JAVA虛擬機

首先咱們從JAVA虛擬機提及。java

首先說一下爲何要作成虛擬機,由於機器不一樣,若是沒有虛擬機咱們就至關於須要針對每一種機器都要進行代碼編譯,這樣確定是不合理的。因此爲了解決這樣的問題,Java引入虛擬機(VM)的概念,讓編譯後的代碼直接跑在一臺虛擬的機器上,不管最終的目標平臺是什麼,都在上面構建出一個虛擬的一致的虛擬機出來,就能夠達到一次編譯處處執行的效果了。web

而從根本上來講Java和C#不是Native語言,編譯的結果不是機器指令,而是某種自有的指令格式,本身運行不了,須要專門的程序去解釋執行,這個程序就是咱們所說的「虛擬機」。算法

反之,C、C++、Go、Rust這種語言是Native語言,編譯出來的結果是機器指令,能夠本身直接運行,不存在「虛擬機」的概念。api

JavaScript引擎

而JavaScript引擎所作的工做和JAVA虛擬機很類似瀏覽器

作了什麼

JS引擎主要是對JS代碼進行詞法、語法等分析,經過編譯器將代碼編譯成可執行的機器碼讓計算機去執行。less

簡單來講它的惟一的目的就是讀取和編譯JavaScript代碼,也就是說能夠分析、解釋、優化、垃圾回收javascript代碼。優化

執行過程

JavaScript引擎會加載源代碼,把它分解成字符串(又叫作分詞),再把這些字符串轉換成編譯器能夠理解的字節碼,而後執行這些字節碼。設計

Google的V8引擎是用C++ 編寫的,它也可以編譯並執行JavaScript源代碼、處理內存分配和垃圾回收。它被設計成由兩個編譯器組成,能夠把源碼直接編譯成機器碼,具體的執行過程能夠當作如下幾步:code

  1. 它進行詞法分析,就是將源代碼分解成一系列具備明確含義的符號或字符串。
  2. 而後用語法分析器分析這些符號,將其構建成語法樹。
  3. 接着四個 JIT(Just-In-Time)進程開始參與進來,分析和執行解析器所生成的字節碼。

與ECMAScript的關係

準確地講,每一個JavaScript引擎都實現了一個版本的ECMAScript,JavaScript是它的一個分支。隨着ECMAScript的不斷髮展,JavaScript引擎也不斷改進。之因此有這麼多不一樣的引擎,是由於它們每一個都被設計運行在不一樣的web瀏覽器、headless瀏覽器、或者像Node.js那樣的運行時環境中。

JavaScript引擎是一段程序,咱們寫的JavaScript代碼也是程序,如何讓程序去讀懂程序呢?這就須要定義規則。好比:

var a = 1 + 1

左邊var表明了這是申明(declaration),它申明瞭a這個變量
右邊的+表示要將1和1作加法
中間的等號表示了這是個賦值語句
最後的分號表示這句語句結束了
上述這些就是規則,有了它就等於有了衡量的標準,JavaScript引擎就能夠根據這個標準去解析JavaScript代碼了。那麼這裏的ECMAScript就是定義了這些規則。其中ECMAScript 62這份文檔,就是對JavaScript這門語言定義了一整套完整的標準。其中包括:

var,if,else,break,continue等是JavaScript的關鍵詞
abstract,int,long等是JavaScript保留詞
怎麼樣算是數字、怎麼樣算是字符串等等
定義了操做符(+,-,>,<等)
定義了JavaScript的語法
定義了對錶達式,語句等標準的處理算法,好比遇到==該如何處理
標準的JavaScript引擎就會根據這套文檔去實現,注意這裏強調了標準,由於也有不按照標準來實現的,好比IE的JS引擎。這也是爲何JavaScript會有兼容性的問題。至於爲何IE的JS引擎不按照標準來實現,就要說到瀏覽器大戰了,這裏就不贅述了,自行Google之。

因此,簡單的說,ECMAScript定義了語言的標準,JavaScript引擎根據它來實現,這就是二者的關係。

RunTime

運行時能夠簡單理解爲當前的運行環境,不一樣的環境提供了不一樣的api調用,如web瀏覽器中的window對象,DOM相關API等,這些接口能夠提供相關的JS調用,

相關文章
相關標籤/搜索