关于nodejs源码的研究

121 篇文章 1 订阅

回首对nodejs的源码研究,时间已经过去了一年多。我很喜欢js这门语言,有时候感觉他和c语言一样,在c语言里,很多东西都需要自己实现,让我们可以发挥无限的创造力和想象力,js虽然很多东西在v8里已经提供,但是用js,依然可以创造很多好玩的东西,还有好玩的写法。js应该我见过唯一的一门没有实现网络和文件功能的语言。或者说没有向用户提供这种功能。这也是我对js最大的偏见。因为网络和文件,是一个很重要的能力。对于程序员来说,也是很核心很基础的知识。因为js的使用场景是运行在浏览器。如果js提供了文件操作的话,这就意味着js可以访问用户电脑上面的数据,这也是不显示的,所以,js不可能会提供这样的能力,让我们可以像其他语言一样,随意操作用户的资源。

很幸运,nodejs被创造出来了。nodejs在js的基础上,使用v8提供的能力,极大地拓展、丰富了js的能力。尤其是网络和文件。这样我就不仅可以使用js,还可以使用网络、文件等功能。这是我逐渐转向nodejs方向的原因之一。也是我开始研究nodejs源码的原因之一。因为nodejs满足了我喜好和技术上的需求。不过一开始的时候,我并没有全身心地投入代码的研究,只是偶尔会看一下某些模块的实现。真正的开始,是为了做<nodejs是如何利用libuv实现事件循环和异步>的分享。从那时候起,大部分业余时间和精力都投入源码的研究。

我首先从libuv开始研究,因为libuv是nodejs的核心之一。因为曾经研究过一些linux的源码,也一直在学习操作系统的一些原理和实现,所以在阅读libuv的时候,算是没有遇到太大的困难。c语言函数的使用和原理,基本都可以看明白。重点在于业务逻辑上,需要把各个逻辑捋清楚。我使用的方法就是注释和画图。我个人比较喜欢写注释。虽然说代码是最好的注释,但是我还是愿意花时间用注释去把代码的背景和意义阐述一下,因为并不是每个程序员都能做到代码即注释这一境界。而且注释会让大部分人更快地能读懂代码的含义。读libuv的时候,也穿插地读了一些js和c++层的代码。阅读nodejs源码的方式是,选择一个模块,垂直地从js层分析到c++层,然后到libuv层。

读完libuv,接下来读的是js层的代码,js虽然容易看懂,但是js层的代码非常多,而且我感觉逻辑上也非常绕,所以至今,我还有很多没有细读。这个作为后续的计划。nodejs中,c++算是胶水层,很多时候,不会c++,其实也不影响nodejs源码的阅读,因为c++很多时候,只是一种透传的功能,他把js层的请求,通过v8,传给libuv。然后再反过来。所以c++层我是放到最后才细读。c++层我觉得是最难的,难的不是看不懂他的代码逻辑。而是真正明白他的工作原理,这时候,我又不得不开始读v8的源码了,v8的源码可以说,非常难。我选取的几乎是最早的版本0.1.5。然后结合8.x版本。通过早期版本,先学习v8的大概原理和一些早期实现上的细节。因为后续的版本虽然变化很大,但是也只是功能的增强和优化,有很多核心的概念还是没有变化的,这是我选取早期版本的原因,避免一开始就陷入无穷无尽的代码中,迷失了方向,失去了动力。哪怕是早期的版本,有很多内容依然非常复杂。结合新版本是因为有些功能在早期版本里没有实现,这时候要明白他的原理,就只能看新版的代码,有了早期版本的经验,阅读新版的代码也有一定的好处。多多少少也知道了一些阅读技巧。

nodejs的大部分代码都在c++和js层,所以目前仍然是在不断地阅读这两层的代码。还是按照模块垂直分析。阅读nodejs代码,让我更了解nodejs的原理,也更了解js。不过代码量非常大,需要源源不断的时间和精力投入。所以我也一直在寻找志同道合的人一起分析,加快对nodejs源码的研究,不过真正能啃源码的人不多。源码的阅读可能并不一定能帮助你的工作变得更好,很多时候也往往不需要深入到这种程度。不像学一个框架,一门语言一样,我们立刻就能看到效果,这极大地增强了我们的积极性。就像现在可能很少人学c、c++一样,使用底层语言,实现一个能用的东西,会变得异常不容易。但是使用一些脚本语言,我们很快就能看到我们想要的东西。最主要的是,使用更难的语言,并不会增加我们的工资。所以,这是一个选择的问题,不是对错的问题。做技术,知其然知其所以然的感觉是非常美妙的,你靠着一门技术谋生,却对他知之甚少,这种感觉并不好。阅读源码,虽然不会为你带来直接的、迅速的收益,但是有几个好处是必然的。第一是他会决定你的高度,第二你写代码的时候,你看到的不再是一些冰冷冷、无生命的字符。这可能有点夸张,但是你了解了技术的原理,你在使用技术的时候,的确会有不同的体验,你的思维也会有了更多的变化。第三是提高了你的学习能力,当你对底层原理有了更多的了解和理解,你在学习其他技术的时候,就会更快地学会,比如你了解了epoll的实现,那你看nginx、redis、libuv等源码的时候,关于事件驱动的逻辑,基本上就没有太大的压力了。

这几年,大部分业余时间和精力都花在了各种源码分析中,linux、nginx、v8、nodejs、线程库、libuv。过程是非常难的,这需要投入长期的时间和精力,还需要专注、不断的思考。但是阅读这些源码让我对技术和计算机原理有了更多、更深的了解和理解。也希望能利用技术做更多的事情。同时也看到很多同学在做各个方向的源码研究,期待有更多人去做这样的事情。阅读nodejs源码的初衷是让自己深入理解nodejs的原理,然后也会输出一些内容,希望让大家也能从中受益。这是不容易走的路,但是,正确的、喜欢的路,慢点、难点又有什么所谓呢。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值