小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

chrome源碼學(xué)習(xí)之知識(shí)體系指南

 just_person 2013-04-16

google chrome瀏覽器的源代碼是非常龐大的,為了較快的進(jìn)入學(xué)習(xí)狀態(tài),有必要事先對(duì)一些知識(shí)點(diǎn)進(jìn)行說(shuō)明,這里不是要詳細(xì)說(shuō)明里面的細(xì)節(jié),而是從概念層次闡明一些注意事項(xiàng)。這里談到的東西也不一定說(shuō)非要事先把這些東西搞得很明白才能去學(xué)習(xí)源代碼,主要還是先給大家一個(gè)心理準(zhǔn)備。當(dāng)然如果你最終要在細(xì)粒度的層次掌握源代碼細(xì)節(jié),那么這些知識(shí)點(diǎn)必須非常清楚,不過(guò)這可以結(jié)合源代碼的時(shí)候再針對(duì)性的來(lái)澄清這些知識(shí)點(diǎn)。

由于chrome源代碼包含方方面面的技術(shù)非常之多,根據(jù)個(gè)人喜好可能針對(duì)性的對(duì)某些技術(shù)感興趣,那么可以針對(duì)性的進(jìn)行學(xué)習(xí)。大的原則是理論和實(shí)踐相結(jié)合,chrome包含的代碼就是各種規(guī)范、理論的具體實(shí)踐實(shí)現(xiàn)。

基礎(chǔ)知識(shí)

基礎(chǔ)知識(shí)是任何技術(shù)方面都應(yīng)該掌握的領(lǐng)域無(wú)關(guān)的通用知識(shí)。我認(rèn)為主要包括“語(yǔ)言基礎(chǔ)”和“系統(tǒng)基礎(chǔ)”兩大類。

語(yǔ)言基礎(chǔ)知識(shí)

整個(gè)chrome源代碼包括webkit內(nèi)核、v8引擎全部用c++語(yǔ)言編寫(xiě)。那么作為語(yǔ)言基礎(chǔ)的c++語(yǔ)言就必須是精通的水平才可能流暢的看明白里面的代碼。我一直認(rèn)為c++是有史以來(lái)最復(fù)雜的語(yǔ)言(可參考孟巖文章關(guān)于C++復(fù)雜性的零碎思考),是典型的魔幻語(yǔ)言,我曾經(jīng)也癡迷去深究c++一些高級(jí)技巧,后來(lái)某天突然發(fā)現(xiàn)這種深究、這種玩法除了增加理解上的復(fù)雜性,對(duì)實(shí)際問(wèn)題似乎并沒(méi)有帶來(lái)任何好處。后來(lái)看到一篇文章(請(qǐng)看孟巖文章Ruby 1.9不會(huì)殺死Python),才明白原來(lái)自己的性格是喜歡簡(jiǎn)約風(fēng)格的語(yǔ)言,從此不再去鉆牛角尖玩語(yǔ)言技巧。對(duì)于語(yǔ)言問(wèn)題每個(gè)人都有自己的看法和偏好,但顯然,不喜歡歸不喜歡,但在現(xiàn)實(shí)中,我們有時(shí)候又必須去面對(duì)我們不太喜歡的東西(當(dāng)然并不是說(shuō)我討厭c++),拿語(yǔ)言來(lái)說(shuō),這種情況下對(duì)于喜歡簡(jiǎn)約風(fēng)格的程序員最理智的辦法就是以一種簡(jiǎn)約的方法去使用復(fù)雜的c++。千萬(wàn)不要在實(shí)際應(yīng)用中為了技巧而技巧,這樣會(huì)非常丑陋?jiǎng)e扭,因?yàn)槟愀緵](méi)有真正明白什么時(shí)候該合理的使用這些技巧。好在chrome源代碼里面的c++語(yǔ)言技巧絕不是為了故弄玄虛,在chrome里面作者們?yōu)槲覀冋故玖巳绾吻〉胶锰幍氖褂眠@些技巧來(lái)解決實(shí)際問(wèn)題,如果你曾經(jīng)困惑過(guò)c++里面一些技巧究竟有何實(shí)際用途,或者對(duì)這些技巧理解不深,那么在chrome里可以找到很好的答案。扯得有點(diǎn)遠(yuǎn)了,現(xiàn)在還是總結(jié)一下chrome里面關(guān)于c++語(yǔ)言層面的一些知識(shí)點(diǎn)。

STL:標(biāo)準(zhǔn)庫(kù)的使用,這個(gè)很基本,沒(méi)有什么好說(shuō)的。

