- 相關(guān)推薦
JavaScript引擎是什么
JavaScript引擎是一種為解釋和執行JavaScript代碼而專(zhuān)門(mén)設計的流程虛擬機。將通過(guò)布局網(wǎng)頁(yè)使瀏覽器運行的布局引擎和解釋?zhuān)瑘绦写a的較低水平的JavaScript引擎作對比是相當重要的。以下是一些比較到位的闡述。
JavaScript引擎到底是做什么的呢?
當一切就緒,JavaScript的基本工作就是將開(kāi)發(fā)者寫(xiě)的JavaScript代碼轉換成能被瀏覽器理解甚至能在應用程序上運用的最優(yōu)化的快捷代碼。事實(shí)上,JavaScriptCore稱(chēng)自己是優(yōu)化的虛擬機。
更確切地說(shuō),每一個(gè) JavaScript 引擎都實(shí)現了ECMAScript的一種版本,而JavaScript 是它的一種方言叫法。JavaScript引擎會(huì )隨著(zhù)ECMAScript的發(fā)展而進(jìn)步,因為如此多不同的引擎都要與不同的瀏覽器一起運作,如headless browser, 或者像Node.js這樣的執行環(huán)境。
你可能對網(wǎng)頁(yè)瀏覽器很熟悉,但什么是headless browser呢?這是一種沒(méi)有形象的用戶(hù)交界面的網(wǎng)頁(yè)瀏覽器。它們擅長(cháng)對你的網(wǎng)頁(yè)產(chǎn)品進(jìn)行機械化的測試。PhantomJS.就是很好的例子。那Node.js又是什么呢?
Node.js是一種允許你在服務(wù)器端運用JavaScript的異步事件驅動(dòng)的框架。既然它們是由JavaScript驅動(dòng)的工具,它們也就應當受JavaScript引擎的驅動(dòng)。
通過(guò)以上對虛擬機的定義,將JavaScript引擎稱(chēng)為流程虛擬機也就是理所當然的了。因為它唯一的目的就是要讀取和編譯JavaScript代碼。然而這并不意味著(zhù)它只是一種簡(jiǎn)單的引擎。舉個(gè)例子,JavaScriptCore有6個(gè)分區來(lái)分析、翻譯、優(yōu)化以及垃圾收集JavaScript代碼。
這是如何運作的?
當然,這取決于引擎。WebKit的JavaScriptCore以及谷歌的V8引擎之所以能引起我們的興趣是因為NativeScript對它們起了杠杠作用。這兩種引擎不同程度地掌握著(zhù)過(guò)程碼。
JavaScriptCore是通過(guò)一系列的步驟去編譯和優(yōu)化腳本。
它會(huì )對詞匯進(jìn)行分析,將其分解成一系列的記號,或附上某些既定的意義。這些記號之后會(huì )被分析程序理出句法,并嵌入句法樹(shù)。之后4個(gè)JIT(及時(shí))程序開(kāi)始運行、分析和執行那些分析程序產(chǎn)生的字節碼。
嗯?簡(jiǎn)單講,JavaScript引擎將你的源代碼分解成串(又叫做分詞),再將那些串轉換成為編譯器能夠理解的字節碼,然后將其執行。
用C++編寫(xiě)的谷歌的V8引擎也能編譯和解釋JavaScript源代碼,掌握內存記憶配置且可垃圾回收殘留物。
它由2個(gè)能夠將源代碼直接轉換成計算機代碼的編譯器組成。
Full-codegen:輸出非優(yōu)化代碼的快速編譯器。
Crankshaft:輸出快速,優(yōu)化代碼的慢速編譯器。
如果Crankshaft認為由Full-codegen產(chǎn)生的不夠優(yōu)化的代碼需要優(yōu)化,它將會(huì )取而代之,這就是“crankshafting”流程。
有趣的事實(shí):機軸是運用在自動(dòng)化產(chǎn)業(yè)中內部氧化引擎里的一個(gè)完整的部分。這種眾所周知的引擎在更高級的載體也就是V8中有所運用。
若計算機代碼是由編譯過(guò)程產(chǎn)生的,那么這個(gè)引擎就會(huì )在瀏覽器中顯示出所有的ECMA標準規定的數據類(lèi)型、操作員、客體和功能,或者任何需要用到它們的運行環(huán)境,如NativeScript.
JavaScript引擎有哪些呢?
市場(chǎng)上有許多令人暈眩的JavaScript引擎要去分析、理解和執行客戶(hù)端的代碼。隨著(zhù)每一種瀏覽器新版本的出現,JavaScript引擎有時(shí)會(huì )做出一些改變或優(yōu)化來(lái)和JavaScript代碼編譯中的技術(shù)水平相契合。
為了避免被那些引擎的各種名字搞暈,請記住,有許多市場(chǎng)營(yíng)銷(xiāo)計劃會(huì )研究到它們強調的引擎和瀏覽器。在這份實(shí)用的JavaScript編輯器的分析報告中,作者諷刺到:萬(wàn)一你不理解,你要明白在編譯器中,差不多有37%是由市場(chǎng)因素組成的,品牌重塑是你在編輯器上可以做的不多的事情之一,因此引擎被賦予了迎合市場(chǎng)的名字:SquirrelFish, Nitro, SFX…
在市場(chǎng)因素對為引擎進(jìn)行命名以及重命名有著(zhù)重要影響的情況下,對JavaScript引擎發(fā)展史上的重大事件做記錄是很有必要的。為此,我編輯了一份便捷的表格供大家使用:
Browser, Headless Browser, or Runtime | JavaScript Engine |
---|---|
Mozilla | Spidermonkey |
Chrome | V8 |
Safari** | JavaScriptCore* |
IE and Edge | Chakra |
PhantomJS | JavaScriptCore |
HTMLUnit | Rhino |
TrifleJS | V8 |
Node.js*** | V8 |
Io.js*** | V8 |
JavaScriptCore被重寫(xiě)為SquirrelFish,也被重塑成SquirrelFishExtreme品牌,又叫做Nitro。然而,在WebKit安裝啟用下的JavaScript的確也被稱(chēng)為JavaScript引擎(如Safari)。
**iOS開(kāi)發(fā)者應該認識到Mobile Safari包含Nitro,但UIWebView并不包括JIT編譯器,所以這個(gè)過(guò)程會(huì )比較慢。然而,有了iOS8系統,開(kāi)發(fā)者可以運用包含Nitro的WKWebView來(lái)大幅度加速這個(gè)運行速度。Hybrid App的開(kāi)發(fā)者應該會(huì )覺(jué)得比較輕松。
之所以有做出將io.js從Node.js中分離出來(lái)的一個(gè)因素是和可以支持這個(gè)項目的V8版本有關(guān)。這將會(huì )是一個(gè)挑戰,就像這邊所列出來(lái)的一樣。
【JavaScript引擎是什么】相關(guān)文章:
javascript是什么意思10-08
javascript函數到底是什么04-29
理解javascript中的with關(guān)鍵字是什么意思10-11
調用javascript08-02
對javascript的理解08-08
javascript的方法08-09
Javascript模板07-29
編寫(xiě)JavaScript函數10-24