【问题标题】:Are Runtime environments and Compilers/Interpreters the same?运行时环境和编译器/解释器是否相同?
【发布时间】:2021-10-24 07:27:54
【问题描述】:

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

【问题讨论】:

  • 你了解 Python 是如何“解释”和 C++ 是如何“编译”然后“执行”之间的区别吗?如果没有,请参见例如Wikipediathis Q&A.
  • “运行时”是该语言的解释器加上“标准库”实现,无论是 C++、PythonNode.js 还是 browser JS

标签: javascript node.js runtime-environment


【解决方案1】:

让我们这样理解:

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 是独立开源的,我们可以将其embed 放入我们的 C++ 程序中,而 Nodejs 本身只是一个用 C++ 编写的程序。 Nodejs 采用了 V8 并通过添加服务器所需的功能对其进行了增强。

JavaScript 通常被认为是一种解释型语言,但现代 JavaScript 引擎不再只是解释 JavaScript,而是编译它。

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      几个简单的点可能会有所帮助:

      1. C/C++ 代码将由 C/C++ 编译器编译成机器码,不需要任何运行时环境即可运行(大多数情况下,运行时库除外)

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-27
        • 1970-01-01
        • 1970-01-01
        • 2017-06-28
        • 1970-01-01
        相关资源
        最近更新 更多