前文说了一堆关于JS引擎和JS虚拟机的,总的来说我个人感觉就是:JS引擎和JS虚拟机大多情况下这两者是可以混用的,或者说JS虚拟机是JS引擎的核心组件。在这种彼此概念有覆盖的情况下倒不用太纠结什么是什么,更值得重视的是做了什么。JS引擎/虚拟机主要作用是编译,执行JS代码。当然这个说法是很笼统的,后面会展开来写这个过程。
那什么是JS运行时?或者说什么是运行时
运行时,如果直译的话就是"运行的时刻",顾名思义也即程序运行的时刻。这种说法或许不能说错,但在当前的语境下应该时不合适的。引擎,虚拟机,运行时应该是性质相似的东西,既然引擎和虚拟机是一种工具,程序,那运行时在此处不应该被理解为是一种状态,而是一种东西,这个"东西"我理解为是运行时的环境。
生物需要环境才能生存,工具需要环境才能工作,语言需要环境才能运行。环境提供支持与约束,支持让语言更强大便捷,约束让语言更安全。这样说还是抽象,下面是专业的解释:
那么什么是“managed runtime”?
其重点就是,运行时要掌管程序执行的某些重要的方面,以保证程序执行的安全性之类的。
被掌管方面,例如:
内存管理:通过强制的自动内存管理,配合强制的类型系统安全性保证(静态/动态都可以,静态类型系统无法保证的方面由运行时插入代码动态保证),以及诸如数组越界检查等功能,保证程序在内存分配、访问、释放上都能保持类型安全。
代码执行:例如对代码的执行做权限管理、可见性限制之类,保证代码只在其应用的权限内执行,并且拒绝无法通过验证的代码的执行。
"运行时通常都是库而不是进程"
运行时
上面这些东西总要在实际环境中跑
跑的时候就是运行时
环境则为外部冷热度
水箱是否有水
是否有润滑油
电池是否有电等等(电打火)
对应就是
一组外部约束
用来检测代码在当前环境中
安全性、权限等等的东西
比如 node 运行时
和
浏览器运行时区别
如果运行时要具象为一种工具,则常见的浏览器可视为是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标准