我感到有点困惑,有人可以帮忙描述JavaScript Engine和JavaScript Runtime Environment之间的区别。 BTW,Event Loop是在Engine还是Runtime中实现的?
答案 0 :(得分:111)
与C和其他编译语言不同,Javascript在一个容器中运行 - 一个读取你的js代码并运行它们的程序。这个程序必须做两件事
第一部分称为Engine,第二部分是Runtime。
例如,Chrome浏览器和node.js使用相同的引擎 - V8,但它们的运行时不同:在Chrome中,您有window
,DOM对象等,而节点为您提供require
,缓冲区和进程。
答案 1 :(得分:23)
想象一下机器人正在播放音乐:
想象一下机器人扑灭火灾:
答案 2 :(得分:20)
让我们首先想象一下JavaScript的Ahead-Of-Time编译实现。
编译器会将JavaScript代码转换为您可以运行的本机x86机器代码。但是,JavaScript中有一些东西在运行时发生,因此无法静态编译。例如,垃圾收集或反射。因此,为了使程序运行,需要在运行时提供某种支持服务,例如垃圾收集器和反射系统。此外,JavaScript有eval
,这意味着(在我们假设的编译实现中)编译器本身或其他一些解释器需要在运行时可用。
让我们将这些内容称为运行时支持服务。
需要为该程序提供的第二件事是Array
,Function
,Object
等对象以及forEach
等功能。这个需要从一开始就可供程序使用的对象和函数集合通常称为核心库或基础库。对于像JavaScript这样的嵌入式语言,根据上下文,还有其他假定存在的库。例如,对于浏览器中嵌入的JavaScript,我们期望DOM对象和函数以及全局window
和document
对象等存在。这些也可以被视为核心库的一部分。
最后,让我们忘记我们的假设编译器并查看解释器(或JIT编译器或混合模式引擎或字节码VM)。在这里, Interpreter (或JIT,或其他)是拼图的第三部分。这是实际执行JavaScript程序的事情。 (从技术上讲,JIT不执行,编译,然后执行其他操作。)
术语不是100%明确:有时,只有运行时支持服务被称为运行时环境,有时,核心库也包含在内。
执行引擎仅指解释器(JIT,VM,...)或解释器和运行时环境的组合。编译器永远不会被称为执行引擎(它不执行任何操作,只是翻译成另一种语言),术语执行引擎很少用于引用静态编译的实现。
事件循环是主机环境的一部分,而不是JavaScript实现。
答案 3 :(得分:8)
这是运行时环境的列表
示例:Chrome,Firefox,Safari,Opera,Edge 等
示例:NodeJS,Deno
示例:电子等
示例:NativeScript,Ionic,PhoneGap,React Native等
这是引擎列表
用于:用于Chrome浏览器,NodeJS和基于Android的手机中
用于:在Firefox浏览器中使用
用于:用于Safari浏览器和基于iOS的手机
用于:用于Microsoft Edge浏览器