自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

速度與激情2:JavaScript編譯器如何工作

開發(fā) 前端
當(dāng)我們談?wù)揓avaScript引擎的時候,通常是指它的編譯器,一個把人類可讀的源代碼(本文中指JavaScript代碼)翻譯成機(jī)器可讀的指令的程序。如果你還沒考慮過你的代碼在運(yùn)行時會發(fā)生什么,那么這聽起來可能相當(dāng)神奇,但編譯本質(zhì)上只是一個翻譯練習(xí),讓代碼運(yùn)行的快才是神奇的。

當(dāng)我們談?wù)揓avaScript引擎的時候,通常是指它的編譯器,一個把人類可讀的源代碼(本文中指JavaScript代碼)翻譯成機(jī)器可讀的指令的程序。如果你還沒考慮過你的代碼在運(yùn)行時會發(fā)生什么,那么這聽起來可能相當(dāng)神奇,但編譯本質(zhì)上只是一個翻譯練習(xí),讓代碼運(yùn)行的快才是神奇的。

[[74894]] 

簡單編譯器是怎么工作的

JavaScript被認(rèn)為是高級語言,這意味著它是人類可讀的并且具有高度的靈活性。編譯器的工作是把高級語言轉(zhuǎn)換成計(jì)算機(jī)本地指令。

 

一個簡單的編譯程序有四個處理過程:詞法分析器、解析器、翻譯器、解釋器。

  • 1. 詞法分析器(或者說是掃描器,分詞器),掃描源碼并把它轉(zhuǎn)換為原子單位,稱為記號。最常見的實(shí)現(xiàn)是使用正則表達(dá)式進(jìn)行模式匹配。
  • 2.  被標(biāo)記化之后的代碼被傳入解析器,解析器對代碼結(jié)構(gòu)和作用范圍進(jìn)行識別和編碼,生成語法樹。
  • 3. 這種類似圖的結(jié)構(gòu)之后被傳入翻譯器翻譯成字節(jié)碼。其中最簡單的實(shí)現(xiàn)是把一個龐大的switch語句標(biāo)記映射成等價的字節(jié)碼。
  • 4. 然后字節(jié)碼被傳入字節(jié)碼解釋器,被轉(zhuǎn)換為本機(jī)代碼。

這是經(jīng)典的編譯器設(shè)計(jì),已經(jīng)存在了很多年。但是桌面程序和瀏覽器的要求有很大不同。這種經(jīng)典的結(jié)構(gòu)在多個方面都有缺陷。解決這些問題的創(chuàng)新方式,是瀏覽器的速度競賽故事。

快速、輕量、正確

JavaScript語言是非常靈活和具有兼容性的程序結(jié)構(gòu)。那么你怎么寫這種后期綁定、弱類型、動態(tài)語言的編譯器呢?在你使它變快之前,必須先使它變精確,或者像Brendan Eich說的,

“快速、輕量、正確。任意選擇兩個,只要(結(jié)果)是正確的”

一種創(chuàng)新的測試編譯器正確性的方式是“模糊測試”。Mozilla的Jesse Ruderman創(chuàng)建的jsfunfuzz正是這個目的。Brendan稱它為“JavaScript 嘲弄產(chǎn)生器”,因?yàn)樗哪康氖莿?chuàng)造怪異但是語法有效的結(jié)構(gòu),然后看編譯器能否處理。這種工具在驗(yàn)證編譯錯誤和邊界問題上非常有幫助。

JIT 編譯器

經(jīng)典結(jié)構(gòu)的原則性問題是運(yùn)行時的字節(jié)碼翻譯非常慢。在編譯過程中,將字節(jié)碼翻譯成機(jī)器代碼時增加一個步驟可以帶來性能提升。不幸的是停留幾分鐘在網(wǎng)頁上等待它完全編譯是不會讓你的瀏覽器流行的。

解決方案是由JIT提出的“懶編譯”,或者叫實(shí)時編譯。顧名思義,它只將你用到的這部分代碼實(shí)時編譯成機(jī)器代碼。JIT編譯器有多種多樣,各自有各自的優(yōu)化策略。比如正則表達(dá)式編譯器致力于優(yōu)化單個任務(wù),而其它的編譯器可能優(yōu)化像循環(huán)或函數(shù)這些常見操作?,F(xiàn)代化的JavaScript引擎會用到多種編譯器,分工合作,從而你代碼的性能得到提升。

JavaScript JIT 編譯器

***個JavaScript JIT編譯器是Mozilla的TraceMonkey。這是一個“跟蹤JIT”,因?yàn)樗母櫬窂绞菑哪愕拇a中尋找常見的可執(zhí)行代碼段。然后這些“常見代碼段”被編譯成機(jī)器代碼。和以前的引擎相比,Mozilla的這種優(yōu)化可以帶來20%-40%的性能提升。

在TraceMonkey推出后不久,谷歌就發(fā)布了擁有全新V8引擎的Chrome瀏覽器。V8引擎是為速度而生。一個關(guān)鍵的設(shè)計(jì)是它完全跳過了字節(jié)碼生成,取而代之的是由翻譯器產(chǎn)生本地機(jī)器代碼。V8團(tuán)隊(duì)在一年之內(nèi)已經(jīng)實(shí)現(xiàn)了寄存器分配、改善高速緩存、重寫正則引擎,使其比原來快了10倍。他們 JavaScript整體執(zhí)行速度被提高了150%。速度競賽才剛剛開始。

最近瀏覽器廠商都紛紛推出了含有一個附加步驟的優(yōu)化編譯器。在定向流圖(DFG)或語法樹生成之后,編譯器可以使用這方面知識,在機(jī)器代碼產(chǎn)生之前進(jìn)一步優(yōu)化性能。Mozilla的IonMonkey和Google的Crankshaft就是DFG編譯器的例子。

所有這些別具匠心的設(shè)計(jì),其宏偉的目標(biāo)就是使Javascript代碼運(yùn)行的和本地C代碼一樣快。這個目標(biāo)在幾年前聽起來好像是在搞笑,現(xiàn)在已經(jīng)越來越近。在第三部分,我們將看到編譯器的設(shè)計(jì)者使用多種策略,開發(fā)速度更快的Javascript編譯器。

英文原文:John Dalziel

譯文鏈接:http://blog.jobbole.com/41184/

責(zé)任編輯:林師授 來源: 伯樂在線
相關(guān)推薦

2022-09-01 09:35:13

java應(yīng)用工具

2017-04-25 09:38:19

戴爾

2017-03-20 18:01:55

編譯器匯編

2016-06-15 09:28:09

新型編譯器JavaScript類型

2021-06-25 10:38:05

JavaScript編譯器前端開發(fā)

2010-01-21 09:26:53

CC++編譯器

2011-08-24 15:28:02

Lua編譯器解釋器

2014-05-04 12:51:21

Javascript編譯器

2010-01-14 15:29:44

C++編譯器

2011-07-08 14:18:44

云特區(qū)云計(jì)算

2021-01-29 11:37:26

同態(tài)加密HE隱私保護(hù)

2017-04-20 08:47:30

2010-01-27 16:39:48

C++編譯器

2015-04-14 11:01:08

大數(shù)據(jù)速度與激情用車法則

2010-01-18 10:34:21

C++編譯器

2021-06-08 07:48:26

lambda表達(dá)式編譯器

2022-08-02 08:11:41

監(jiān)控埋點(diǎn)埋點(diǎn)方式插樁

2009-08-10 17:12:54

C#編譯器

2013-03-29 10:02:37

編譯器語言編譯開發(fā)

2010-01-08 16:00:46

C++編譯器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號