Node.js和V8之间的关系是什么

Node.js和V8之间的关系是什么

Node.js是一个基于V8引擎构建的开源、跨平台、后端JavaScript运行环境,用于在浏览器之外执行JavaScript代码。JavaScript运行环境包含执行JS代码所需的所有组件。JavaScript最初设计用于仅在浏览器中运行。所有浏览器都配备了用于运行JavaScript的JavaScript引擎。例如,Mozilla Firefox由Spidermonkey提供支持,而Chrome使用V8引擎。JavaScript引擎不是机器,而是执行JavaScript代码并使计算机能够在硬件级别执行特定任务的程序或解释器。当Ryan Dahl意识到Chrome浏览器中V8引擎的潜力并将其扩展为独立应用程序时,他创建了Node.js。计算机只能解释机器代码,而JavaScript是一种高级语言,因此我们需要编译器将JavaScript转换为机器代码。Node.js只是一个支持程序执行的运行环境。

V8引擎是Node.js的核心。

没有V8,Node.js无法运行。因为在这样的环境中没有JavaScript引擎,无法运行JavaScript。Chrome的V8引擎将可读的JavaScript代码转换为更优化的机器代码。它是一个用C++编写的开源多线程程序。该引擎最初设计仅供Web浏览器执行,但最新版本还在浏览器之外执行JS代码,实现了服务器端脚本。它与其执行的浏览器无关。这个特性激发了设计师选择V8引擎来驱动Node.js。Node.js是用C++编写的。V8引擎嵌入在node.js代码中,为代码添加了额外的功能。因此,C++代码比ECMAScript标准规定的更灵活。V8引擎和Node.js是可互操作的。它们共同为应用程序开发提供了强大的组合。

V8引擎是Node.js的核心。

V8引擎的工作原理: 早期的JS引擎是解释器,逐行执行代码,不需要编译,这使得处理过程非常缓慢,因为在执行所需任务之前,必须分析每个语句。V8采用了使用多线程加速编译过程的技术。V8使用了即时编译器(JIT)技术。即时编译器结合了解释器和编译器的最佳特性,使得翻译和执行都更快。解释器逐行执行代码,编译后的代码在运行时动态优化(和重新优化)。现在,问题是JavaScript是解释型还是编译型语言。取决于JS引擎,JavaScript既可以是解释型语言也可以是编译型语言。

V8引擎使用以下线程:

1. 主线程: FETCH线程执行主要任务,获取代码并确保其被编译和执行。

2. 编译器线程: 之前的V8版本使用两个线程进行编译。

  • The Full-codegen: 将JS编译为简单且相对较慢的机器码。使用完整代码生成器,解析的JavaScript将直接翻译成机器码,不进行任何转换。因此,执行机器码非常快速。
  • Crankshaft: 对多次运行的代码段进行编译,通常称为热点代码段,以便在下次执行此部分代码时能更高效地执行它们。

此线程经过某些优化。

  • Inlining: 将函数调用替换为函数的代码,从而提高性能。
  • Hidden Classes: JavaScript是一种动态语言,因此属性可以轻松添加或删除。跟踪每个属性变得昂贵,因此它使用隐藏类的方法。当添加新属性时,每个对象的旧隐藏类添加了到新隐藏类的过渡路径。
  • Inline Caching: V8维护最近方法调用中传递的对象类型的缓存,并利用该数据猜测将来传递的对象的类型。

3. Profiler Threads: 通知运行时哪些方法占用了大部分时间,以便Crankshaft对其进行优化。

4. Garbage Threads: 使用标记和清除算法释放内存管理空间。

让我们看看V8引擎如何执行Node.js中编写的JS代码。

Node.js和V8之间的关系是什么

1. 解析: Javascript源代码被解析并转换为抽象语法树(AST)。将代码分解为标记。标记是我们代码的基本构建块,即组成代码的任何内容。例如,let a = 5. 这里的let, a, =, 5都是标记。

let a = 5 
JavaScript

Ast 在程序的语义分析中起着至关重要的作用,因为编译器验证应用程序和语言元素的正确性和正确使用。

让我们通过以下示例来查看 AST 的表示:

const blog = "GeeksforGeeks"
JavaScript

Node.js和V8之间的关系是什么

JSON中的AST表示

{
  "type": "Program",
  "start": 0,
  "end": 28,
  "body": [
    {
      "type": "VariableDeclaration",
      "start": 0,
      "end": 28,
      "declarations": [
        {
          "type": "VariableDeclarator",
          "start": 6,
          "end": 28,
          "id": {
            "type": "Identifier",
            "start": 6,
            "end": 10,
            "name": "blog"
          },
          "init": {
            "type": "Literal",
            "start": 13,
            "end": 28,
            "value": "GeeksforGeeks",
            "raw": "\"GeeksforGeeks\""
          }
        }
      ],
      "kind": "const"
    }
  ],
  "sourceType": "module"
}
JavaScript

2. 编译 :Ignition从语法树生成一个称为字节码的中间代码。

3. 执行 :Turbofan将此字节码转换为高度优化的机器码。机器码在系统上运行。

因此,我们已经理解了Node.js和V8引擎之间的关系,并得出结论,没有像V8这样的JavaScript引擎,是无法运行Node.js的。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册