摘 要: 和欣操作系統(tǒng)是基于CAR構(gòu)件技術(shù)" title="構(gòu)件技術(shù)">構(gòu)件技術(shù)、支持構(gòu)件化應(yīng)用的嵌入式操作系統(tǒng)" title="嵌入式操作系統(tǒng)">嵌入式操作系統(tǒng)。分析了當(dāng)前嵌入式應(yīng)用開發(fā)" title="應(yīng)用開發(fā)">應(yīng)用開發(fā)模式所存在的問題,提出了基于CAR構(gòu)件技術(shù)的腳本語言加CAR構(gòu)件的XML-Glue編程范式。它一方面充分利用了現(xiàn)有系統(tǒng)的特點(diǎn),另一方面采用腳本語言的強(qiáng)大功能使得開發(fā)更加簡單高效,并提供了對將來新興網(wǎng)絡(luò)業(yè)務(wù)" title="網(wǎng)絡(luò)業(yè)務(wù)">網(wǎng)絡(luò)業(yè)務(wù)應(yīng)用的必要的支持,將成為和欣嵌入式操作系統(tǒng)中更適合應(yīng)用開發(fā)的編程范式,進(jìn)而推動人們對構(gòu)件化編程思想的理解與應(yīng)用。
關(guān)鍵詞: 和欣操作系統(tǒng) 元數(shù)據(jù)" title="元數(shù)據(jù)">元數(shù)據(jù) CAR技術(shù) 腳本語言
面向構(gòu)件編程技術(shù)是從面向過程和面向?qū)ο缶幊碳夹g(shù)發(fā)展而來,它使得軟件工廠的理想成為可能。而隨著互聯(lián)網(wǎng)上新興網(wǎng)絡(luò)業(yè)務(wù)的逐漸興起,對傳統(tǒng)的軟件運(yùn)行方式提出了新的要求和挑戰(zhàn)。不論是采取面向過程、面向?qū)ο蟮拈_發(fā)應(yīng)用,還是采取面向構(gòu)件技術(shù)的開發(fā)應(yīng)用,一旦它們被安裝、固化到操作系統(tǒng)中,除了修改源代碼、重新編譯和重新安裝以外將不能對其進(jìn)行修改。在這樣的背景下,完全采用構(gòu)件技術(shù)的應(yīng)用開發(fā)將有如下幾個缺點(diǎn):
(1)如果一個應(yīng)用程序僅需要改變應(yīng)用的表現(xiàn)層(UI),而不需要大量修改構(gòu)件的功能,傳統(tǒng)開發(fā)模式所要經(jīng)過的修改-編譯-安裝-運(yùn)行的過程就顯得效率低下,開發(fā)周期長且不能隨需求靈活變化的弱點(diǎn)就會暴露出來。
(2)完全采用強(qiáng)類型語言(如C/C++等)實(shí)現(xiàn)功能構(gòu)件并將這些構(gòu)件組裝成應(yīng)用程序,造成了構(gòu)件之間強(qiáng)耦合的關(guān)系。雖然這些程序運(yùn)行效率比較高,但是會使得開發(fā)與維護(hù)的難度加大。
(3)在未來網(wǎng)絡(luò)無所不在的情況下,運(yùn)行在網(wǎng)絡(luò)中的嵌入式設(shè)備(如3G手機(jī))將要與運(yùn)營商所提供的服務(wù)經(jīng)常打交道,服務(wù)并不是一定要固化到用戶的手機(jī)中,而是有可能來自網(wǎng)絡(luò),現(xiàn)有技術(shù)并不能做到接收來自網(wǎng)絡(luò)的服務(wù)并在客戶機(jī)上自動運(yùn)行,從而很難滿足新興網(wǎng)絡(luò)業(yè)務(wù)的需求。
為了實(shí)現(xiàn)構(gòu)件間的松散耦合,提高開發(fā)維護(hù)的效率和適應(yīng)需求變化的能力并支持新興網(wǎng)絡(luò)業(yè)務(wù),有必要在應(yīng)用的開發(fā)中引入新的開發(fā)模式??紤]到腳本語言的語法簡單、功能強(qiáng)大、易學(xué)易用的特點(diǎn),本文基于CAR(Component Assembly Runtime)構(gòu)件技術(shù)[1],提出了新的XML[2]+CAR+其他腳本語言(JavaScript等)的XML-Glue編程范式,并應(yīng)用于和欣嵌入式操作系統(tǒng)中,實(shí)現(xiàn)了更為靈活的構(gòu)件組裝機(jī)制,這為將來在和欣平臺上的應(yīng)用開發(fā)提供了更加快速和靈活的編程范式。
1 CAR技術(shù)與和欣嵌入式操作系統(tǒng)
1.1 CAR技術(shù)
CAR是一個具有國內(nèi)自主知識產(chǎn)權(quán)的先進(jìn)的構(gòu)件系統(tǒng)。它規(guī)定了一組構(gòu)件間相互調(diào)用的標(biāo)準(zhǔn),使得二進(jìn)制構(gòu)件能夠自描述,能夠在運(yùn)行時動態(tài)鏈接,并且實(shí)現(xiàn)軟件的目標(biāo)代碼級的重用。其主要目的是從操作系統(tǒng)層面上引入構(gòu)件的概念,所有的服務(wù)均由構(gòu)件來提供,從而為網(wǎng)絡(luò)編程和Web Services提供強(qiáng)大的支持。
1.2 和欣嵌入式操作系統(tǒng)
和欣嵌入式操作系統(tǒng)(Elastos)是面向SOA(Service-Oriented Architecture)設(shè)計的,是一個采用CAR技術(shù)并基于構(gòu)件化軟件模型的系統(tǒng)。構(gòu)件化軟件設(shè)計思想貫穿于整個系統(tǒng)的設(shè)計和實(shí)現(xiàn),系統(tǒng)實(shí)現(xiàn)本身就是采用構(gòu)件模式。系統(tǒng)提供了構(gòu)件自動尋址、自動加載的機(jī)制,用戶不必知道調(diào)用的構(gòu)件是本地的還是來自于網(wǎng)上的,也就是說,構(gòu)件運(yùn)行環(huán)境對用戶透明。構(gòu)件化系統(tǒng)的實(shí)現(xiàn)使得操作系統(tǒng)本身具有高度的靈活性和可擴(kuò)展性。
2 XML-Glue編程范式
XML-Glue是和欣操作系統(tǒng)上的一個Rich Client應(yīng)用的MVC(Model-View-Controller,模型-視圖-控制器)編程范式,其核心思想是使用XML和其他腳本語言描述應(yīng)用,由CAR構(gòu)件封裝應(yīng)用的邏輯,然后由XMLGlue完成二者的組裝,形成一個完整的應(yīng)用。這個思想在桌面應(yīng)用中已經(jīng)得到了較廣的應(yīng)用,如Mozilla的XUL,Microsoft的XAML等。XML-Glue也為嵌入式操作系統(tǒng)提供了相應(yīng)的技術(shù)支持,為嵌入式應(yīng)用的開發(fā)注入了新的活力。
2.1 XML-Glue的特點(diǎn)
(1)采用符合W3C文法的XML標(biāo)記和多種腳本語言描述應(yīng)用。XML描述了整個應(yīng)用的架構(gòu)、構(gòu)件及構(gòu)件間的關(guān)系,而其他腳本語言則彌補(bǔ)了XML在描述邏輯上的缺陷,進(jìn)一步增強(qiáng)了運(yùn)行在客戶端的XML-Glue程序的表現(xiàn)力。
(2)設(shè)計了通用的構(gòu)件組裝機(jī)制。這一機(jī)制從理論上使任何可被擴(kuò)展的腳本語言可以實(shí)現(xiàn)對構(gòu)件的操作,從而使得這些腳本語言具有粘合構(gòu)件的能力。目前已經(jīng)采用這一機(jī)制實(shí)現(xiàn)了XML和JavaScript對構(gòu)件的粘合。
(3)XML-Glue支持MVC模型,如圖1所示。XML和其他腳本語言用來描述應(yīng)用(View),CAR構(gòu)件封裝應(yīng)用的邏輯(Model),然后由XMLGlue完成二者的組裝(Controller)。除了作為Model的CAR構(gòu)件是用強(qiáng)類型的C++語言編寫外,其余的View和Controller都可以用腳本編寫,簡化了開發(fā)的難度,提高了開發(fā)效率。