C++對(duì)象生命周期管理技術(shù):這可以說(shuō)是c++應(yīng)用開(kāi)發(fā)中永遠(yuǎn)的痛,很多的內(nèi)存訪問(wèn)錯(cuò)誤與此有關(guān)。對(duì)于簡(jiǎn)單的過(guò)程化應(yīng)用,我們可以很簡(jiǎn)單的遵循誰(shuí)分配對(duì)象誰(shuí)就負(fù)責(zé)釋放對(duì)象的原則。但在大型應(yīng)用中,對(duì)象生命周期的管理變得非常的復(fù)雜,不可能簡(jiǎn)單的遵循誰(shuí)分配誰(shuí)釋放原則,這在chrome這樣的大型項(xiàng)目中表現(xiàn)極其突出。在chrome中,對(duì)象的出生、生活、死亡經(jīng)常在不同的上下文線程中完成。在chrome中主要采用了基于引用計(jì)數(shù)原理來(lái)管理對(duì)象生命周期,同時(shí)有針對(duì)不同場(chǎng)合的變體。另外還有類似智能指針這樣的方案。如果你要將對(duì)chrome代碼做改造為我所用,對(duì)象的生死問(wèn)題必須小心對(duì)待。

模板特化(Template Specialization):c++里面所謂的一些高級(jí)特性總是離不開(kāi)模板的,也正是模板的引入讓c++變得非常復(fù)雜。模板特化在chrome的ipc通信體系中,對(duì)參數(shù)進(jìn)行序列化的時(shí)候用到了這個(gè)特性。

C++ 元組(Tuple)實(shí)現(xiàn)技術(shù):也是通過(guò)模板技術(shù)來(lái)實(shí)現(xiàn)。

類型萃取技術(shù)(Traits):c++泛型編程的重要技術(shù)之一。

宏技巧:在消息映射實(shí)現(xiàn)部分,用到了一個(gè)很有意思的手法,定義一次宏,展開(kāi)多段代碼,同時(shí)完成了消息ID枚舉值定義和消息類的定義。

類成員函數(shù)指針:相對(duì)于模板,這個(gè)容易理解多了。

以上關(guān)于STL、模板相關(guān)的一些知識(shí)可以參考《STL源碼剖析》和《C++設(shè)計(jì)新思維》,我認(rèn)為把這兩本書(shū)看明白了,C++水平可以配稱“精通”了。另外我可以負(fù)責(zé)的說(shuō),把chrome里面涉及到的c++語(yǔ)言層面的東西都能徹底明白,那么c++水平也足夠用了。

系統(tǒng)基礎(chǔ)知識(shí)

這里主要指的是操作系統(tǒng)基礎(chǔ)知識(shí),chrome瀏覽器作為跨平臺(tái)瀏覽器,在linux、windows、mac os上均有對(duì)應(yīng)的實(shí)現(xiàn)版本。對(duì)于很多標(biāo)準(zhǔn)性的、通用性的操作系統(tǒng)特性,chrome提供了抽象接口,具體在不同的操作系統(tǒng)上對(duì)應(yīng)有不同的實(shí)現(xiàn)。我這里以windows為例,值得關(guān)注的知識(shí)點(diǎn)包括:

進(jìn)程、線程概念:chrome是多進(jìn)程體系結(jié)構(gòu),多線程就不用說(shuō)了,必定是多線程。那么要深刻理解這樣的體系結(jié)構(gòu),就需要對(duì)操作系統(tǒng)進(jìn)程、線程概念非常清楚。

線程同步:多線程如何同步的問(wèn)題。

線程本地存儲(chǔ)(TLS):利用TLS存儲(chǔ)線程私有數(shù)據(jù)。

Windows內(nèi)核對(duì)象:包括事件對(duì)象、互斥體等內(nèi)核對(duì)象用于線程同步。

進(jìn)程IPC:多進(jìn)程結(jié)構(gòu)就必定涉及到進(jìn)程如何通信的問(wèn)題,這就是操作系統(tǒng)提供的IPC機(jī)制。在chrome的windows版本中采用的是“命名管道”來(lái)作為IPC通信基礎(chǔ)。

共享內(nèi)存:為了減少進(jìn)程之間的大數(shù)據(jù)傳遞,采用共享內(nèi)存技術(shù)來(lái)減少數(shù)據(jù)搬動(dòng)開(kāi)銷。

完成端口:Windows操作系統(tǒng)高效的異步IO模型,chrome中線程消息循環(huán)使用了完成端口。

Socket IO 模型:http客戶端協(xié)議實(shí)現(xiàn)采用的socket io模型包括重疊io和事件選擇。

定時(shí)器:很多任務(wù)采用操作系統(tǒng)提供的定時(shí)器API來(lái)完成。

操作系統(tǒng)異常機(jī)制:對(duì)異常的掛接處理,需利用操作系統(tǒng)提供的相關(guān)api來(lái)進(jìn)行。

UI交互機(jī)制:chrome最終是要展示很多native UI的,在windows中,chrome采用skia圖形庫(kù)結(jié)合操作系統(tǒng)消息機(jī)制自己封裝了一套界面元素。

關(guān)于操作系統(tǒng)相關(guān)的基礎(chǔ)知識(shí),可以參考《Windows核心編程》和《Win32 多線程程序設(shè)計(jì)》。

設(shè)計(jì)模式知識(shí)

設(shè)計(jì)模式是編寫(xiě)高質(zhì)量、高擴(kuò)展性代碼的基礎(chǔ),chrome代碼中主要用到了下列一些設(shè)計(jì)模式:

