作者:88943w | 来源:互联网 | 2023-05-18 10:54
我感到有点困惑,有人可以帮助描述Javascript Engine和Javascript Runtime Environment之间的区别.BTW,事件循环是在引擎还是运行时实现的?
1> georg..:
与C和其他编译语言不同,Javascript在一个容器中运行 - 一个读取你的js代码并运行它们的程序.这个程序必须做两件事
解析您的代码并将其转换为runnable命令
为Javascript提供一些对象,以便它可以与外部世界进行交互.
第一部分称为Engine,第二部分是Runtime.
例如,Chrome浏览器和node.js使用相同的引擎 - V8,但它们的运行时不同:在Chrome中,您有window
DOM对象等,而节点则为您提供require
缓冲区和进程.
2> Luo Jiong Hu..:
想象一下机器人正在播放音乐:
Javascript代码将是机器人的音符.
TheJavascript引擎将是能够理解笔记并对其进行操作的机器人.
Javascript运行时将是机器人可以用来播放音乐的乐器.
想象一下机器人正在灭火:
Javascript代码将是机器人灭火的指令.
Javascript引擎将是可以理解指令并对其进行操作的机器人.
Javascript运行时将是消防车和水枪.
使抽象概念具体化,人们会更好地理解.
3> Jörg W Mitta..:
我们首先想象一下Javascript的Ahead-Of-Time编译实现.
该编译器将转换Javascript代码,例如,原生x86机器代码可以运行.但是,Javascript中有一些东西在运行时发生,因此无法静态编译.例如,垃圾收集或反射.因此,为了使程序运行,需要在运行时提供某种支持服务,例如垃圾收集器和反射系统.此外,Javascript有eval
,这意味着(在我们假设的编译实现中)编译器本身或其他一些解释器需要在运行时可用.
我们称之为运行时支持服务.
需要可用于该程序的第二个事情,是对象如Array
,Function
,Object
等,和功能,例如forEach
.这个从一开始就需要对程序可用的对象和函数集合通常称为核心库或基本库.对于像Javascript这样设计为嵌入式的语言,根据上下文,还有一些假定存在的附加库.例如,对于嵌入在浏览器中的Javascript,我们期望DOM对象和函数以及全局window
和document
对象等存在.这些也可以被视为核心库的一部分.
最后,让我们现在忘记我们的假设编译器并查看解释器(或JIT编译器或混合模式引擎或字节码VM).在这里,口译员(或JIT,或其他)是拼图的第三部分.这是实际执行Javascript程序的事情.(从技术上讲,JIT不执行,编译,然后执行其他操作.)
术语不是100%明确:有时,只有运行时支持服务被称为运行时环境,有时,核心库也包含在内.
执行引擎仅指解释器(JIT,VM,...)或解释器和运行时环境的组合.编译器永远不会被称为执行引擎(它不执行任何操作,只是翻译成另一种语言),术语执行引擎很少用于引用静态编译的实现.
事件循环是主机环境的一部分,而不是Javascript实现.
感谢您耐心的回答。