2.2 XML-Glue的實(shí)現(xiàn)
XML-Glue是基于CAR構(gòu)件技術(shù)發(fā)展起來的。它對外提供了XML-Glue應(yīng)用的運(yùn)行環(huán)境以及多種腳本語言,使開發(fā)人員能更方便、更快捷地開發(fā)應(yīng)用,對內(nèi)則在腳本語言和CAR構(gòu)件系統(tǒng)之間搭起了通信的橋梁,實(shí)現(xiàn)了以腳本方式完成構(gòu)件組裝。
2.2.1 XML-Glue的架構(gòu)
完整的XML-Glue架構(gòu)如圖2所示。

(1)最外層是XML-Glue運(yùn)行環(huán)境(Runtime),負(fù)責(zé)初始化和釋放XML-Glue應(yīng)用所需資源。
(2)內(nèi)部頂層是腳本語言及其配套設(shè)施。這一層相當(dāng)于提供了對MVC中View的支持。
XML/JavaScript/Other Scripts提供了多種描述XML-Glue應(yīng)用的形式,讓開發(fā)人員能夠靈活利用各種腳本語言。
Script Adapter是各個腳本語言中實(shí)現(xiàn)ISCIParameterNormalizer接口的構(gòu)件(稱為SCIParamConvertor)的總稱。這些構(gòu)件負(fù)責(zé)將其對應(yīng)腳本代碼中弱類型方法的參數(shù)轉(zhuǎn)換為CAR中的強(qiáng)類型方法的參數(shù),而在構(gòu)件方法返回的時候?qū)⒎祷刂捣庋b成腳本可識別的數(shù)據(jù)類型。
Error Interpreter是每種腳本語言中負(fù)責(zé)翻譯調(diào)用構(gòu)件方法的出錯信息的翻譯器的總稱,它將CAR中方法調(diào)用發(fā)生錯誤后返回的HRESULT值翻譯成文本,并以腳本語言特定的錯誤機(jī)制(如JavaScript中的異常)通知開發(fā)人員和使用人員。
(3)SCI(Script Callable Interface)是腳本語言與CAR構(gòu)件系統(tǒng)通信的橋梁。這一層相當(dāng)于提供了對MVC中Controller的支持,在下一節(jié)會詳細(xì)敘述。
(4)CAR構(gòu)件系統(tǒng)。它是服務(wù)的提供者。這一層相當(dāng)于提供了對MVC中Model的支持。
2.2.2 XML-Glue的構(gòu)件組裝機(jī)制的實(shí)現(xiàn)
Model由CAR構(gòu)件系統(tǒng)支持,View由腳本語言支持,作為Controller的構(gòu)件組裝則是XML-Glue的核心工作。XML-Glue利用腳本語言的眾多優(yōu)點(diǎn),實(shí)現(xiàn)了一種新的適合于嵌入式系統(tǒng)的構(gòu)件組裝機(jī)制,使得應(yīng)用開發(fā)方便快捷。XML-Glue中構(gòu)件組裝機(jī)制的實(shí)現(xiàn)過程如圖3所示。

