运行时环境和 Compilers/Interpreters 一样吗?

Are Runtime environments and Compilers/Interpreters the same?

我刚刚开始使用 Node.js,我在 Python 和 C++ 方面有相当多的背景知识。我知道 Node.js 是一个运行时环境,但我很难理解它对代码的实际作用,使其与编译器不同。如果有人可以解释运行时环境与典型编译器和解释器的具体区别,那就更好了。

编译器是将代码从一种语言转换为另一种语言的程序。例如,在 Java 中,我们有一个 java 编译器 javac,你可以 运行 在你的 .java 文件上将你的代码编译成平台无关的 java 文件(可以被任何jvm理解和执行)。 由于您是 JavaScript 的新手,您将遇到 transpilers(如 babel),它可以将您的下一代 Java将代码编写成遗留 Java所有浏览器(甚至是旧浏览器)都可以处理的脚本代码。 运行时间是一个比较模糊的概念。它可以从一组函数到 运行 特定操作系统上的编译代码,再到你的程序 运行 所在的整个环境。 对于 NodeJS 案例,它是您可以在浏览器外 运行 JavaScript 程序的环境。它采用 Chrome 的 V8 引擎 运行s JavaScript 在 Chrome 浏览器上,并使其随处可用。这就是 JavaScript 如何从 运行 仅在浏览器上的客户端编程语言转变为可以 运行 在配备 运行 的服务器上的服务器端编程语言时间环境NodeJS.

一些可能有用的简单要点:

  1. C/C++ 代码将由 C/C++ 编译器编译成机器代码,不需要任何 运行time 环境来 运行(大多数情况下,运行 时代的图书馆除外)

  2. Python 代码需要 Python 解释器来执行它。正如你所说你有 C++/Pythons 的背景,你必须熟悉所有这些细节

  3. JavaScript 本来是要在浏览器中 运行 的,它主要是这样做的,但是一些聪明的人想到 运行 在浏览器之外使用它,他们创建了JavaScript 执行引擎(这是一种独立的 JavaScript 执行器),Node.js 只是其中之一。它只是 运行 在浏览器之外自行提供 JavaScript 代码。执行仍然是 JavaScript 代码的解释,因此它只是一个解释器,具有大量支持功能,用于管理 运行 时间依赖性、包管理等

让我们这样理解:

Node.js is a JavaScript runtime built on Chrome’s V8 JavaScript engine.

V8 是 Google Javascript 引擎,Google Chrome 使用相同的引擎。 还有其他 JS 引擎,如 Firefox 使用的 SpiderMonkey,JavaScriptSafari 使用的 Core,Edge 最初基于 Chakra,但已重建为使用 V8 引擎。

在了解 V8 的工作原理之前,我们必须先了解其中的关系。

JavaScript engine is independent of the browser in which it's hosted. This key feature enabled the rise of Node.js. V8 was chosen to be the engine that powered Node.js.

由于V8是独立开源的,我们可以embed把它加入到我们的C++程序中,而Nodejs本身就是一个用C++编写的程序。 Nodejs 采用了 V8 并通过添加服务器所需的功能对其进行了增强。

JavaScript is generally considered an interpreted language, but modern JavaScript engines no longer just interpret JavaScript, they compile it.

由于您有 C++ 背景,C++ 执行所谓的提前 (AOT) 编译,代码在编译期间转换为机器代码,然后再执行。

另一方面,

JavaScript 由 V8 内部编译,并在执行期间完成即时 (JIT) 编译。当解释器执行代码时,它会跟踪经常调用的函数并将它们标记为热函数,然后将它们编译为机器代码并存储它们。