原文连接:JavaScript: Under the Hoodjavascript
最初,JavaScript 只能在 Web 浏览器中运行,可是随着 Node 的出现,如今 JavaScript 也能够在服务端运行。虽然咱们可能知道应该在什么时候何地去使用它, 可是咱们真的了解这些脚本执行的背后发生了什么吗?java
若是您以为本身对 JavaScript 引擎有了一些了解的话,能够先给本身鼓个掌,但不要急着关掉本文,我相信阅读完成后您仍然能够从中学到一些东西。编程
JavaScript 是一门高级语言,可是最终计算机能理解只有1和0。 那么咱们编写的代码是如何被计算机理解的呢? 掌握所学编程语言的基础知识将让您能编写出更好的代码。 在本文中,咱们仅探讨一个问题:JavaScript 是如何工做的?浏览器
下面让咱们进入正题~bash
这是本文将要探索的主要内容,它负责使计算机理解咱们编写的 JS 代码。JavaScript 引擎是一种用于将咱们的代码转换为机器可读语言的引擎。若是没有 JavaScript 引擎,您编写的代码对计算机来讲简直是一堆“胡言乱语”。不只仅是 JavaScript ,其余全部编程语言都须要一个相似的引擎,来将这些“胡言乱语”转换成对计算机有意义的语言。babel
目前有多种 JavaScript 引擎在可供使用。您能够在 Wikipedia 上查阅全部可用的 JavaScript 引擎。它们也被称为 ECMAScript 引擎,这样叫的具体缘由会在下文中说起。 下面是一些咱们平常可能会用到的 JavaScript 引擎:markdown
除此以外的其它引擎,能够自行搜索了解。接下来,咱们将深刻研究这些引擎,以了解它们是如何翻译 JavaScript 文件的。编程语言
咱们已经知道了引擎是必须的,由此可能不由会想:ide
是谁发明了 JavaScript 引擎?函数
答案是,任何人均可以。它只是分析咱们的代码并将其翻译的另外一种语言的工具。V8 是最受欢迎的 JavaScript 引擎之一,也是 Chrome 和 NodeJS 使用的引擎。它是用 C++(一种底层语言)编写的。可是若是每一个人都创造一个引擎,那场面就不是可控范围内的了。
所以,为了给这些引擎确立一个规范,ECMA 的标准诞生了,该标准主要提供如何编写引擎和 JavaScript 全部功能的规范。这就是新功能能在 ECMAScript 六、七、8 上实现的缘由。同时,引擎也进行了更新以支持这些新功能。 因而,咱们即可以在开发过程当中检查了浏览器中 JS 高级功能的可用性。
下面咱们对 V8 引擎进行进一步的探索,由于基本概念在全部引擎中是一致的。
上图就是 JS Engine 内部的工做流程。咱们输入的代码将经过如下阶段,
别被上面的流程给唬住了,在几分钟后您将了解它们是协同运做的。
在进一步深刻这些阶段以前,您须要先了解 Interpreter 和 Compiler 的区别。
一般,将代码转换成机器可读语言的方法有两种。 咱们将要讨论的概念不只适用于 JavaScript ,并且适用于大多数编程语言,例如 Python,Java 等。
让咱们来看下面这个例子。
function add(a, b) { return a+b } for(let i = 0; i < 1000; i++) { add(1 + 1) } 复制代码
上面的示例循环调用了 add
函数1000次,该函数将两个数字相加并返回总和。
从上图中能够看出,ByteCode 只是中间码,计算机仍须要对其进行翻译才能执行。 可是 Interpreter 和 Compiler 都将源代码转换为机器语言,它们惟一的区别在于转换的过程不尽相同。
若是你想了解更多它们以前的区别,推荐阅读这篇文章。
当您阅读完上面的推荐文章后,您可能已经了解到 Babel 其实是一个 JS Compiler ,它能够接收您编写的新版本 JS 代码并向下编译为与浏览器兼容的 JS 代码(旧版本的 JS 代码)。
综上所述,Interpreter 能够当即开始执行代码,但不会进行优化。 Compiler 虽然须要花费一些时间来编译代码,可是会生成对执行时更优的代码。
好的,Interpreter 和 Compiler 必要知识咱们已经了解了。如今让咱们回到主题——JS 引擎。
所以,考虑到编译器和解释器的优缺点,若是咱们同时利用二者的优势,该怎么办? 这就是 JIT(Just In Time) Compiler 的用武之地。它是 Interpreter 和 Compiler 的结合,如今大多数浏览器都在更快,更高效地实现此功能。同时 V8 引擎也使用此功能。
在这个过程当中,
这仅意味着性能将在逐渐提升,同时不会有阻塞执行的时间。
做为机器代码,ByteCode 不能被全部计算机理解及执行。它仍然须要像虚拟机或像 Javascript V8 引擎这样的中间件才能将其转换为机器可读的语言。 这就是为何咱们的浏览器能够在上述5个阶段中借助 JavaScript 引擎在 Interpreter 中执行 ByteCode 的缘由。
因此您能够会有另外一个问题,
JavaScript 是但不彻底是一门解释型语言。Brendan Eich 最初是在 JavaScript 的早期阶段建立 JavaScript 引擎 “ SpiderMonkey” 的。该引擎有一个 Interpreter 来告诉浏览器该怎么执行代码。 可是如今咱们的引擎不只包括了 Interpreter,还有 Compiler。 咱们的代码不只能够被转换成 ByteCode,还能够被编译输出优化后的代码。 所以,从技术上讲,这彻底取决于引擎是如何实现的。
JavaScript 引擎的总体工做原理就是这样。相信您无需学习 JavaScript 也能够理解。 固然,您甚至能够在不知道 JavaScript 如何工做的状况下编写代码。 可是,若是咱们了解一些幕后的知识,或许能让咱们编写出更好的代码。
欢迎转载,记得注明做者和来源哦~~