淺論主流瀏覽器內核的技術發展
1 人贊了文章
最近,因為某「偽自主騙國家」瀏覽器事件的爆發,國產瀏覽器在短時候受到了前所未有的關注,以至於楊媽媽這個平時完全無視計算機技術發展的「家庭煮婦」也開始關注瀏覽器話題。就在楊爸爸開心地用自製腳本掛機刷王者混金幣的時候,突然收到楊媽媽的懿旨,要楊爸爸整一遍關於瀏覽器內核發展的科普介紹貼,以便讓楊小妹小朋友更好地掌握新時代計算機資訊,贏在起跑線上。楊爸爸一臉黑人問號臉看著十八個月大的楊小妹,「媽媽,你是認真的嗎?…………」。但是懿旨難為,所以楊爸爸只好努力爬貼。
如果拋開瀏覽器內核來聊瀏覽器,隨便水個100篇論文應該問題不大,不說國外,就說國內,各種「套殼」瀏覽器數不勝數,幾乎以日在增長。但如果從瀏覽器內核聊起,其實主流瀏覽器內核從誕生到現在,也就那麼幾款。
瀏覽器最重要或者說核心的部分是「Rendering Engine」,可大概譯為渲染引擎、排版引擎、解釋引擎,現在流行稱為瀏覽器內核[1]。它負責取得網頁的內容(HTML、XML、圖象等等)、整理信息(例如加入CSS等),以及計算網頁的顯示方式然後會輸出至顯示器或印表機。所有網頁瀏覽器、電子郵件客戶端以及其它需要編輯、顯示網路內容的應用程序都需要瀏覽器內核。瀏覽器內核決定了瀏覽器如何顯示網頁的內容以及頁面的格式信息。簡單點說,就是將網頁的代碼轉換為最終你看得見的頁面。
不同的瀏覽器內核對網頁編寫語法的解釋也有不同,因此同一網頁在不同瀏覽器內核的瀏覽器里的渲染(顯示)效果也可能不同,這也是網頁編寫者需要在不同瀏覽器內核的瀏覽器中測試網頁顯示效果的原因。
現有的幾款主流瀏覽器內核,因為這些瀏覽器內核都有其代表的瀏覽器,所以常常會把瀏覽器內核的名稱和瀏覽器的名稱混用,比如說IE內核、Firefox內核。其實這種表述不太準確,因為現在流行的主流瀏覽器不一定只有一個瀏覽器內核。同時,瀏覽器還有自己的界面框架和其它的功能支撐,而瀏覽器內核本身也不可能實現瀏覽器的所有功能(被無視的腳本引擎表示不服)。為了不造成概念混淆,下文會將瀏覽器內核的名稱和瀏覽器的名稱做一個區分,當然在科普瀏覽器內核的同時,我也會相應科普對應的瀏覽器。
一、Trident內核
Trident就是大名鼎鼎的IE瀏覽器所使用的內核,基本上像我這種中年油膩男子玩電腦的,瀏覽器都是從IE瀏覽器,也是從使用Trident內核開始(此次應該有膜拜,請順便上三支香)。
微軟爸爸的Trident內核在1997年的IE4中首次被採用,是在Mosaic代碼的基礎之上修改而來的,並沿用到IE11。由於在上個世紀末和本世紀初,特別是從Windows95年代一直到WIN7年代,微軟爸爸的Windows系統基本統治全世界,於是Trident內核通過IE瀏覽器藉助Windows的東風,基本處於「壟斷」地位。長期的一家獨大,以至於微軟爸爸很長時間都沒有更新Trident內核,這導致了兩個後果——一是Trident內核曾經幾乎與W3C標準脫節(2005年),二是Trident內核的大量Bug等安全性問題沒有得到及時解決。
由於當時IE6的市場份額最大,老的Trident內核(IE6及以前)一直是不遵循W3C標準的,是的,微軟爸爸就是這麼華麗的無視了W3C標準。你們想在微軟爸爸的瀏覽器里顯示你們的網頁,你們就得按爸爸的要求來。W3C國際標準?不存在的。後果就是大量的網頁專門為IE6等老Trident內核編寫,在IE6下顯示很正常,但其實這些網頁的代碼並不符合W3C標準,於是在其他遵照W3C標準的環境顯示出現偏差。而完全依據W3C標準寫的網頁在老Trident內核下面又出現偏差,這就是為什麼很多人覺得後來的IE9的網頁排版有時會亂了,而IE6則正常,其實不是瀏覽器兼容性差了,而是你訪問的網頁不符合新的標準。[2]
微軟爸爸成功引起了瀏覽器界的眾怒,一些致力於開源的開發者和一些學者們公開自己認為IE瀏覽器不安全的觀點,也有很多用戶轉向了其他瀏覽器,火狐瀏覽器(Mozilla Firefox)和歐朋瀏覽器(Netscape Navigator)就是這個時候興起的。非Trident內核瀏覽器的市場佔有率開始大幅提高。
由於市場佔有率受到嚴重打擊,微軟爸爸不得不服軟,開始升級自家的Trident內核,IE8(Trident4.0)、IE9(Trident5.0)、IE10(Trident6.0)。IE9所用的內核,相較之前的版本對W3C標準的支持增強了很多。
儘管IE瀏覽器的使用率不斷下降,但因為Windows系統依然在計算機操作系統市場有著超高的佔有率,也因為Trident內核的介面內核設計相當成熟,所以Trident內核依然是眾多瀏覽器的內核首選。
二、Gecko內核
在介紹Gecko內核前,要先介紹一家公司——網景[3]。網景是網景通信公司(Netscape Communications Corporation)的常用簡稱。網景通信公司曾經是一家美國的計算機服務公司,以其生產的同名網頁瀏覽器Netscape Navigator而聞名。
1994年12月15日,網景通信公司正式發布網景瀏覽器1.0——網景導航者(Netscape Navigator)。網景導航者以共享軟體的方式販賣,因為功能追加得很快,所以當時佔有率相當地高。經歷後續版本的用戶積累,網景成為瀏覽器市場佔有率的首位。
網景瀏覽器的崛起成功引起了微軟爸爸的注意,擔心網景可能威脅到微軟的操作系統和應用程序市場,微軟爸爸決定搞他……用金錢……額……不是,爸爸要以德服人……直接Windows操作系統捆綁IE瀏覽器……一頓猛如虎的操作後,網景只能GG了。
1998年1月,網景與微軟IE瀏覽器競爭失利以後,為了挽回市場,公布旗下所有軟體以後的版本皆為免費,並開放網景通信家(Netscape Communicator)4.0的源代碼,成立了非正式組織Mozilla(謀智)。Mozilla項目啟動,最終Mozilla組織開發出了在功能和穩定性上更出色的新一代網路應用軟體套裝「Mozilla Application Suite」,它所採用的新瀏覽器內核最後被網景市場部門命名為「Gecko」。嗯,這就是Gecko內核了。
然後呢?然後……當然是該跪還是得跪了……儘管在反壟斷訴訟中,網景得到了7.5億美元賠償。但2003年7月15日網景公司被解散,大部分程序員被解僱,網景的標誌也從辦公大樓中去除。而Mozilla基金會(Mozilla Foundation)亦在當天成立。2008年3月1日網景瀏覽器停止安全更新和所有的技術支持。這就意味著於1994年問世的網景將正式退出歷史舞台。
網景雖然跪了,不過Gecko內核沒跪。Mozilla基金會(Mozilla Foundation)成立後,吸收了部分原網景的員工,繼續用Gecko內核開發出了超著名的火狐瀏覽器(Mozilla Firefox),到今天依然有超級多人使用。
Gecko內核的特點是開放源代碼、C++編寫和跨平台。是滴,Gecko是跨平台的,它不像Trident內核基本只在Windows系統里用,Gecko在Linux和Mac、OS、Unix等主要操作系統上都毫無障礙,這也是它成為互聯網時代中最流行瀏覽器內核之一的原因,其流行程度僅次於Trident。
三、KHTML內核
當我打到KHTML的時候,楊媽媽在背後傳來一聲怒吼,為什麼不介紹蘋果家的WebKit和谷歌家的Blink,KHTML是什麼鬼?老婆,你聽我解釋,放下那把40米的大刀,有話好好說。
KHTML[4],是HTML網頁渲染引擎之一,由KDE所開發。KDE系統自KDE2版起,在文檔及網頁瀏覽器中使用了KHTML內核。
KDE[5],K桌面環境(K Desktop Environment)的縮寫。一種著名的運行於Linux、Unix以及FreeBSD等操作系統上的自由圖形桌面環境,整個系統採用的都是挪威TrollTech公司所開發的Qt程序庫(現在屬於Digia公司)。
基於KDE的KHTML內核以C++編程語言編寫,支持大多數網頁瀏覽標準。最大的特點就是開放源代碼,完全自由和開放,任何人都可以修改它的源代碼。而且完全免費,沒錯,免費!免費就是最大的優勢。當年某流氓軟體就是用免費二字毀掉了中國的收費殺毒軟體市場。
蘋果家的WebKit內核。蘋果電腦於2002年採納了KHTML內核,作為開發Safari瀏覽器之用,並發布所修改的最新及歷史版本源代碼。後來發表了開放源代碼的WebCore及WebKit內核[6],它們均是KHTML的衍生產品。當年蘋果比較了Gecko和KHTML後,選擇了後者,就因為它擁有更清晰的源碼結構和極快的渲染(顯示)速度。WebKit內核迅速成為主流瀏覽器內核之一。
谷歌家的Blink內核。谷歌家的瀏覽器Chrome/Chromium從創建以來一直使用WebKit(WebCore)內核作為瀏覽器內核。直到2010年WebKit2面世,由於WebKit2的進程隔離在一定程度上與谷歌瀏覽器自家的沙箱設計存在衝突,故谷歌瀏覽器一直停留在WebKit,使用Backport(將一個軟體的補丁應用到比此補丁所對應的版本更老的版本的行為)的方式實現和主線WebKit2的兼容。顯而易見這增加了WebKit和谷歌瀏覽器的複雜性,且在一定程度上影響了谷歌瀏覽器的架構移植工作。於是,2013年4月,谷歌開始基於WebKit構建自己的Blink內核。Blink內核也伴隨著谷歌家逐漸成為主流的瀏覽器內核之一。
最後是已經涼涼、被廢棄的歐朋家的Presto內核。2003年歐朋在它家的瀏覽器Opera7中首次使用新開發的Presto內核,該內核的特點就是渲染速度的優化達到了極致,然而代價是犧牲了網頁的兼容性。由於一直無法成為業界主流,2013初,歐朋家宣布放棄Presto內核,跟隨谷歌瀏覽器改用WebKit內核。隨後,谷歌啟用Blink內核,歐朋家也立刻發布博客公告切換至Blink內核。
以上就是現在主流的4大瀏覽器內核:Trident、Gecko、WebKit和Blink的基本發展史。
開發瀏覽器內核不是一件簡單的事情,瀏覽器研發是一個系統工程,瀏覽器的各個組件研發難度似乎都不大,但組合成一個系統的時候,難度就會劇增。特別是時刻面臨著承載網頁不確定性的挑戰。雖然標準還在,但是很難扛住無限種可能。而無限可能帶來的另外一個問題是:你在解決一個新的可能時,你怎麼知道沒有搞掛另外一個已經解決過的可能呢?歐朋家因為做得早,積累了非常多的回歸測試。在放棄掉presto內核的時候,大概14萬個測試用例,有一個伺服器集群每天晚上都跑。新的提交要是出現了回歸,集群馬上把報告用郵件自動發給提交者。[7]
上述主流4大瀏覽器內核的開發主要來源於美國和挪威兩個國家。美國有資本優勢,而且對全世界的計算機行業有無可替代的影響力,能用充裕的資本聚集足夠多和尖端的技術人才進行技術開發。同時,微軟爸爸的Trident內核有無可匹敵的先發優勢(完全沒有被提到的微軟家Tasman內核)。網景家雖然已經GG,但作為曾經的瀏覽器界老大,Gecko內核依然有其優勢。特別是網景家還創建了廣為使用的JavaScript語言(腳本得到了唯一的出場機會)。
而挪威有標準影響力。Blink、Presto、WebKit都源自於KHTML。KTHML內核屬於KDE的一部分,而KDE基於的QT,是挪威Trolltech公司開發的。即便是廢棄Presto內核的歐朋家,它家辦公樓與Trolltech公司是上下樓,一個在四樓,一個在五樓。同時,歐朋家的CTO Haakon Wium Lie是個挪威人,他發明了CSS,在W3C標準中的影響力非常大。
所以一般的公司乃至國家不一定有足夠把握開發瀏覽器內核,很有可能,在你投入大量的資金和技術資源後,還沒來得及推廣便已被市場拋棄。沒有足夠把握開發瀏覽器內核,但基於商業和其他目的又要推出自家的瀏覽器,以便更好地佔領市場,目前,瀏覽器界普遍的做法就是套殼。所謂套殼,就是基於上述瀏覽器內核進行二次開發,這類瀏覽器產品,通常也會在產品推介中標註是基於哪種內核開發。一些號稱「雙核」甚至是「多核」瀏覽器其實就是同時兼容了不同的瀏覽器內核。比如,其中一個內核是Trident,然後再增加一個其他內核。國內的廠商一般把其他內核叫做「高速瀏覽模式」,而Trident則是「兼容瀏覽模式」,用戶可以來回切換。比如某流氓家的瀏覽器(1.0-5.0為Trident,6.0為Trident+Webkit,7.0為Trident+Blink),金山家瀏覽器(1.0-4.2版本為Trident+Webkit,4.3及以後版本為Trident+Blink)。
那個號稱「打破美國壟斷,中國首個自助創新智能瀏覽器內核」的為什麼成功引起眾怒?就在於你套殼就套殼,反正大家都這麼干,你非得商業自吹,吹自主創新新內核,吹民族自豪感……你哪民族啊?我讓你代表了么?別玷污我民族行么?我大中華民族沒你這麼噁心的後人好么?……將莫須有的套殼內核硬說成新內核與上述四大瀏覽器內核並列。你哪來的勇氣?梁靜茹么?
1000萬行代碼?好厲害啊,好多啊,比當年穀歌家刪除的WebKit2兼容代碼多那麼多(此處是反諷),這是水的一B的瀏覽器皮膚代碼吧……為了兼容Windows XP還用個49版本的,這技術水平也太次了點……2.5個億?抹掉前面的2,讓流氓家給你套殼個,還能整個69版本的XP兼容版。
投資人和客戶是何其無辜遇到這麼個不是東西的東西。不行,太噁心了,我有些想吐,寫不下去了,我先去個廁所,下次再聊。
參考資料
- 瀏覽器內核(百度百科)
- 關於瀏覽器內核的一些小知識,明明白白選瀏覽器!(作者為武漢小獅子)
- netscape(百度百科)
- KHTML(百度百科)
- KDE(百度百科)
- webkit(百度百科)
- 自主研發一款瀏覽器內核的難度到底有多大?(知乎,羅志宇)
推薦閱讀:
※怎麼去轉換任何系統調用為一個事件:對 eBPF 內核探針的介紹
※紅芯瀏覽器被深扒,我們是否真的需要一個自主的瀏覽器內核?