谷歌發(fā)布了新的JavaScript解釋器Ignition,Chrome 53將在一些內存有限的Android設備上使用它。
谷歌資深軟件工程師Ross McIlroy在一篇博文中探討了構建Ignition的原因。
V8目前沒有解釋器。初始執(zhí)行的JavaScript代碼最先被解析,并編譯成一個未優(yōu)化的狀態(tài)。解析器和編譯器的協(xié)同工作機制會導致部分代碼后續(xù)解析兩次、甚至是三次。總之,按照谷歌的說法,V8將33%的頁面啟動時間用在了解析和編譯代碼上。這也導致了大量的內存開銷。
通過使用解釋器,谷歌希望減少當前系統(tǒng)的內存使用。Ignition還是依賴于一個解析器,但JavaScript被編譯成字節(jié)碼,而不是原生代碼。McIlroy表示,“我們[使用Ignition]將代碼編譯成簡潔的字節(jié)碼,而不是編譯成機器碼,大大減少了結果代碼。因此,我們可以減少系統(tǒng)的內存使用,對于不常運行的函數而言尤其如此。”
由于字節(jié)碼較小,所以可以編譯全部源代碼,而不用避免編譯未使用的代碼。也就是說,腳本只需要解析一次,而不是像當前的編譯過程那樣解析多次。
McIlroy還提供了一些技術細節(jié):
Ignition解釋器使用低級的、體系結構無關的TurboFan宏匯編指令為每個操作碼生成字節(jié)碼處理程序。TurboFan將這些指令編譯成目標平臺的代碼,并在這個過程中執(zhí)行低級的指令選擇和機器寄存器分配。Ignition是一個寄存器機,每個字節(jié)碼都將其輸入和輸出指定為顯式寄存器尋址;它不是一個棧式機,每個字節(jié)碼消費輸入,并把輸出推送到一個隱式棧上。
其他瀏覽器供應商已經將使用解釋器作為第一個步驟。Mozilla的SpiderMonkey和微軟的Chakra JavaScript引擎都是一開始就有解釋器,而且它們都是連接到了一個兩層的編譯系統(tǒng)。
從Chrome 53(預計在9月初發(fā)布穩(wěn)定版本)開始,內存為512MB或不足512MB的Android設備將開始使用Ignition。要想深入了解Ignition,請查看谷歌發(fā)布的設計文檔。
查看英文原文:V8's New JavaScript Interpreter Improves Memory Consumption