事实上,我已经用过skynet在自己平时的项目中。其内部的源码实现,我并没有很多关心。最近在看书的时候,发觉c语言还有很多需要挖掘的,刚好把c语言的一些经验,用于解读skynet源码,这倒不失为一次应用理论知识的机会。
了解c语言的人,多数都知道c语言的灵活性质。c语言的难度,并不是在于语法,而是在于即使我们掌握了所有的语法,到了应用的时候忽然发现,还可以这么样子写项目,写产品。把这个说法用到skynet,我认为非常到位。很多喜欢c++的都说c++好,事实上非常好的代码以及框架或者产品,c语言的实现比起c++更轻量级,甚至更好。skynet就是一个非常好的证明。
其实,这次阅读源码,最大的收获是c语言的应用。c语言具有极其多的应用场景,但是以前的了解都是不贴近现实的,都是建立在知道了听说的情况下。我听过说嵌入式c编码,我了解过c写服务器端,我也知道c语言写各种引擎,还知道很多其他语言都是c实现的,例如lua是标准c语言实现的。接触skynet框架,在2014-2015年阅读过一次,不过那一次的效果一般。因为当时的需求更多是应用skynet而不是了解底层实现。大约是经过了4年的时间的接触,发现skynet的应用已经有一定基础,但是还没有达到精通整个结构的成程度,这个时候需要整理一次skynet底层实现了。
当然今天文章的主要作用是目录,认识skynet的关键。我们知道,阅读一份源码或者查看一份引擎源码,需要的基础是了解其内部实现,了解内部实现,则需要知道执行流程,执行流程的获取,需要很深厚的基本功,skynet需要的基础功就是c。这里讲分类讲解阅读skynet需要掌握的知识点,以方便自己甚至有兴趣的人学习和阅读。
第一点,c语言基础。c的语法,这是毋庸置疑的。那么阅读这一份源码,需要c的哪些知识呢?这里仅仅列举我认为需要精通的,如c语言内存对齐,c指针,c内联函数,c宏函数,c锁机制,c多线程。
第二点,网络通信。网络知识不是语法性质的,而是具有应用型的。skynet内部实现是基于linux的,并且网络通信就是socket,套接字。所以阅读源码,需要比较好的网络通信编程知识。例如常见的tcp,又如非阻塞,再如定时器。事实上,skynet内部使用了不同平台的两种IO模型,epoll模型和kqueue模型。两者模型,在2016年我曾经用epoll编写过一次服务器端应用。
第三点,lua知识。这里说明的是,lua知识不仅是lua的语法,事实上lua语法是不够的,还需要掌握c和lua的交互。我们都知道jni,c和java的相互调用和访问行为,也清楚c/js,c/c#等等,事实上这些基础对于了解skynet至关重要。因为skynet在应用中的逻辑层都是要求用lua实现,除非比较极端情况或者非常重要的场合,需要直接使用c编码实现,应用动态库so进行链接,否则一般情况使用lua即可。
阅读源码,是一个过程,也是逐渐掌握框架或者应用到一定级别需要走的路。我们阅读源码的最好效果是,能够独立这种思维模式,去重新实现一套属于自己需要的框架和引擎。如果并不是为了去掌握仅仅是追求欣赏和阅读,个人以为阅读skynet是一种享受,原因是代码量很少。核心代码才几千行。另外,文件结构比较清晰,很适合需要深入学习和提升c的阅读。这里补充一下题外话:公众号带有(1)之类的,后面的部分都会继续编辑。由于每天只能发一篇,所以很多文章的编辑都是在排期的,所以很多文章后面会一一推送。我非常感谢大家的关注和点赞。