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