runtime engine VM的一些随想

这篇文章还是我在写作的新书《新时期的Node.js》入门的一部分

一些比喻

我们可以通过一些现实的比喻来理解接下来要讲述的概念。

苏联是社会主义的一种运行时

这大概是我这辈子能想到的最贴切的比喻了(笑),社会主义只是一种思想,可以看做是一门编程语言,而苏联为其提供了运行时环境,而俄罗斯就是其底层的硬件

斯大林模式是一种虚拟机

虽然它并不像java VM那样完美,斯大林模式屏蔽了底层的接口,使得社会主义可以移植到不同国家(操作系统)上

什么是Node

在讨论所有Node相关的问题之前,我们必须要明确一个问题,什么是Node?
这看起来是一个再简单不过问题,或许有人说Node就是用javascript实现的一门编程语言,这种说法其实是不准确的。

Node是一个javascript运行时(runtime)环境,所谓的runtime直译过来就是运行时组件,不过这种说法有些抽象了,读者可以将其想象成一种编程语言的运行环境。这个运行环境包括了编译器,操作系统的底层支持等等。
当我们在讨论一门编程语言时,语法本身并不重要,重要的是编译器(解释器)将如何对待这些语法,Node底层是用c语言和c++来实现的,如果创始人愿意,他完全可以将Node创造成一个新的java或者python,只要修改一下底层的实现就可以做到,不过名字大概就要改成Node.java或者Node.py了。

什么是编程语言

编程语言本身是一种抽象的规范,例如c++,真正的c++不存在与任何计算机上,它其实是厚厚的一摞文档,上面规定了每一个语言细节以及每一个有效输入对应的输出值。
开发者平时所使用的C++,其实是一种C++实现。

RunTime

关于运行时最出名的大概就是VC++了,微软出品的这套应用程序组件可以使开发者编写的c/c++语言程序在其中运行。VC++本身对C++还做了一些扩展,例如MFC。
VC++可以编译和执行用户编写的c语言代码,而开发者不考虑这背后到底是怎样实现的。那么一个功能完备,集成了编译和执行的C++编译器可以看做是一个运行时吗?笔者认为是可以的。

站在开发者的角度来说,一个x语言的runtime代表可以用x语言编写的代码在这个runtime上运行,那么将这个概念扩大一些,chrome也是一个javascript运行时,但它背后驱动runtime是靠javascript engine来进行的,二者之间的界限就有点暧昧了。
那么就有了新的问题,对于chrome来说,v8 engine算不算javascript runtime的一部分呢?
笔者认为是算的,runtime可以是多种多样的,对于chrome这一javascript runtime,v8是不可或缺的一部分,当然如果换成别的浏览器,engine就要变成spiderMonkey或者其他的engine了。

例如
Node实现了ECMAscript的语法规范,前面也说到了,当我们谈论一门语言,其实是在谈论它的编译器实现
例如下面的代码,我们无法分辨这是一段Node代码或是javascript代码,虽然他们都能产生相同的输出

var name = "Lear";
function greet(name){
    console.log("I am",name);
}

如果一门X语言实现了ECMAScript规定的语法,那么上面也可能是X语言的代码

Runtime Engine VM

在各种编程语言中经常可以看到上面三个名词的身影
Runtime 就像上面讲述的那样。
例如VC++就是c语言和c++的一个runtime,

VM
VM的概念比较广泛,通常可以认为是在硬件和二进制文件的中间层,
在C++中,编译好的二进制文件可以直接被操作系统调用,而在java中,编译好的字节码是交给虚拟机来运行的,这样的好处就是对开发者屏蔽了操作系统之间的差异,对于不同操作系统的处理交给了虚拟机来完成,从这个角度看来,vm是对不同计算机系统的一种抽象。

Engine
engine的概念其实十分模糊,它和runtime和VM的概念都用重叠之处,以V8为例,它可以看做是一个VM吗?
好像可以,因为它确实可以运行在不同操作系统下,而且确保用户编写的代码是平台无关的。
那它可以看做是一个runtime吗,好像也可以,这就需要读者自己把握了。

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010668495/article/details/72571695
个人分类: node-js
所属专栏: Node.js笔记
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