亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

「譯」JavaScript 究竟是如何工作的?(第一部分)

Youngdze / 2490人閱讀

摘要:文章的第二部分涵蓋了內(nèi)存管理的概念,不久后將發(fā)布。的標(biāo)準(zhǔn)化工作是由國際組織負(fù)責(zé)的,相關(guān)規(guī)范被稱為或者。隨著分析器和編譯器不斷地更改字節(jié)碼,的執(zhí)行性能逐漸提高。

原文地址:How Does JavaScript Really Work? (Part 1)

原文作者:Priyesh Patel

譯者:Chor

如果你是一個(gè) JS 開發(fā)者或者是正在學(xué)習(xí)這門語言的學(xué)生,很大概率上你會(huì)遇到雙字母詞"V8"。在這篇文章中,我將會(huì)為你簡述不同的 JS 引擎并深入探究 V8 引擎的工作機(jī)制。文章的第二部分涵蓋了內(nèi)存管理的概念,不久后將發(fā)布。

這篇文章是由 Bit (GitHub) 帶來的。作為一個(gè)共享組件的平臺(tái),Bit 幫助每個(gè)人構(gòu)建模塊化的 JavaScript 應(yīng)用程序,在項(xiàng)目和團(tuán)隊(duì)之間輕松地共享組件,同時(shí)實(shí)現(xiàn)更好&更快的構(gòu)建。試試看。

編程語言是如何工作的?

在開始講解 JavaScript 之前,我們首先要理解任意一門編程語言的基本工作方式。電腦是由微處理器構(gòu)成的,我們通過書寫代碼來命令這臺(tái)小巧但功能強(qiáng)大的機(jī)器。但是微處理器能理解什么語言?它們無法理解 Java,Python 等語言,而只懂機(jī)器碼。
用機(jī)器語言或匯編語言編寫企業(yè)級(jí)代碼是不可行的,因此我們需要像 Java,Python 這樣配帶一個(gè)解釋器或者編譯器用于將其轉(zhuǎn)換為機(jī)器碼的高級(jí)語言。

編譯器和解釋器

編譯器/解釋器可以用它處理的語言或任何其他語言來編寫。

解釋器: 一行一行地快速讀取和翻譯文件。這就是 JavaScript 最初的工作原理。

編譯器: 編譯器提前運(yùn)行并創(chuàng)建一個(gè)文件,其中包含了輸入文件的機(jī)器碼轉(zhuǎn)換。

有兩種途徑可以將 JavaScript 代碼轉(zhuǎn)換為機(jī)器碼。編譯代碼時(shí),機(jī)器對(duì)代碼開始運(yùn)行前將要發(fā)生的事情有更好的理解,這將加快稍后的執(zhí)行速度。不過,在這個(gè)過程之前需要花費(fèi)時(shí)間。

另一方面,解釋代碼時(shí),執(zhí)行是立即的,因此要更快,但是缺乏優(yōu)化導(dǎo)致它在大型應(yīng)用程序下運(yùn)行緩慢。

創(chuàng)建 ECMAScript 引擎的人很聰明,他們集二者之長開發(fā)了 JIT(Just-in-time) 編譯器。JavaScript 同時(shí)被編譯和解釋,但實(shí)際實(shí)現(xiàn)和順序取決于引擎。我們將會(huì)看到 V8 團(tuán)隊(duì)采用的是什么策略。

從 JavaScript 到機(jī)器碼

就 JavaScript 而言,有一個(gè)引擎將其轉(zhuǎn)換為機(jī)器碼。和其他語言類似,引擎可以用任何語言來開發(fā),因此這樣的引擎不止一個(gè)。

V8 是谷歌針對(duì) Chorme 瀏覽器的引擎實(shí)現(xiàn)。

SpiderMonkey 是第一個(gè)引擎,針對(duì)網(wǎng)景瀏覽器開發(fā),現(xiàn)用于驅(qū)動(dòng) FireFox。

JavaScriptCore 是蘋果針對(duì) Safari 瀏覽器使用的引擎。

還有很多,如果你想知道 Internet Explorer 背后的引擎,查看這個(gè)維基百科頁面.

ECMAScript

面對(duì)這么多的引擎,你可能會(huì)問:我可以開發(fā)自己的引擎嗎?可以,只要遵循 ECMAScript 標(biāo)準(zhǔn)。

