最新版本号[免费下载]

Node.JS的编译过程

作者:本站编辑 发布时间:2015-11-24 来源:本站原创 点击数:

Node的编译系统使用waf,waf是一个基于python的编译系统,用于替代传统的autoconfig和automake。node编译的主要控制文件是wscript,文件中的各函数对应编译过程中的各个过程。主要函数有如下几个:set_options, configure, v8_cmd, build_v8, build和shutdown。从编译脚本和代码来看,node好像在为win32原生支持做准备,因为编译脚本和源代码文件已经开始区分对待win32和cygwin了。

  set_options:
  set_options应该是每次waf执行都会被最先被调用,它设置了node编译时的选项,执行./configure –help显示出的编译选项都是在这个函数中定义的。用户输入的选项以字符串的形式保存在编译上下文中。

  Configure:
  Configure在执行configure命令的时候被调用。函数的上班部分主要将用户设置的参数全都设置到环境变量中。这样设置编译选项就有两种方式,命令行参数和环境变量,效果是一样的。函数的后半部分检测操作系统类型和CPU类型以及编译器的能力。

  v8_cmd:
  其中保存的是v8的编译规则,由于v8是用scons编译的,所以这个函数其实就是用来拼接命令调用scons来编译v8的命令。

  build_v8:
  此函数用来执行实际的v8编译。

  build:
  此函数应该在build时被调用,用来执行build操作。函数中首先调用build_v8编译v8,然后调用deps/libev和deps/c-ares下的wscript编译libev和c-ares,然后是编译http_parser。
  接下来是一个比较有趣的部分,也因该是有些人关心的部分。Node使用v8附带的js2c.py将node的js代码转化为c语言的数组,也就是node_natives.h,然后直接编译进node的可执行文件中。虽说在node文件中的字符串表段中肯定还是以原文保存这些代码,但是这就为js代码提供了一层加密,人们不能轻易就看到源代码。这样也提供了一种可能,将编写好的js代码混淆然后编译成dll发布出去,这样应该很大程度上解决了js必须源代码发布的问题。
  函数中最后就是node本身代码的编译了,其中有设置node的版本号并将其编译到node文件中。还有一个应该注意的:作者好像比较喜欢dtrace,在node中专门加入了很多dtrace使用的探测点或者桩函数(这个说明作者在solaris下做性能测试?)。dtrace确实比较好用了,不过仅在solaris下可用。
  有一个要说明的:只有在使用静态编译依赖库的时候才会node的编译系统才会编译deps下的v8、libev和 c-ares。如果选择动态的话,要自己指定头文件的位置,还要自己将依赖库编译成动态链接库文件的形式,在执行时还需要维护LD_LIBRARY_PATH环境变量。
  还有一个不太明白的地方,编译脚本中用new_task_gen建立了很多新的任务。不过这些任务全都没有看到有调用执行的地方。这些函数在最新的waf中也不存在了,所以只能猜测这些代表task的变量在超出作用域的时候会被waf依次执行。

  Shutdown:
  这个函数看起来是每次waf执行都会被调用,且在做最后执行。如果clean则删除快捷方式,不是则建立快捷方式的工作。


本文责任编辑: 加入会员收藏夹 点此参与评论>>
复制本网址-发给QQ/微信上的朋友
AI智能听书
选取音色