从浏览器到JS系列(一)JS引擎,JS虚拟机,JS运行时(5)

前文说了一堆关于JS引擎和JS虚拟机的,总的来说我个人感觉就是:JS引擎和JS虚拟机大多情况下这两者是可以混用的,或者说JS虚拟机是JS引擎的核心组件。在这种彼此概念有覆盖的情况下倒不用太纠结什么是什么,更值得重视的是做了什么。JS引擎/虚拟机主要作用是编译,执行JS代码。当然这个说法是很笼统的,后面会展开来写这个过程。

那什么是JS运行时?或者说什么是运行时

运行时,如果直译的话就是"运行的时刻",顾名思义也即程序运行的时刻。这种说法或许不能说错,但在当前的语境下应该时不合适的。引擎,虚拟机,运行时应该是性质相似的东西,既然引擎和虚拟机是一种工具,程序,那运行时在此处不应该被理解为是一种状态,而是一种东西,这个"东西"我理解为是运行时的环境。

生物需要环境才能生存,工具需要环境才能工作,语言需要环境才能运行。环境提供支持与约束,支持让语言更强大便捷,约束让语言更安全。这样说还是抽象,下面是专业的解释:

那么什么是“managed runtime”?

其重点就是,运行时要掌管程序执行的某些重要的方面,以保证程序执行的安全性之类的。

被掌管方面,例如:

内存管理:通过强制的自动内存管理,配合强制的类型系统安全性保证(静态/动态都可以,静态类型系统无法保证的方面由运行时插入代码动态保证),以及诸如数组越界检查等功能,保证程序在内存分配、访问、释放上都能保持类型安全。

代码执行:例如对代码的执行做权限管理、可见性限制之类,保证代码只在其应用的权限内执行,并且拒绝无法通过验证的代码的执行。

"运行时通常都是库而不是进程"

————JavaScript引擎、虚拟机、运行时环境是一回事儿吗?@RednaxelaFX

运行时
上面这些东西总要在实际环境中跑
跑的时候就是运行时
环境则为外部冷热度

水箱是否有水
是否有润滑油
电池是否有电等等(电打火)
对应就是
一组外部约束
用来检测代码在当前环境中
安全性、权限等等的东西
比如 node 运行时
和 
浏览器运行时区别

 ————JavaScript引擎、虚拟机、运行时环境是一回事儿吗?@RednaxelaFX

如果运行时要具象为一种工具,则常见的浏览器可视为是JS的一种运行时,还有node运行时。两种运行时跑的都是JS代码,但为什么是两种运行时,因为提供的库是完全不一样,即提供的支持不一样。浏览器给予JS操作DOM的能力,而node提供了相应的功能模块以支持JS读取文件。

写到这我有一种感觉,即JS虚拟机约等于JS引擎被包含于JS运行时,JS运行时提供完整的运行环境。

我一开始对这个问题感兴趣是源于朴灵老师评注阮一峰老师谈Event Loop的那篇文章,原文地址已经失效,这里贴上一篇转贴:【朴灵评注】JavaScript 运行机制详解:再谈Event Loop。里面有这么一段话:

【JavaScript引擎的内部运行机制跟Event loop没有半毛钱的关系。】

【这里的错误在于要分清楚JavaScript执行环境和执行引擎的关系,通常说的引擎指的是虚拟机,对于Node来说是V8、对Chrome来说是V8、对Safari来说JavaScript Core,对Firefox来说是SpiderMonkey。JavaScript的执行环境很多,上面说的各种浏览器、Node、Ringo等。前者是Engine,后者是Runtime。】

【对于Engine来说,他们要实现的是ECMAScript标准。对于什么是event loop,他们没兴趣,不关心。】

【准确的讲,要说的应该是Runtime的执行机制。】

 这段话当时看得不明白,不清楚JS引擎和JS运行时的区别,不知道孰对孰错。现在看来,应该是朴灵老师说对了。Event Loop是JS运行时的执行机制,由JS运行时负责实现,JS引擎负责实现的是ES标准

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值