(1)腳本發(fā)起調(diào)用;
(2)SCI通過SCIModule或者SCIObjectFactory獲取相應(yīng)的構(gòu)件模塊并創(chuàng)建腳本所請求的構(gòu)件實(shí)例,封裝成SCIObject;
(3)SCIObject使用Script Adapter進(jìn)行腳本弱類型參數(shù)向構(gòu)件強(qiáng)類型參數(shù)的轉(zhuǎn)換;
(4)SCIObject向?qū)嶋H的構(gòu)件實(shí)例發(fā)起調(diào)用請求;
(5)構(gòu)件實(shí)例的方法運(yùn)行結(jié)束并返回;
(6)SCIObject調(diào)用Script Adapter將返回值進(jìn)行相應(yīng)的封裝,提供給腳本語言;
(7)腳本語言通過Script Adapter獲取返回值,完成調(diào)用。
實(shí)現(xiàn)這一機(jī)制的關(guān)鍵是解決腳本與構(gòu)件間的交互問題。從圖3可以看出,SCI處于腳本語言與構(gòu)件系統(tǒng)之間,是腳本語言與構(gòu)件系統(tǒng)通信的橋梁。SCI最主要的功能是調(diào)用構(gòu)件類實(shí)例的成員方法,所以其主要工作除了封裝構(gòu)件類實(shí)例外,就是將腳本參數(shù)轉(zhuǎn)換為構(gòu)件參數(shù)。這一轉(zhuǎn)換過程是通過CAR構(gòu)件技術(shù)對元數(shù)據(jù)的支持來實(shí)現(xiàn)的。元數(shù)據(jù)中存放了描述所有類、接口、方法和參數(shù)的數(shù)據(jù)。通過對元數(shù)據(jù)的分析計算,SCI能夠找到所需接口方法的入口點(diǎn)以及參數(shù)信息,使得以腳本方式操作構(gòu)件成為可能。參數(shù)轉(zhuǎn)換過程大致分為如下三個步驟:
(1)由腳本語言引擎分析腳本從而獲得原始的參數(shù)。
(2)將腳本語言對應(yīng)的SCIParamConvertor作為參數(shù)傳遞給SCIObject的Invoke方法。在Invoke過程中,SCIObject根據(jù)內(nèi)部構(gòu)件實(shí)例方法的元數(shù)據(jù),調(diào)用SCIParamConvertor的Normalize方法向腳本語言提出轉(zhuǎn)換請求(如果在XML中只有字符型數(shù)據(jù)〈METHOD1 b="“100”/" a="“50”"〉,而構(gòu)件中方法的聲明為HRESULT Method1(int a,int b);則需要將“50”,“100”轉(zhuǎn)換成int類型)。SCIParamConvertor就根據(jù)元數(shù)據(jù)中描述的參數(shù)類型要求將腳本參數(shù)轉(zhuǎn)換成CAR中的強(qiáng)類型參數(shù)。這個階段稱為參數(shù)正規(guī)化。
(3)將正規(guī)化后的參數(shù)轉(zhuǎn)換為機(jī)器棧參數(shù)壓入堆棧,調(diào)用內(nèi)部構(gòu)件的目標(biāo)方法,完成方法調(diào)用。這一步依賴目標(biāo)編譯器的棧機(jī)制,對整個系統(tǒng)概念無影響,這里不做討論。
SCI由三個模塊組成,其描述如表1所示。