如果我們打算做一個(gè)翻譯器,那么就必須知道這兩門語言的有效字。我們已經(jīng)知道機(jī)器語言中什么是有效的了,但是對(duì)于 JavaScript,這是需要進(jìn)行標(biāo)準(zhǔn)化的。

JavaScript 的標(biāo)準(zhǔn)化工作是由 Ecma 國際組織負(fù)責(zé)的,相關(guān)規(guī)范被稱為 ECMAScript 或者 ES。因此,當(dāng)你看到一篇文章/視頻提到“ES7 有什么新特性?”時(shí),你就知道它代表的是 ECMAScript 標(biāo)準(zhǔn)中新增的 JS 特性。

V8?引擎 部分歷史

谷歌針對(duì)瀏覽器開發(fā)了谷歌地圖,而這對(duì)瀏覽器的處理能力提出了很高的要求。那時(shí)的 JavaScript 實(shí)現(xiàn)尚不足以快速地運(yùn)行地圖。谷歌想要吸引更多的用戶使用這項(xiàng)服務(wù),從而進(jìn)行廣告銷售并牟利?;谶@個(gè)原因,這項(xiàng)服務(wù)必須快速且穩(wěn)定。因此谷歌自己用 C++ 開發(fā)了 V8 引擎并在 2008 年啟用,它的速度很快,或者就像一些人說的,它的速度是最快的。

解析和構(gòu)建樹

JavaScript 文件進(jìn)入引擎后,解析器進(jìn)行詞法解析,它將代碼分解成 token 以確定它們的含義。這些 token 組成了AST(抽象語法樹)。

編譯器在語義分析中驗(yàn)證語言元素和關(guān)鍵詞的正確用法,而 ASTs 在這個(gè)過程中扮演著重要的角色。之后,ASTs 被用于生成實(shí)際的字節(jié)碼或者機(jī)器碼。

引擎的核心

我們之前談到,JavaScript 是由 Ignition 這個(gè)解釋器解釋的,同時(shí)由 TurboFan 這個(gè) JIT 優(yōu)化編譯器進(jìn)行編譯。

首先,前面步驟生成的 ASTs 傳遞給解釋器,該解釋器迅速生成未經(jīng)過優(yōu)化的機(jī)器碼,并且其執(zhí)行是無延遲的。

Profiler 在代碼運(yùn)行時(shí)進(jìn)行觀察,找出可以進(jìn)行優(yōu)化的地方。例如,一個(gè)‘for’循環(huán)跑了 100 次,但是每次迭代產(chǎn)生的結(jié)果都是一樣的。

使用這個(gè)分析器后,任何未優(yōu)化的代碼都將傳遞給編譯器以進(jìn)行優(yōu)化,同時(shí)生成機(jī)器碼,它最終會(huì)替換掉之前由解釋器生成的未優(yōu)化代碼中的對(duì)應(yīng)部分。

隨著分析器和編譯器不斷地更改字節(jié)碼,JavaScript 的執(zhí)行性能逐漸提高。

更多歷史

在V8 的 5.9 版本推出之前,它使用兩個(gè)優(yōu)化編譯器和一個(gè)基線編譯器。

基線編譯器 full-codegen 迅速生成未優(yōu)化的機(jī)器碼。

兩個(gè)優(yōu)化編譯器 Crankshaft 和 TurboFan 用于優(yōu)化代碼。

JavaScript 增加了新的特性后,架構(gòu)的復(fù)雜度上升,維護(hù)相同的管道對(duì) V8 團(tuán)隊(duì)來說變得更加困難了。如果你想閱讀更多相關(guān)的舊方法以及轉(zhuǎn)向新管道的原因,可以訪問他們的網(wǎng)站。

放眼未來

隨著更多進(jìn)一步提升性能的研究的進(jìn)行,V8 引擎的工作機(jī)制在未來還可能發(fā)生變化。此外,隨著 Webassembly 逐漸成形,可能會(huì)向管道添加額外步驟。

結(jié)論

ECMAScript 引擎的實(shí)現(xiàn)有很多,其中以谷歌的 V8 最為出名。希望這篇文章的簡述不僅可以幫助你理解 JavaScript 的工作原理,還能從大體上了解一門編程語言的工作原理。如果你想了解 V8 團(tuán)隊(duì)的未來計(jì)劃或者引擎的細(xì)節(jié),這里有一篇很不錯(cuò)的博客。

