Firefox OS之系統簡介(一)

rony2012發表於2012-09-12

      Firefox OS,也即B2G系統。B2G是“Boot To Gecko”的縮寫,是Mozilla公司基於Web標準開發的完全開放的移動作業系統,從系統本身到應用程式完全由HTML5、CSS和JS來寫的。這裡要提一句,基於Web標準和必須要聯網之間並非充要關係。 比如我們在使用瀏覽器的截圖外掛、Readability外掛、憤怒的小鳥、植物大戰殭屍等應用和遊戲的時候,並不需要聯網。主要由3個部分組成,UI部 分叫做Gaia,名字出自希臘語“大地”,也被稱作“萬物之母”;採用Mozilla引以為豪的Gecko引擎,Gecko就是上圖中那隻眼睛大大長的很 萌的綠色小蜥蜴;底層部分叫做Gonk,名字來自一種在60年代盛行美國的毛絨玩具。

 Mozilla與MWC 2012上宣佈正式和西班牙電信聯手,有望今年下半年推出首款B2G手機。B2G將採用linux核心和部分Android技術,B2G目前已經被移植到了GalaxyS IINexusS 4GAndroid手機上。

Firefox的橫空出世在很多人的意料之外,其體積小巧功能強大,在安全性、擴充套件性和可移植性上都有驚人的表現。

     瀏覽器的複雜度可以和作業系統相提並論,mozilla有數百萬行的C++程式碼。這樣複雜的軟體,其中到底使用了那些祕技呢?其實,好的設計總是遵循一些眾所周知的設計準則,套句俗語說,差的設計千差萬別,好的設計都一個樣。Mozilla當然也是遵循了這些設計準則,不過,在實現方法上卻有很多創新之處,讓人驚歎不已。

本文以Mozilla的Firefox設計準則來分析Mozilla的架構設計:

1. 分離介面和實現

      我們知道,使用者介面是最容易變化的,也是最難於自動測試的。應用程式開發者根據系統提供的API自己組織簡單的邏輯關係來實現不同的應用功能,這就需要分離使用者介面和內部邏輯設計。在這一方面,mozilla算是非常前衛了:用標記語言(XUL)開發介面,用程式語言來實現(C++)內部邏輯,再用指令碼語言(javascript)把兩者膠合起來。XUL的介面描述能力,javascript的簡潔性和C++的效能完美的結合在一起了,mozilla把三者的長處發揮到了極致。它們的關係如下圖所示:

      

XUL這是一種用XML來描述使用者介面的語言。用XML描述使用者介面已經不是什麼新鮮事了,像QtdesignerGlade都是用XML檔案格式來存放使用者介面描述的,但它們都只是純粹的介面描述。而XUL同時描述了事件處理、風格(style)和字串國際化等資訊,可以直接被mozillalayout引擎解析執行。

XBL這種稱為擴充套件繫結語言(ExtensibleBindingLanguage)的東東也是mozilla的一大特色,現在已經被W3C作為標準了。作為程式設計師,我們都知道公共函式庫的重要性,公共函式庫可以反覆重用,從而提高開發效率。在開發使用者介面時,也會遇到同樣的問題,很多介面都比較類似,拷貝/貼上當然很容易,但以後維護起來就麻煩了。而XUL並沒有提供重用機制,XBL剛好彌補了它的不足。在XUL中可以只描述具有共性的部分,而由XBL對它進行擴充套件。XBL的功能強大,自身也有組合和繼承機制,這大大提高了可重用性。

CSS我們知道CascadingStyleSheets在網頁中已經應用多年了,而在瀏覽器本身實現中使用倒是很少聽說。這也沒有什麼奇怪的,像GTK+中的RCCSS功能都差不多,也就是說GNOME應用程式一直都在使用類似於CSS的東西。有了CSS,把應用程式的介面視感(lookandfeel)與功能獨立開來,讓兩者可以獨立變化,這是非常自然的事了。不過CSS在這裡,除了可以修改介面風格外,還可以把XBLXUL關連起來,以完成對XUL的擴充套件。

DTD(Document Type Definition)常用來定義標記(MarkupLangugae)語言的語法,功能上與BNF是等價的。不過它在這裡,不是為了定義某種語言的語法,而是完成字串的本地化,只是借了DTD中的實體(Entity)展開機制罷了。這看起來有些大材小用,不過在XML中使用DTD實體來替換要翻譯的字串,沒有比這更好的辦法了。

propertyXUL中用DTD來做字串本地化,雖然是妙著一招,可是在javascript裡它就沒有用武之地了。這回該輪到property上場了,在nsIStringBundle介面的幫助下,javascript可以方便的從property檔案中取到所要的字串。

JavascriptXPConnect的支援下,Javascript也可以用來開發COM元件,可以實現任何功能。不過膠合使用者介面(XUL)和內部邏輯才是它最拿手的好戲。當然,其中文件物件模型(DOM)起了非常關鍵的作用,Javascript通過文件物件模型(DOM)來操作XUL中的元素。

相關文章