NodeJS 执行环境与编译过程
NodeJS 执行环境
NodeJS 运行在服务器端,为我们提供了一系列 NodeAPI。但需要注意的是,NodeJS 执行环境只包含 JavaScript 中的 ECMAScript 部分,并没有提供 DOM 和 BOM 等浏览器专属的 API。
NodeJS 编译过程
当我们编写完 JavaScript 代码后,NodeJS 会经过以下几个步骤将其编译为机器码:
1. 词法分析
词法分析会将代码拆分成一个个 token,识别出关键字、标识符、分界符、运算符等语法单元。
关键字如var
、function
等。
标识符如变量名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++模块来处理。