本文的第二部分將會(huì)在不久后發(fā)布,其中將談到內(nèi)存堆,棧,事件循環(huán)以及更多與 JavaScript 代碼執(zhí)行相關(guān)的概念。敬請(qǐng)關(guān)注!

如果你不清楚 Node.js 在其中的作用,我這里碰巧寫了一篇不錯(cuò)的文章:
What exactly is Node.js?)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/109399.html

相關(guān)文章

  • JavaScript 竟是如何工作?(第二部

    摘要:內(nèi)存泄漏指的是,程序之前需要用到部分內(nèi)存,而這部分內(nèi)存在用完之后并沒有返回到內(nèi)存池?;臼录f歸調(diào)用為什么是單線程的一個(gè)線程代表著在同一時(shí)間段內(nèi)可以單獨(dú)執(zhí)行的程序部分的數(shù)目。 原文地址:How Does JavaScript Really Work? (Part 2) 原文作者:Priyesh Patel showImg(https://segmentfault.com/img...

    Youngs 評(píng)論0 收藏0
  • 基本方法筆記 - 收藏集 - 掘金

    摘要:探討判斷橫豎屏的最佳實(shí)現(xiàn)前端掘金在移動(dòng)端,判斷橫豎屏的場景并不少見,比如根據(jù)橫豎屏以不同的樣式來適配,抑或是提醒用戶切換為豎屏以保持良好的用戶體驗(yàn)。 探討判斷橫豎屏的最佳實(shí)現(xiàn) - 前端 - 掘金在移動(dòng)端,判斷橫豎屏的場景并不少見,比如根據(jù)橫豎屏以不同的樣式來適配,抑或是提醒用戶切換為豎屏以保持良好的用戶體驗(yàn)。 判斷橫豎屏的實(shí)現(xiàn)方法多種多樣,本文就此來探討下目前有哪些實(shí)現(xiàn)方法以及其中的優(yōu)...

    maochunguang 評(píng)論0 收藏0
  • []開始對(duì)Angular App進(jìn)行單元測試(1)

    摘要:小結(jié)我們初步了解了使用來進(jìn)行測試,這樣有利于我們接下來去理解使用進(jìn)行單元測試翻譯中 showImg(https://segmentfault.com/img/bVxI9p); 這是一些列文章,陸續(xù)翻譯整理中... 原文地址:http://www.bradoncode.com/blog/2015/05/12/angularjs-testing-getting-started/ @ Bra...

    Tikitoo 評(píng)論0 收藏0
  • 2017-07-19 前端日?qǐng)?bào)

    摘要:前端日?qǐng)?bào)精選開發(fā)常見問題集錦前端碼農(nóng)的自我修養(yǎng)虛擬內(nèi)部是如何工作的譯知乎專欄并不慢,只是你使用姿勢不對(duì)一份優(yōu)化指南掘金老司機(jī)帶你秒懂內(nèi)存管理第一部中文免費(fèi)公開課前端面試的大關(guān)鍵點(diǎn),你到了嗎知乎專欄高效開發(fā)與設(shè)計(jì)姐的圖片二三 2017-07-19 前端日?qǐng)?bào) 精選 VueJS 開發(fā)常見問題集錦 - 前端碼農(nóng)的自我修養(yǎng) - SegmentFault虛擬 DOM 內(nèi)部是如何工作的?[譯]Hig...

    iflove 評(píng)論0 收藏0
  • JavaScript執(zhí)行上下文和堆棧是什么?

    摘要:每次調(diào)用函數(shù)時(shí),都會(huì)創(chuàng)建一個(gè)新的執(zhí)行上下文。理解執(zhí)行上下文和堆??梢宰屇私獯a為什么要計(jì)算您最初沒有預(yù)料到的不同值的原因。 首發(fā):https://www.love85g.com/?p=1723 在這篇文章中,我將深入研究JavaScript最基本的部分之一,即執(zhí)行上下文。在這篇文章的最后,您應(yīng)該更清楚地了解解釋器要做什么,為什么在聲明一些函數(shù)/變量之前可以使用它們,以及它們的值是如何...

    miguel.jiang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<