事實(shí)上,我已經(jīng)用過skynet在自己平時(shí)的項(xiàng)目中抒痒。其內(nèi)部的源碼實(shí)現(xiàn)幌绍,我并沒有很多關(guān)心。最近在看書的時(shí)候故响,發(fā)覺c語(yǔ)言還有很多需要挖掘的傀广,剛好把c語(yǔ)言的一些經(jīng)驗(yàn),用于解讀skynet源碼彩届,這倒不失為一次應(yīng)用理論知識(shí)的機(jī)會(huì)伪冰。
了解c語(yǔ)言的人,多數(shù)都知道c語(yǔ)言的靈活性質(zhì)樟蠕。c語(yǔ)言的難度贮聂,并不是在于語(yǔ)法,而是在于即使我們掌握了所有的語(yǔ)法寨辩,到了應(yīng)用的時(shí)候忽然發(fā)現(xiàn)吓懈,還可以這么樣子寫項(xiàng)目,寫產(chǎn)品捣染。把這個(gè)說(shuō)法用到skynet骄瓣,我認(rèn)為非常到位。很多喜歡c++的都說(shuō)c++好耍攘,事實(shí)上非常好的代碼以及框架或者產(chǎn)品榕栏,c語(yǔ)言的實(shí)現(xiàn)比起c++更輕量級(jí),甚至更好蕾各。skynet就是一個(gè)非常好的證明扒磁。
其實(shí),這次閱讀源碼式曲,最大的收獲是c語(yǔ)言的應(yīng)用妨托。c語(yǔ)言具有極其多的應(yīng)用場(chǎng)景,但是以前的了解都是不貼近現(xiàn)實(shí)的吝羞,都是建立在知道了聽說(shuō)的情況下兰伤。我聽過說(shuō)嵌入式c編碼,我了解過c寫服務(wù)器端钧排,我也知道c語(yǔ)言寫各種引擎敦腔,還知道很多其他語(yǔ)言都是c實(shí)現(xiàn)的,例如lua是標(biāo)準(zhǔn)c語(yǔ)言實(shí)現(xiàn)的恨溜。接觸skynet框架符衔,在2014-2015年閱讀過一次找前,不過那一次的效果一般。因?yàn)楫?dāng)時(shí)的需求更多是應(yīng)用skynet而不是了解底層實(shí)現(xiàn)判族。大約是經(jīng)過了4年的時(shí)間的接觸躺盛,發(fā)現(xiàn)skynet的應(yīng)用已經(jīng)有一定基礎(chǔ),但是還沒有達(dá)到精通整個(gè)結(jié)構(gòu)的成程度形帮,這個(gè)時(shí)候需要整理一次skynet底層實(shí)現(xiàn)了槽惫。
當(dāng)然今天文章的主要作用是目錄,認(rèn)識(shí)skynet的關(guān)鍵辩撑。我們知道躯枢,閱讀一份源碼或者查看一份引擎源碼,需要的基礎(chǔ)是了解其內(nèi)部實(shí)現(xiàn)槐臀,了解內(nèi)部實(shí)現(xiàn)锄蹂,則需要知道執(zhí)行流程,執(zhí)行流程的獲取水慨,需要很深厚的基本功得糜,skynet需要的基礎(chǔ)功就是c。這里講分類講解閱讀skynet需要掌握的知識(shí)點(diǎn)晰洒,以方便自己甚至有興趣的人學(xué)習(xí)和閱讀朝抖。
第一點(diǎn),c語(yǔ)言基礎(chǔ)谍珊。c的語(yǔ)法,這是毋庸置疑的治宣。那么閱讀這一份源碼,需要c的哪些知識(shí)呢砌滞?這里僅僅列舉我認(rèn)為需要精通的侮邀,如c語(yǔ)言內(nèi)存對(duì)齊,c指針贝润,c內(nèi)聯(lián)函數(shù)绊茧,c宏函數(shù),c鎖機(jī)制打掘,c多線程华畏。
第二點(diǎn),網(wǎng)絡(luò)通信尊蚁。網(wǎng)絡(luò)知識(shí)不是語(yǔ)法性質(zhì)的亡笑,而是具有應(yīng)用型的。skynet內(nèi)部實(shí)現(xiàn)是基于linux的横朋,并且網(wǎng)絡(luò)通信就是socket仑乌,套接字。所以閱讀源碼,需要比較好的網(wǎng)絡(luò)通信編程知識(shí)绝骚。例如常見的tcp,又如非阻塞祠够,再如定時(shí)器压汪。事實(shí)上,skynet內(nèi)部使用了不同平臺(tái)的兩種IO模型古瓤,epoll模型和kqueue模型止剖。兩者模型,在2016年我曾經(jīng)用epoll編寫過一次服務(wù)器端應(yīng)用落君。
第三點(diǎn)穿香,lua知識(shí)。這里說(shuō)明的是绎速,lua知識(shí)不僅是lua的語(yǔ)法皮获,事實(shí)上lua語(yǔ)法是不夠的,還需要掌握c和lua的交互纹冤。我們都知道jni,c和java的相互調(diào)用和訪問行為洒宝,也清楚c/js,c/c#等等,事實(shí)上這些基礎(chǔ)對(duì)于了解skynet至關(guān)重要萌京。因?yàn)閟kynet在應(yīng)用中的邏輯層都是要求用lua實(shí)現(xiàn)雁歌,除非比較極端情況或者非常重要的場(chǎng)合,需要直接使用c編碼實(shí)現(xiàn)知残,應(yīng)用動(dòng)態(tài)庫(kù)so進(jìn)行鏈接靠瞎,否則一般情況使用lua即可。
閱讀源碼求妹,是一個(gè)過程乏盐,也是逐漸掌握框架或者應(yīng)用到一定級(jí)別需要走的路。我們閱讀源碼的最好效果是制恍,能夠獨(dú)立這種思維模式丑勤,去重新實(shí)現(xiàn)一套屬于自己需要的框架和引擎。如果并不是為了去掌握僅僅是追求欣賞和閱讀吧趣,個(gè)人以為閱讀skynet是一種享受法竞,原因是代碼量很少。核心代碼才幾千行强挫。另外岔霸,文件結(jié)構(gòu)比較清晰,很適合需要深入學(xué)習(xí)和提升c的閱讀俯渤。這里補(bǔ)充一下題外話:公眾號(hào)帶有(1)之類的呆细,后面的部分都會(huì)繼續(xù)編輯。由于每天只能發(fā)一篇八匠,所以很多文章的編輯都是在排期的絮爷,所以很多文章后面會(huì)一一推送趴酣。我非常感謝大家的關(guān)注和點(diǎn)贊。