Node的源码
目录:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
|
. ├── ... ├── deps │ ├── ... │ ├── v8 │ ├── ... ├── ... ├── lib │ ├── ... │ ├── buffer.js │ ├── child_process.js │ ├── console.js │ ├── ... ├── node -> out/Release/node ├── ... ├── out │ ├── ... │ ├── Release | ├── node | ├── node.d | ├── obj | └── gen | ├── ... | ├── node_natives.h | ├── ... │ ├── ... ├── src │ ├── ... │ ├── debug-agent.cc │ ├── debug-agent.h │ ├── env-inl.h │ ├── env.cc │ ├── ... ├── ...
|
需要关注的几个目录和文件:
/deps/v8
:这里是V8源码所在文件夹,你会发现里面的目录结构跟
V8源码
十分相似。NodeJS除了移植V8源码,还在增添了一些内容。
/src
:由C/C++编写的核心模块所在文件夹,由C/C++编写的这部分模块被称为「Builtin Module」
/lib
:由JavaScript编写的核心模块所在文件夹,这部分被称为「Native Code」,在编译Node源码的时候,会采用V8附带的
js2c.py
工具,把所有内置的JavaScript代码转换成C++里面的数组,生成
out/Release/obj/gen/node_natives.h
文件。有些 Native Module 需要借助于 Builtin Module 实现背后的功能。
/out
:该目录是Node源码编译(命令行运行
make
)后生成的目录,里面包含了Node的可执行文件。当在命令行中键入
node xxx.js
,实际就是运行了
out/Release/node
文件。
来张图说明一下V8在Node运行时的整体过程。
Node在启动的时候,就已经把 Native Module,Builtin Module 加载到内存里面了。后来的 JavaScript 代码,就需要通过 V8 进行动态编译解析运行。
-
官方公布
V8 的名为 Crankshaft 的优化编译器,与原来的 Full Compiler 一起工作,声称较2008年版本提高50%性能。
-
2014年12月, io.js 从久久不更新的 NodeJS 分出来支,并且引入最新的 V8 ,这时候 NodeJS 处于
0.12.17
版本。
-
2015年2月,NodeJS基金宣布NodeJS(
v0.12
)和io.js(
v3.3
)合并,合并版本在未来发布。
-
2015年7月7日,
官方公布
又一个新的名为TurBoFan的优化编译器,主要提供ES6的新语法,以及提高性能。并表明该编译器最终目标是全部替代Crankshaft编译器
-
2015年7月17日,
官方发布
集成TurboFan的V8版本(
v4.5
)
-
2015年9月08日,NodeJS紧跟着
发布
了与io.js的合并版本(
V4.0
),引入最新的V8,给开发者们带来了最新的ES6语法,以及性能上的提高。
-
2015年8月28日,V8
发布
v4.6
版本
-
2015年10月29日,NodeJS
发布
V5.0.0
版本
-
2016年3月15日,V8
发布
v5.0
版本
-
2016年4月26日,NodeJS
发布
V6.0.0
版本
-
2016年7月18日,V8
发布
v5.3
版本,新增名为Ignition的解析器(Interpreter),跟原有的优化编译器(Crankshaft and TurboFan)进行串联工作,提供了更加优化的内存使用方案,主要针对于低内存的Android设备,并称在未来会普及到全平台。
-
2016年10月25日,NodeJS
发布
v7.0.0
版本
-
截止到今天(2016年11月),NodeJS版本
v7.0.0
,搭配了
v5.4
的v8,而官方发布的最新v8版本是
v5.5
。
回顾整个历程,由于NodeJS是搭建在V8之上的,所以NodeJS很多「新增语言特性」和「提高性能」等更新都需要依赖V8的发布日程。
就像NodeJS和io.js宣布合并,和真正发布
V4.0
版本的中间,还隔了V8的生命历程一个重大的更新(发布 TurboFan 编译器,该编译器引入了大量的ES6语法支持。)。这个更新直接提供了相当一部分的ES6语法,以及性能上的提高。