摘要:引擎是能運(yùn)行代碼的程序或解釋器。代碼的運(yùn)行明顯的分成兩個階段,也就是編譯階段和運(yùn)行字節(jié)碼階段。它首先由編譯器編譯成字節(jié)碼文件,然后再通過虛擬機(jī)從文件中讀一行解釋執(zhí)行一行。
Javascript引擎是能運(yùn)行javascript代碼的程序或解釋器。做為前端開發(fā)人員,了解javascript底層的工作原理,可以用助于寫出高效的javascript代碼。那我們就來看一下,我們寫的代碼是如何在javascript引擎中運(yùn)行的。
javascript引擎如何解釋執(zhí)行javascript代碼大家都知道javascript屬于解釋型語言,所謂解釋型語言就是引擎直接讀取源碼,然后出結(jié)果,這樣做效率非常低。相對的大家都知道C++代碼執(zhí)行很快,因?yàn)镃++屬于編譯型語言,所謂編譯型語言就是把源代碼編譯成可執(zhí)行程序后才可以運(yùn)行,C++就是把源代碼編譯成本地代碼后執(zhí)行的。編譯的過程沒有時間要求,所以在編譯的過程中可以做更多的優(yōu)化,生成執(zhí)行更快的代碼。
下面我們先來看一下早期JavaScript引擎的執(zhí)行過程:
再看一下C++語言的編譯過程:
開發(fā)人員開發(fā)完源代碼后,使用編譯器將源代碼編譯成本地代碼(機(jī)器碼/匯編代碼), 用戶只是使用編譯后的本地代碼,這些本地代碼被系統(tǒng)加載器加載后,由操作系統(tǒng)調(diào)度CPU直接執(zhí)行。因?yàn)榻?jīng)過編譯器源代碼被編譯成了本地代碼,可以由操作系統(tǒng)直接執(zhí)行,所以它的執(zhí)行速度飛快。
我們再來看一下另一個老牌語言——Java的運(yùn)行過程。Java代碼的運(yùn)行明顯的分成兩個階段,也就是編譯階段和運(yùn)行字節(jié)碼階段。它首先由編譯器編譯成.class(字節(jié)碼)文件,然后再通過JVM(Java虛擬機(jī))從.class文件中讀一行解釋執(zhí)行一行。也正是由于不同的操作系統(tǒng)有不同的JVM,所以實(shí)現(xiàn)了真正意義上的跨平臺。
在這里在給大家介紹一下字節(jié)碼和本地代碼的區(qū)別:
字節(jié)碼是跨平臺的一種中間表示,該字節(jié)碼與平臺無關(guān),需要借助虛擬機(jī)解釋執(zhí)行
本地代碼與操作系統(tǒng)有關(guān),不同的操作系統(tǒng)編譯成的本地代碼不同
既然Java的執(zhí)行過程是使用解釋器執(zhí)行字節(jié)碼,這樣肯定比C++直接執(zhí)行本地代碼速度上要慢,為了解決執(zhí)行的性能問題,Java引入了一個特別NB技術(shù) —— JIT(Just-In-Time)。這個為啥NB呢,因?yàn)樗闹饕饔镁褪墙鉀Q解釋性語言的性能問題。哈哈^^! 這個技術(shù)的主要思想是當(dāng)解釋器解釋代碼時,不僅僅解釋字節(jié)碼,而且將其中一些字節(jié)碼(主要是使用率高的部分)轉(zhuǎn)成本地代碼,這樣就可以被CPU直接執(zhí)行,從而極大地提高性能。這個技術(shù)被廣泛地使用在各種語言的執(zhí)行環(huán)境中,如Java虛擬機(jī),JavaScript的眾多引擎中。
隨著JavaScript越來越受歡迎,JavaScript引擎也在不斷的向前輩學(xué)習(xí),努力提高Javascript執(zhí)行速度。我們來看一下現(xiàn)在的JavaScript引擎的執(zhí)行過程:
在現(xiàn)在JavaScript引擎中,大致的執(zhí)行過程是:
編譯器將源代碼編譯成抽象語法樹,再將抽象語法樹編譯成字節(jié)碼;解釋器來接收字節(jié)碼,解釋執(zhí)行這些字節(jié)碼;JIT工具,分析這些字節(jié)碼并將其中的部分字節(jié)碼轉(zhuǎn)換成本地代碼。
這個過程和Java的編譯和執(zhí)行過程很像,只是Java語言中這兩個階段是分開執(zhí)行的,編譯階段可以盡可能的生成高效的字節(jié)碼,這樣在執(zhí)行階段可以執(zhí)行的更快。而對于Javascript而言,它的編譯階段是在網(wǎng)頁和JavaScript文件下載后同執(zhí)行階段一起在網(wǎng)頁的加載和渲染過程中來實(shí)施的,所以對于JavaScript引擎執(zhí)行過程中的每個階段時間越少越好。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/94049.html
摘要:前端面試題及答案總結(jié)掘金技術(shù)征文金三銀四,金九銀十,用來形容求職最好的幾個月。因?yàn)榈拇嬖冢辽僭诒粯?biāo)準(zhǔn)化的那一刻起,就支持異步編程了。然而異步編程真正發(fā)展壯大,的流行功不可沒。 showImg(https://segmentfault.com/img/bVVQOH?w=640&h=319); 1、2017前端面試題及答案總結(jié) |掘金技術(shù)征文 金三銀四,金九銀十,用來形容求職最好的幾個月...
摘要:學(xué)編程真的不是一件容易的事不管你多喜歡或是多會編程,在學(xué)習(xí)和解決問題上總會碰到障礙。熟練掌握核心內(nèi)容,特別是和多線程初步具備面向?qū)ο笤O(shè)計(jì)和編程的能力掌握基本的優(yōu)化策略。 學(xué)Java編程真的不是一件容易的事,不管你多喜歡或是多會Java編程,在學(xué)習(xí)和解決問題上總會碰到障礙。工作的時間越久就越能明白這個道理。不過這倒是一個讓人進(jìn)步的機(jī)會,因?yàn)槟阋恢辈粩嗟膶W(xué)習(xí)才能很好的解決你面前的難題...
摘要:與大多數(shù)全局對象不同,沒有構(gòu)造函數(shù)。為什么要設(shè)計(jì)更加有用的返回值早期寫法寫法函數(shù)式操作早期寫法寫法可變參數(shù)形式的構(gòu)造函數(shù)一般寫法寫法當(dāng)然還有很多,大家可以自行到上查看什么是代理設(shè)計(jì)模式代理模式,為其他對象提供一種代理以控制對這個對象的訪問。 這是專門探索 JavaScript 及其所構(gòu)建的組件的系列文章的第 19 篇。 如果你錯過了前面的章節(jié),可以在這里找到它們: 想閱讀更多優(yōu)質(zhì)文章請...
摘要:本章會對語言引擎,運(yùn)行時,調(diào)用棧做一個概述。調(diào)用棧只是一個單線程的編程語言,這意味著它只有一個調(diào)用棧。查看如下代碼當(dāng)引擎開始執(zhí)行這段代碼的時候,調(diào)用棧會被清空。之后,產(chǎn)生如下步驟調(diào)用棧中的每個入口被稱為堆棧結(jié)構(gòu)。 原文請查閱這里,本文采用知識共享署名 4.0 國際許可協(xié)議共享,BY Troland。 本系列持續(xù)更新中,Github 地址請查閱這里。 這是 JavaScript 工作原...
摘要:本章會對語言引擎,運(yùn)行時,調(diào)用棧做一個概述。調(diào)用棧只是一個單線程的編程語言,這意味著它只有一個調(diào)用棧。查看如下代碼當(dāng)引擎開始執(zhí)行這段代碼的時候,調(diào)用棧會被清空。之后,產(chǎn)生如下步驟調(diào)用棧中的每個入口被稱為堆棧結(jié)構(gòu)。 原文請查閱這里,本文采用知識共享署名 4.0 國際許可協(xié)議共享,BY Troland。 本系列持續(xù)更新中,Github 地址請查閱這里。 這是 JavaScript 工作原...
閱讀 2134·2021-11-18 10:02
閱讀 2886·2021-09-04 16:41
閱讀 1177·2019-08-30 15:55
閱讀 1443·2019-08-29 17:27
閱讀 1160·2019-08-29 17:12
閱讀 2563·2019-08-29 15:38
閱讀 2886·2019-08-29 13:02
閱讀 2859·2019-08-29 12:29