我刚刚开始使用Node.js,我在Python和c++方面有相当多的背景。我开始知道Node.js是一个运行时环境,但我有一个粗略的时间来理解它实际上对代码做了什么,使它不同于编译器。如果有人能解释一下运行时环境与典型编译器和解释器的具体区别,那就更好了。
我们这样看:
Node.js是一个基于Chrome V8 JavaScript引擎的JavaScript运行时。
V8是Google Javascript引擎,Google Chrome使用的是相同的引擎。还有其他JS引擎,如Firefox使用的SpiderMonkey, Safari使用的JavaScriptCore, Edge最初是基于Chakra的,但它已经重建为使用V8引擎。
在了解V8如何工作之前,我们必须先了解它们之间的关系。
JavaScript引擎独立于它所在的浏览器。这一关键特性推动了Node.js的崛起。V8被选为驱动Node.js的引擎。
由于V8是独立且开源的,我们可以将其嵌入到我们的c++程序中,而Nodejs本身就是一个用c++编写的程序。Nodejs采用了V8,并通过添加服务器所需的功能对其进行了增强。
JavaScript通常被认为是一种解释语言,但现代JavaScript引擎不再只是解释JavaScript,他们编译它。
由于您有c++背景,c++执行所谓的AOT编译,代码在编译期间转换为机器码,然后再执行。
另一方面,JavaScript是由V8内部编译的,在执行期间进行JIT编译。当代码被解释器执行时,它会跟踪那些经常被调用的函数,并将它们标记为热函数,然后将它们编译成机器码并存储。
编译器是将代码从一种语言转换为另一种语言的程序。以Java为例,我们有一个Java编译器javac
,你可以在你的.java
文件上运行,将你的代码编译成与平台无关的Java文件(可以被任何jvm理解和执行)。由于您是JavaScript新手,您将遇到转译器(像babel),它将您的转换为下一代。JavaScript代码转换成可以被所有浏览器(甚至是旧浏览器)处理的遗留JavaScript代码。运行时是一个更加模糊的概念。它可以是一组函数,在特定操作系统上运行编译后的代码,也可以是程序运行的整个环境。对于NodeJS,它是可以在浏览器外运行JavaScript程序的环境。它采用了在Chrome浏览器上运行JavaScript的V8引擎,并使其无处不在。这就是JavaScript如何从仅在浏览器上运行的客户端编程语言转变为可以在配备了运行时环境NodeJS的服务器上运行的服务器端编程语言。
以下几点可能会有所帮助:
-
C/c++代码将由C/c++编译器编译成机器码,并且不需要任何运行时环境来运行(除了运行时库)
-
Python代码需要Python解释器来执行。你说你有c++/python的背景你一定很熟悉这些细节
-
JavaScript本来是要在浏览器中运行的,但是有些聪明的人想到在浏览器之外运行它,他们创建了JavaScript执行引擎(这是一种独立的JavaScript执行器),Node.js只是其中之一。它只是自己在浏览器外运行JavaScript代码。执行仍然是对JavaScript代码的解释,所以它只是一个解释器,有很多支持功能来管理运行时依赖关系,包管理等。