JavaScript 引擎,一个真实的故事(第 1 部分)
JavaScript 引擎,一个真实的故事(第 1 部分)
一个 任何使用过 JavaScript 的人都可能熟悉 V8 引擎。大多数人都知道 JavaScript 在单线程中运行并使用回调,这对于语言引擎背后的想法至关重要。另一个常见的误解是 JavaScript 是一种编译语言。
让我们在接下来的几篇文章中解决这意味着什么。
我们谈论的神秘“引擎”
好吧,如果我写一些这样的代码:
常量 iAmHappy = true;
真的只是我们编写的一些 JavaScript。目前,我正在设置布尔值 我很开心
到它的正确值。这究竟是什么意思,计算机如何解释它?想象一下:有人递给你一台电脑,让你用中文在屏幕上显示一张花的图片。
计算机会理解你在说什么吗?不。
你刚才说的在电脑上会完全丢失。同样,如果我给你一台带有 CPU 的计算机。包含 JavaScript 的文件。我告诉它,嘿,阅读这个文件并帮助我。归根结底,计算机只知道 1 和 0。当我们给它 JavaScript 文件时,就像我对着电脑说中文,电脑说,什么?你在说什么?
另外,当人们盯着你看,好像你疯了一样,用中文对着电脑说话。结果,机器不知道 JavaScript 是什么。那么,我们如何使用 JavaScript 文件进行通信,以便计算机显示花卉图像? JavaScript 引擎是我们学习过程的初始阶段。有了这里的 JavaScript 引擎,你可以给这台机器 JavaScript 文件,这台机器会理解它并指示计算机如何显示花的照片。
谷歌引擎——V8引擎
因此,每当我们使用引擎时,我们都可以将 JavaScript 文件传递给它。引擎理解这个 JavaScript 文件,允许它与机器、计算机通信,并指示它执行我们要求它使用 JavaScript 执行的操作。这些引擎现在由程序员创建。
例如,V8 引擎是用 C++ 编写的。但是为什么这些引擎会被创造出来呢?谈到 JavaScript,2008 年是历史上的分水岭,因为 Google 发布了 V8。以前,大多数浏览器都使用极其原始的引擎,这意味着 JavaScript 有点慢。谷歌,你看,有这个问题。他们有一个叫做谷歌地图的程序。
您可能知道,谷歌地图相当耗电。它支持多种功能。谷歌地图在浏览器中的速度非常慢,因为它具有询问方向、放大和缩小甚至可能使用街景等功能。而谷歌,作为一个搜索引擎,更希望每个人都使用他们的搜索引擎,这就是他们开发浏览器的原因:增加他们的市场份额。
所以他们使用谷歌地图和他们自己的 Chrome 浏览器并想,嗯。 V8 引擎将是我们自己创建的 JavaScript 引擎。因此,JavaScript 现在在浏览器中的执行速度比以前快得多。他们还在 2008 年发布了 V 8。但对我们来说,这里的主要收获是非常聪明的人在这些引擎上工作,以确保我们的 JavaScript 在浏览器、服务器或任何类型的计算机上尽可能快地执行。由于这些引擎的工作,JavaScript 对我们来说每天都变得越来越快。
但是,这台了解 JavaScript 的神奇机器内部究竟是什么?它读取我们的代码然后执行它。 😃
这是一个有趣的问题。你认为谁创造了第一个 JavaScript 引擎?
布伦丹·艾希 ,第一个 JavaScript 引擎的创建者,是第一个创建它的人。
在第一个商用浏览器 Netscape 工作时,这个人发明了后来被称为 蜘蛛猴 ,Firefox 至今仍将其用作其 JavaScript 引擎。 Brendan Eich 是第一个发明了 JavaScript 语言来实现这个引擎的人,允许你在以前只能读取 HTML 和 CSS 的浏览器上执行 JavaScript。
所以我们知道 JavaScript 引擎接受我们编写的 JavaScript 代码并执行一些魔法来指示机器执行我们想要的操作。那么,这个引擎内部发生了什么?现在是困难的部分。
众所周知,任何人都可以构建这个引擎。是的,您可以创建自己的 JavaScript 引擎,但工作量很大。而且,归根结底,它只是一个计算机程序。还有 V8 引擎,它是 Chrome 浏览器和 Node.js 使用的最流行、最常见的 JavaScript 引擎,在某些方面是最快的 JavaScript 引擎,我们将在后面讨论。 C++ 是一种低级编程语言,用于创建此引擎。但首先,让我们看看里面发生了什么。
我们为它提供了一个 JavaScript 文件。
最初,词法分析也是如此,它将代码拆分为标记以识别它们的含义,以便我们知道代码试图实现的目标。这些标记组合起来产生一个 AST,它代表抽象语法树。
所以我们对代码进行解析,也就是我们试图弄清楚文本是如何根据 JavaScript 关键字进行划分的,它形成了这种树状结构,称为抽象语法树。
这是一个不错的小网络工具,您可以使用它来演示这一点。它描绘了这个外观 抽象语法树 .
而且,虽然现在这在您看来可能是胡言乱语,但它可以帮助引擎了解程序中正在发生的事情,或者至少可以将事情一一分解。一旦这个表格完成,它就会通过一个被称为解释的过程。我们使用 Profiler 编译器生成一些代码,我们将在后面讨论。整个引擎会喷出一些代码,我们计算机上的 CPU 会理解这些代码,以便给它指令。
每个人都用 JavaScript 设计自己的引擎时,你看到了什么问题?
我们可以制造自己的引擎然后,砰,就在那里?我们已经有了 JavaScript 引擎。是的,你当然可以这样做。
但请记住,我们在这里的列表被标记为 ECMAScript 引擎,而不是 JavaScript 引擎。因为如果每个人都可以设计一个 JavaScript 引擎,那将是彻底的混乱,这就是 ECMAScript 形成的原因。它告诉人们,“嘿,这是如何在 JavaScript 中做事以及它应该如何运行的标准。”
脚本是 JavaScript 的管理机构,它有效地选择了语言应该如何标准化。因此,它告诉引擎创建者这就是 JavaScript 应该如何运行,但您如何在内部创建引擎取决于您,只要它符合标准即可。
并且,回到我们的示例,作为引擎设计师,只要它符合我的脚本规则,我就可以在这个盒子内对这个引擎做任何我想做的事情。结果,企业和组织竞相拥有最快的引擎,以便人们使用他们的产品。例如,谷歌热衷于拥有尽可能快的引擎,以便更多人使用他们的 Chrome 浏览器和搜索引擎,从而让他们能够销售更多广告并产生更多现金。
但是,请记住,这可以以我们选择的任何方式实现,并且它总是在变化,以便找到让 JavaScript 在我们的浏览器中甚至在我们的浏览器之外工作的最快方式。我们将讨论 V8 引擎,因为它是最常见的。您可能会在此看到各种变体。但是,我们将在此处介绍的内容适用于绝大多数 JavaScript 引擎。而且,虽然事情可能会随着时间的推移而发生变化,但只要您掌握基本原理以及它为何如此构造,我们就能够生成最佳代码。
但是,在我们到达那里之前,让我们在这里完成这篇文章,让我们在下一篇文章中定义什么是解释器和编译器。
我将通过在此处添加下一部分链接来更新本文,所以请留在我身边:)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明