本文提出了一種基于面向構(gòu)件編程模型的XML-Glue編程范式,它將應(yīng)用的表現(xiàn)層和邏輯層分離開,服務(wù)提供商只需提供功能獨(dú)立的正確構(gòu)件,應(yīng)用開發(fā)人員就可以根據(jù)需求的變化快速更改構(gòu)件之間的關(guān)聯(lián)關(guān)系,從而降低了服務(wù)提供者和使用者的耦合程度,并且提供了對將來新興網(wǎng)絡(luò)業(yè)務(wù)應(yīng)用的必要的支持,將成為和欣嵌入式操作系統(tǒng)中更適合應(yīng)用開發(fā)的編程范式。從目前的實(shí)際運(yùn)行情況來看,XML-Glue基本上能夠支持各種應(yīng)用的開發(fā),下一階段的主要任務(wù)是提高XML-Glue對應(yīng)用的支撐能力,使其能夠支持更復(fù)雜的應(yīng)用開發(fā),并優(yōu)化XML-Glue的性能。
參考文獻(xiàn)
1 科泰世紀(jì).和欣1.1資料大全[EB/OL].http://www.koretide.com.cn/download/download.php?id=2
2 Didier Martin著,李 譯.XML高級編程[M].北京:機(jī)械工業(yè)出版社,2001
3 Munindar P Singh,Michael N Huhns.Service-Oriented Com-puting:Semantics,Processes,Agents[M].Wiley,2005
4 MVC[EB/OL].http://ootips.org/mvc-pattern.html
5 Andre Deienno Pansani.XUL and the building processe of a UI[EB/OL].http://luxor-xul.sourceforge.net/download/qatar.pdf
6 Brent Rector.Controls and XAML[EB/OL].http://msdn.mi-crosoft.com/library/default.asp?url=/library/en-us/dnintlong/html/longhornch03.asp