工廠模式

觀察者模式

單件模式

命令模式

代理模式

適配器模式

委托模式

關(guān)于設(shè)計(jì)模式方面的書(shū)籍,首推當(dāng)然是“四人幫”的《設(shè)計(jì)模式-可復(fù)用面向?qū)ο筌浖幕A(chǔ)》,此書(shū)非常的精練,內(nèi)容就難免有些抽象。所以并不適合初學(xué)者,要通俗生動(dòng)一點(diǎn)的可以參考《head first 設(shè)計(jì)模式》,該書(shū)也非常不錯(cuò)。

領(lǐng)域知識(shí)

作為web瀏覽器,其領(lǐng)域知識(shí)當(dāng)然是w3c標(biāo)準(zhǔn)了。要深刻理解webkit的實(shí)現(xiàn),必然要對(duì)相關(guān)規(guī)范有所了解。

HTML4/HTML5規(guī)范

CSS2/CSS3規(guī)范

DOM2/DOM3規(guī)范

JavaScript語(yǔ)言規(guī)范

HTTP協(xié)議規(guī)范

以上是整個(gè)web瀏覽器所涉及到的最核心的幾個(gè)方面的規(guī)范標(biāo)準(zhǔn),當(dāng)然里面還有更多的外圍相關(guān)標(biāo)準(zhǔn)。這些規(guī)范直接閱讀w3c標(biāo)準(zhǔn)是比較抽象枯燥的,好在這些領(lǐng)域知識(shí)所涉及到的相關(guān)技術(shù)資料已經(jīng)非常豐富了??梢詮膚eb前端應(yīng)用開(kāi)發(fā)層著手,結(jié)合webkit代碼、規(guī)范文件來(lái)理解這些規(guī)范。

除了上述webcore相關(guān)領(lǐng)域知識(shí)外,還有一些基礎(chǔ)設(shè)施領(lǐng)域,包括:

圖形領(lǐng)域知識(shí):chrome采用的是skia圖形引擎作的頁(yè)面渲染,如果對(duì)skia比較有興趣,這是很好的學(xué)習(xí)材料,但前提最好是有圖形學(xué)基礎(chǔ)理論知識(shí)。

數(shù)據(jù)庫(kù)領(lǐng)域:chrome對(duì)cookie的管理,采用的是sqlite開(kāi)源數(shù)據(jù)庫(kù),如果對(duì)數(shù)據(jù)庫(kù)技術(shù)感興趣,可以學(xué)習(xí)。

數(shù)據(jù)壓縮技術(shù):zlib這樣的基礎(chǔ)庫(kù)。

圖片解碼:jpeg、png等圖片格式解碼。

XML解析:expat

分布式數(shù)據(jù)序列化:protobuf2庫(kù),該庫(kù)是google比較核心的一個(gè)基礎(chǔ)技術(shù),它是基于二進(jìn)制的。很好的平衡了對(duì)象化和效率之間的取舍。

多媒體技術(shù):網(wǎng)頁(yè)上的音頻視頻處理。

安全技術(shù):SSL,加密解密、數(shù)字簽名。這些都可以在里面找到相關(guān)的學(xué)習(xí)材料。

UI框架:chrome的ui元素是采用了單獨(dú)的一個(gè)view庫(kù)來(lái)封裝不同操作系統(tǒng)下的ui機(jī)制,如果對(duì)ui交互框架感興趣,可以重點(diǎn)關(guān)注view庫(kù)的實(shí)現(xiàn)代碼。

字符串處理(UNICODE)/國(guó)際化:這部分的技術(shù)主要是利用非常強(qiáng)大的icu庫(kù)來(lái)支撐的。

CRT運(yùn)行庫(kù)的內(nèi)存管理技術(shù):采用了tcmalloc庫(kù)來(lái)替換系統(tǒng)提供的內(nèi)存管理crt庫(kù),大大提供內(nèi)存管理的效率和速度。

對(duì)于上述工具性基礎(chǔ)設(shè)施,我想作為應(yīng)用整合者,更多的可能是從各個(gè)庫(kù)的API層面入手,先在使用層面達(dá)到很熟練的程度,這樣可以方便的為自己的實(shí)際項(xiàng)目服務(wù)。至于內(nèi)部實(shí)現(xiàn)細(xì)節(jié)我想有興趣去深究的人不會(huì)很多。

總結(jié)

上面只是一個(gè)對(duì)chrome源代碼知識(shí)內(nèi)容很初步很粗的簡(jiǎn)單的羅列,目的是從概念層次上先有個(gè)簡(jiǎn)單的了解。具體細(xì)節(jié)里面當(dāng)然是非常之多。具體情況請(qǐng)根據(jù)自身的需要結(jié)合源代碼選擇性、針對(duì)性的進(jìn)行學(xué)習(xí)。至于我的重點(diǎn)可能包括chrome體系結(jié)構(gòu)、webkit內(nèi)核、工具庫(kù)中的protobuf2這幾部分內(nèi)容。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多