欢迎阅读我的博客:《JavaScript开发者需要了解的V8知识(一):V8InNodeJS》一种针对“回收”功能的编程语言。市面上具有此类功能的语言一般都有相应的虚拟机,如Java的JVM、C#的CLR、PHP的Zend。虚拟机一般实现代码分析、内存管理等功能,layout,andgarbagecollection。不像C/C++这样的语言没有虚拟机,需要手动管理内存。C/C++语言编译出来的文件可以直接运行。我觉得学习一个开发语言,除了知道一些语法用法和各种API调用外,还需要学习相应的虚拟机,由于特殊的历史原因,JavaScript并不是V8的唯一引擎,但目前V8是最好的JavaScriptengine在业界,所以成为学习样本。今天的JavaScript不仅仅是在浏览器端使用,因为有了NodeJS,它也可以运行在服务器端。与浏览器端不同的是,服务器端对资源高度敏感。当业务规模变大,并发量变大的时候,一些非常小的问题就会被放大。这时候,一些小的内存泄漏就会造成灾难。所以作为一个JavaScript开发者,搞清楚从输入console.log('helloworld')到后面CPU执行的中间过程是非常重要的。这对于如何用JavaScript这种松散的语言写出高质量的代码也有一定的指导作用。要真正实现JavaScript全栈,任重而道远。V8概述作为一个JavaScript引擎,V8最初用于GoogleChrome浏览器。它随Chrome的第一个版本发布并开源。现在除了Chrome浏览器之外,它还有许多其他用户。如NodeJS、MongoDB、CouchDB等。JavaScript是一种基于原型的语言。基于其对Prototype继承的使用,V8采用了直译,即直接将JavaScript代码编译成机器码(MachineCode,有些地方也称为NativeCode),然后由硬件直接执行。与传统的“编译-解析-执行”过程不同,V8处理JavaScript时没有二进制代码或其他中间代码。简单来说,V8的主要工作就是:“将JavaScript直接翻译成机器码,然后运行”。但这往往是一个复杂的过程,需要处理很多问题,比如:编译、优化、内存管理、垃圾回收等,我写的这个系列文章也是从这三大点出发解读V8对这些内容。V8在NodeJSNodeJS源码概览NodeJS中,V8是怎么引入的?我们关注Node的源码目录:.├──...├──deps│├──...│├──v8│├──...├──...├──lib│├──...│├──buffer.js│├──child_process.js│├──console.js│├──...├──node->out/Release/node├──。..├──out│├──...│├──发布|├──节点|├──node.d|├──对象|└──创|├──...|├──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++编写的模块称为“BuiltinModule”/lib:JavaScript编写的核心模块所在的文件夹。这部分称为“BuiltinModuleNativeCode”,在编译Node源码时,会使用V8自带的js2c.py工具,将所有内置的JavaScript代码转换成C++中的数组,生成out/Release/obj/gen/node_natives.h文件,一些NativeModule需要借助BuiltinModules来实现其背后的功能/out:该目录是Node源码编译后生成的目录(命令行运行make),其中包含Node可执行文件,当在命令行输入nodexxx.js时,实际运行的是out/Release/node文件,下面用一张图来说明V8在Node中运行的整体过程,Node在启动时,已经加载了NativeModule和BuiltinModule进入内存,后面的JavaScript代码需要V8动态编译解析运行查看V8版本号NodeJS的进度与V8息息相关,关注每个NodeJS版本对应的V8版本可以加强对该版本新功能的理解和起源。在NodeJS中,可以通过process.versions查看NodeJS依赖模块的版本号,V8包含了。例如,我正在运行NodeJS的v7.0.0:$node>process.versions{http_parser:'2.7.0',node:'8.0.0-pre',v8:'5.4.500.36',uv:'1.10.0',zlib:'1.2.8',ares:'1.10.1-DEV',模块:'51',openssl:'1.0.2j',icu:'58.1',unicode:'9.0',cldr:'30.0.2',tz:'2016g'}NodeJS与V8的缠绵情缘2008年9月,第一版V8与第一版Chrome一同发布。2009年5月,RyanDahl在GitHub上发布了NodeJS的第一个版本。2010年12月,官方宣布V8的优化编译器Crankshaft与原来的FullCompiler一起工作,声称比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年09月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。Version0.02016年7月18日,V8发布了v5.3版本,新增了名为Ignition的解析器(Interpreter),与原有的优化编译器(Crankshaft和TurboFan)协同工作,提供更优化的内存使用方案,主要针对适用于低内存的安卓设备,据说未来会普及到全平台。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语法,以及性能改进。总结本文主要讲述了以下几点:我的写作动机,对NodeJS底层的理解,为编写高质量的JavaScript代码提供指导。简述V8的作用及其主要职责:编译优化、内存管理、垃圾回收。通过NodeJS源码目录和NodeJS代码加载过程,我们可以了解到V8在其中的位置。列出NodeJS和V8的迭代版本和联系,强调V8在NodeJS中的地位。
