跳到主要内容

NodeJS 执行环境与编译过程

NodeJS 执行环境

NodeJS 运行在服务器端,为我们提供了一系列 NodeAPI。但需要注意的是,NodeJS 执行环境只包含 JavaScript 中的 ECMAScript 部分,并没有提供 DOM 和 BOM 等浏览器专属的 API。

NodeJS 编译过程

当我们编写完 JavaScript 代码后,NodeJS 会经过以下几个步骤将其编译为机器码:

1. 词法分析

词法分析会将代码拆分成一个个 token,识别出关键字、标识符、分界符、运算符等语法单元。

关键字如varfunction等。 标识符如变量名var a = 1中的a
分界符如{ } ( )等。 运算符如||&&!+-*/等。

2. 语法分析

语法分析会将 token 序列转化为抽象语法树 AST(Abstract Syntax Tree)。AST 是一种用于代码语义分析的树形表示,描述了代码的语法结构。

3. 语义分析与代码生成

有了 AST 后,编译器会对代码做语义检查,然后将 AST 转化为低级中间代码或机器码,生成可执行的代码。

NodeJS 与 JavaScript 的区别

虽然 NodeJS 和 JavaScript 都使用 JavaScript 语言编写,但二者在语义分析阶段有所不同。

另外,大家可能会误以为 NodeJS 是单线程的,但实际上 NodeJS 底层是多线程的。

I/O 操作

I/O 即 Input/Output,指的是输入输出操作,如:

读写关系型数据库如 MySQL,它的数据存储在磁盘中。 读写非关系型数据库如 MongoDB、Redis,它们的数据存储在内存中。 大量读写文件等磁盘 I/O 操作。

I/O 操作通常非常耗时,影响程序性能。根据 I/O 操作与 CPU 工作的协调方式,可分为:

阻塞 I/O

应用程序需要等待 I/O 操作完成才能继续执行后面的代码,效率低下。

非阻塞 I/O

应用程序无需等待 I/O 操作完成即可继续执行后面的代码,效率较高。NodeJS 采用的就是非阻塞 I/O。

NodeJS 适用场景

由于 NodeJS 采用非阻塞 I/O,因此它更适合 I/O 密集型的应用场景,如:

Web 应用后端 实时聊天 数据流处理

而对于 CPU 密集型的场景,如大量复杂运算的场景,则更适合使用其他语言如 C++来实现,当然也可以通过 NodeJS 调用 C++模块来处理。

NodeJS 架构

画板