JavaScript 引擎和 JavaScript 运行时环境有什么区别
What is the difference between JavaScript Engine and JavaScript Runtime Environment
我感到有点困惑,有人可以帮助描述JavaScript引擎和JavaScript运行时环境有什么区别吗?顺便说一句,事件循环是在引擎还是运行时中实现的?
与C和其他编译语言不同,Javascript在容器中运行 - 一个读取js代码并运行它们的程序。这个程序必须做两件事
- 解析代码并将其转换为可运行的命令
- 为 JavaScript 提供一些对象,以便它可以与外部世界进行交互。
第一部分称为引擎,第二部分称为运行时。
例如,Chrome浏览器和node.js使用相同的引擎 - V8,但它们的运行时不同:在Chrome中,你有window
,DOM对象等,而node给你require
,缓冲区和进程。
想象一个机器人正在播放音乐:
- JavaScript代码将是机器人的音符。
- JavaScript引擎将是可以理解笔记并对其采取行动的机器人。
- JavaScript运行时将是机器人可以用来播放音乐的乐器。
想象一下,一个机器人正在灭火:
- JavaScript代码将是机器人灭火的指令。
- JavaScript引擎将是能够理解指令并对其采取行动的机器人。
- JavaScript运行时将是消防车和水枪。
让我们首先想象一个 JavaScript 的提前编译实现。
编译器会将 JavaScript 代码转换为可以运行的本机 x86 机器代码。但是,JavaScript 中有一些事情发生在运行时,因此无法静态编译。例如,垃圾回收或反射。因此,为了使程序运行,运行时需要某种支持服务,例如垃圾收集器和反射系统。此外,JavaScript 具有eval
,这意味着(在我们假设的编译实现中)编译器本身或其他一些解释器需要在运行时可用。
我们称这些东西为运行时支持服务。
程序需要可用的第二件事是诸如Array
,Function
,Object
等对象以及诸如forEach
之类的函数。这个需要从一开始就可供程序使用的对象和函数集合通常称为核心库或基本库。对于像JavaScript这样被设计为嵌入式的语言,根据上下文,还假定存在其他库。例如,对于嵌入在浏览器中的 JavaScript,我们希望 DOM 对象和函数以及全局window
和document
对象等存在。这些也可以被视为核心库的一部分。
最后,现在让我们忘记我们假设的编译器,看看解释器(或 JIT 编译器或混合模式引擎或字节码 VM)。在这里,解释器(或JIT,或其他什么)是拼图的第三块。它是实际执行JavaScript程序的东西。(嗯,从技术上讲,JIT 不执行,它会编译,然后执行其他内容。
术语不是 100% 清楚的:有时,只有运行时支持服务被称为运行时环境,有时,核心库也包括在内。
执行引擎仅指解释器(JIT、VM、...)或解释器和运行时环境的组合。编译器从不被称为执行引擎(它不执行任何内容,只是翻译成另一种语言),术语执行引擎很少用于指代静态编译的实现。
事件循环是主机环境的一部分,而不是 JavaScript 实现的一部分。
Javascript Runtime Environment
<小时 />- 提供各种功能/API来构建基于Javascript的软件。
- 它还包括一个JS引擎(解释器+ JIT编译器(用于优化目的))。
以下是运行时环境列表
- 浏览器:提供DOMAPI,Fetch API,Timer(setTimeout和setInterval),存储(如本地存储)等。
示例:Chrome,Firefox,Safari,Opera,Edge等
- 服务器环境:提供文件系统访问、网络访问、控制台等。
示例:NodeJS,Deno
- 桌面环境:提供GUI API、文件系统访问、网络访问、控制台等。
示例:电子等
- 移动环境:
示例:NativeScript,Ionic,PhoneGap,React Native等
注意:事件循环在运行时环境中实现
<小时 /> <小时 />Javascript引擎(解释器/JIT编译器(用于优化目的))
<小时 />- 将您的Javascript代码转换为机器语言/代码,以便您的计算机(CPU)将:)执行它
这是引擎列表
- Chrome V8 : 来自谷歌
用于:用于Chrome浏览器,NodeJS和基于Android的手机
- 蜘蛛猴:来自Mozilla
用于:用于火狐浏览器
- Nitro/JavascriptCore : 来自苹果
用于:用于Safari浏览器和基于iOS的手机
- Chakra & CharkraCore : From Microsoft
用于<小时 /> <小时 />:用于Microsoft Edge 浏览器
更多信息的绝佳链接
- 同时使用回退和 JavaScript.什么是正确的方法
- 简单的Javascript什么都不做,控制台中没有错误
- Javascript:什么是工厂
- JavaScript什么时候初始化变量
- JavaScript:什么是 NaN、Object 或 Primitive
- Javascript 什么是在三元表达式中确保值“true”的最佳方法
- Javascript 什么是参数中的“索引”
- Javascript什么时候打破MVC模式
- Javascript什么是“'+aStringVarible+'"(双引号加单引号)做
- Javascript:什么等于未定义?为什么不't myVar==未定义的工作
- Javascript什么都不做
- Javascript:什么是多级原型层次结构,为什么我们应该避免它
- Javascript:什么's冒号操作符变量名
- JavaScript:什么会崩溃,什么会崩溃
- Javascript:什么查找更快:数组.indexOf vs对象哈希值
- Rails特定于页面的JavaScript:什么是最佳实践?
- Javascript:什么是函数属性,它的意义是什么?
- Javascript什么都不做
- JAVASCRIPT:什么是";这个";关键字在下面的原型模式(Phaser框架)中引用
- JavaScript:什么是“;空隙0”;意思是