【发布时间】:2015-03-13 08:34:18
【问题描述】:
我有点困惑,谁能帮忙描述一下 JavaScript 引擎和 JavaScript 运行时环境之间的区别。 顺便说一句,Event Loop 是在 Engine 还是 Runtime 中实现的?
【问题讨论】:
标签: javascript
我有点困惑,谁能帮忙描述一下 JavaScript 引擎和 JavaScript 运行时环境之间的区别。 顺便说一句,Event Loop 是在 Engine 还是 Runtime 中实现的?
【问题讨论】:
标签: javascript
与 C 和其他编译语言不同,Javascript 在容器中运行 - 一个读取您的 js 代码并运行它们的程序。这个程序必须做两件事
第一部分称为引擎,第二部分称为运行时。
例如,Chrome 浏览器和 node.js 使用相同的引擎 - V8,但它们的运行时不同:在 Chrome 中你有window、DOM 对象等,而 node 给你require、缓冲区和进程.
【讨论】:
想象一个机器人正在播放音乐:
想象一个机器人正在灭火:
【讨论】:
让我们首先想象一下 JavaScript 的 Ahead-Of-Time 编译实现。
编译器 会将 JavaScript 代码翻译成例如您可以运行的原生 x86 机器代码。但是,JavaScript 中有些事情是在运行时发生的,因此无法静态编译。例如垃圾收集或反射。所以,为了让程序运行起来,运行时需要某种支持服务,比如垃圾收集器和反射系统。此外,JavaScript 有eval,这意味着(在我们假设的编译实现中)编译器本身或其他一些解释器需要在运行时可用。
我们将这些东西称为运行时支持服务。
程序需要可用的第二件事是Array、Function、Object 等对象和forEach 等函数。这些对象和函数的集合需要从一开始就可供程序使用,通常称为 Core Library 或 Base Library。对于像 JavaScript 这样的设计为嵌入的语言,根据上下文,还假定存在其他库。例如,对于嵌入在浏览器中的 JavaScript,我们期望 DOM 对象和函数以及全局 window 和 document 对象等存在。这些也可以被认为是核心库的一部分。
最后,让我们忘记我们假设的编译器,看看解释器(或 JIT 编译器或混合模式引擎或字节码 VM)。在这里,Interpreter(或 JIT,或其他)是拼图的第三部分。这是 实际上 执行 JavaScript 程序的东西。 (嗯,从技术上讲,JIT 不会执行,它会编译,然后执行其他操作。)
术语不是 100% 清楚:有时,只有运行时支持服务被称为 运行时环境,有时,核心库也包括在内。
执行引擎指的是解释器(JIT、VM、...)或解释器和运行时环境的组合。编译器从不称为执行引擎(它不执行任何操作,只是翻译成另一种语言),执行引擎一词很少用于指代静态编译的实现。
事件循环是宿主环境的一部分,而不是 JavaScript 实现。
【讨论】:
这是运行时环境列表
示例:Chrome、Firefox、Safari、Opera、Edge 等
示例:NodeJS、Deno
例如:电子等
示例:NativeScript、Ionic、PhoneGap、React Native 等
这是引擎列表
用于:用于 Chrome 浏览器、NodeJS 和基于 android 的手机
用于:用于火狐浏览器
用于:用于 Safari 浏览器和基于 iOS 的手机
用于:在 Microsoft Edge 浏览器中使用
【讨论】: