摘要:腳本語言可以通過“黏合”構件模塊形成新的應用程序。通過分析“和欣”操作系統和CAR構件編程模型對面向構件編程的支持,提出了基于CAR構件系統的腳本語言通用適配層SCI,探討了一種腳本語言與CAR構件自動適配的技術,以實現基于CAR構件的腳本動態編程。結合CAR構件技術與腳本語言,提高應用程序的模塊化程度,加速應用程序的開發過程。
關鍵詞:面向構件編程;CAR;腳本語言;元數據
中圖法分類號:TP311.5文獻標識碼:A
文章編號:1001-3695(2007)01-0110-02
1引言
在面向構件的開發模型中,構件完成程序的主要功能和邏輯。大量耗時、性能重要或復雜的運算被封裝在構件內部,構件只需要暴露給外界簡單的接口以提供服務。在理論上,構件應該易于使用和更換,這就提高了應用開發的效率和擴展性。可是在已有的一些構件系統中,如.NET和Java,卻往往達不到這種效果。
其中一個原因,筆者認為是開發構件和使用構件采用同一種語言。構件開發語言往往是一些功能強大的通用語言,這就從本質上決定了這些語言的復雜性,從而增大了使用構件的難度,同時也容易混淆構件與外部應用的邊界,弱化了面向構件的編程思想。
腳本語言通常具有易學、易用和開發高效的特點,并且腳本語言是解釋執行,容易更改、不需要重新編譯,但是腳本語言一般功能較弱,不易擴充,有些腳本語言(如Perl,Ruby等)具有開發擴展庫的功能。但是這些擴展庫的開發方法不具有通用性。
“和欣”[1]設計的腳本語言通用適配層SCI (腳本可調用接口)的成功開發一定程度上解決了這個問題。利用構件程序集運行時[1,2](Component Assembly Runtime,CAR)構件中的元數據,動態調用CAR構件的方法。CAR構件的編寫人員不再需要考慮如何與不同的腳本語言適配,所有的工作都由腳本適配引擎通過SCI自動完成。
2“和欣”操作系統和CAR構件編程環境
“和欣”[1]操作系統是國家“863”計劃的“基于中間件技術的因特網嵌入式操作系統及跨操作系統中間件運行平臺”的重要成果,是一個基于構件的微內核現代操作系統。“和欣”操作系統與其他宏內核或微內核操作系統(如Linux[3],Mach[4]等)的最大區別就是將微內核模型與基于構件技術的充分結合,形成了“和欣”操作系統的靈活內核架構模型。
“和欣”操作系統是一個微內核操作系統。在微內核操作系統中,系統的一些服務,如文件系統、TCP/IP協議棧等是作為一個與用戶進程同等的進程為其他用戶進程提供服務。因此,在微內核操作系統中,一個主要的問題就是服務進程與應用程序進程間的通信問題。通常微內核操作系統(如Mach[4]和Minix[5])采用消息機制作為系統服務進程和用戶進程通信的手段。“和欣”操作系統則是采用了更加現代的面向構件編程技術。在面向構件編程技術中,不同進程甚至是不同主機之間的構件通信是一個基本問題。在應用領域中,也已經有了很多成熟的解決方案,如微軟公司的DCOM[6](分布式構件對象模型)和Java中經常使用的RMI(遠程方法調用)機制。“和欣”操作系統將構件的跨進程通信作為一個操作系統的基礎設施做到了內核之中。從語義上來說,構件的進程間通信與消息機制等價,但是,基于構件的通信技術更加符合現代程序設計技術和規范,使程序更容易模塊化、更健壯,而且構件更容易擴充和更換,實現靈活內核。
“和欣”操作系統中使用CAR[1,2]構件系統,CAR構件具有充分的自描述元數據,具體細節在下文介紹。這里只需要說明根據元數據系統能夠自動生成構件對象的代理對象和存根對象。構件跨進程的通信模式如圖 1所示。
其中服務構件S運行在進程A中,首先通過系統調用將服務構件注冊在系統中,此時系統中會生成一個S的存根對象。客戶進程B要使用進程A中的S服務,通過系統調用找到S的存根對象,并且在B中根據S的元數據生成與S具有同樣接口的代理對象。當客戶進程調用S的代理對象的方法時,代理對象將調用傳遞給S存根,存根在進程A中啟動一個線程,由該線程調用被請求的S的方法。為了優化這種情況,“和欣”操作系統內部給每一進程都附加了一個線程池。
CAR構件系統有兩個主要特征:①使用C++作為實現語言,具有較好的運行性能;②CAR構件具有充分的自描述元數據,系統能夠自動為CAR構件生成存根和代理對象。兩者的結合使CAR構件編程系統能夠作為系統開發的高性能中間件系統。
編寫CAR構件首先要編寫一個構件的接口描述文件——CAR文件。CAR文件是CAR構件的元數據的文本形式,它描述了CAR構件中的接口信息,以及接口中每個方法的信息,包括方法參數、返回值等,同時還描述了接口繼承體系的信息。
CAR文件經過編譯生成C++代碼框架、文檔框架和二進制的CAR構件元數據;使用C++語言實現CAR構件的具體功能;經過編譯和打包生成可發布的CAR構件程序集,其中包含了CAR構件的代碼、數據及自描述元數據。這個過程如圖 2所示。
3采用CAR構件的SCI編程模型
將腳本語言調用CAR構件以獲得服務這一要求進行抽象,設計出一個適配層,從而讓腳本語言與構件協同工作。
主要的接口稱為腳本可調用接口(Script Callable Interface,SCI),SCI本身也是用CAR構件編程技術實現的,結構如圖 3所示。
從圖3中可以看到,SCI的接口以CAR構件的數據類型和接口類型為基礎,設計出對構件方法調用的抽象,SCI的實現則以對應的元數據為基礎。這種結構一定程度上做到了設計與實現的分離。
SCI接口系統中有三個主要接口,它們的關系如圖 4所示。
(1)ISCIModule負責加載CAR構件,從CAR構件程序集中實例化構件對象,并使之與ISCIObject接口對象綁定。這個過程完成了CAR構件對象生命的初始化;接下來,對象生命周期的維護和實際方法調用工作由ISCIObject接口對象完成。
(2)ISCIObject接口主要有兩個方法:①方法GetMethodIndex通過內部CAR構件對象的元數據查找一個方法的索引,這個索引是該方法在對象虛函數表[7]中的位置。②方法Invoke接收這個索引值和一個參數數組,通過查找元數據得到實際對象方法的入口地址;接著由ISCIParameterNormalizer接口對象根據元數據完成參數類型的驗證和轉換工作;最后,使用一段特殊的匯編語言按照C++語言的約定[7]生成方法調用棧,跳轉到實際對象的方法,在方法返回后還要進行返回值的處理工作。當用戶釋放ISCIObject接口對象時,它會自動釋放內部的CAR構件對象。(3)ISCIParameterNormalizer接口是為了進行方法參數的類型驗證和轉換。實際工作中的腳本語言千差萬別,它們所支持的參數類型和CAR構件系統所支持的參數類型通常也不相同,因此本文提出了一個參數正規化的概念。參數正規化的過程主要是腳本語言的參數類型向CAR構件參數類型轉換的過程。腳本引擎通過實現ISCIParameterNormalizer接口注冊到ISCIObject接口對象中來完成參數正規化。調用CAR構件對象方法時,ISCIParameterNormalizer接口對象完成參數驗證和轉換工作,它的主要方法Normalize接收一個參數類型數組和參數值數組,輸出一個符合具體CAR構件方法的參數數組,或者通知ISCIObject接口對象無法轉換參數。如果轉換失敗,腳本引擎會將錯誤報告給用戶。
4SCI在JavaScript腳本語言中的應用
作為SCI的應用舉例,本文將在JavaScript[8]腳本語言中集成SCI。JavaScript腳本語言由Netspace公司發明,起初主要用于HTML動態編程,它是一種面向對象的腳本語言,其對象系統容易擴充。本文采用Mozilla瀏覽器項目中的SpiderMonkey[8]子項目對JavaScript語言的實現。
在JavasScript腳本語言中集成SCI,首先在JavaScript中添加全局對象Elastos(“和欣”操作系統的英文名稱),該全局對象提供了一些系統級的方法。比如CreateObject,該方法能夠通過CAR構件的統一標識符和接口名稱創建出一個CAR構件的實例,并且使該實例與SCI對象綁定。示例JavaScript源程序如下所示:
var aFoo=Elastos.CreateObject(\"www.elastos.com/example/Foo.dll\", \"IFoo\");
aFoo.Say(\"Hello, world!\");
其中,aFoo就是SCI對象在JavaScript中的表示。當調用aFoo的方法時,腳本引擎將該方法解析為ISCIObject的Invoke方法,從而完成了對底層CAR構件的動態調用。這樣,就實現了在JavaScript腳本語言中使用CAR構件來進行程序開發。
5結束語
SCI在本文完成時已經成功地應用到了“和欣”操作系統中的XMLGlue項目中,該項目結合XML,JavaScript和CAR構件技術在應用程序用戶界面開發中得到了大量應用。“和欣”操作系統是TDSCDMA中國人第一次擁有的重大通信國際標準的配套工程,將被用在3G手機中,通過本文的工作,將使更多的人可以通過構件的組成完成一個符合自己需要的應用程序,從而提高3G網絡的應用水平。
本文所述工作還有很多后續工作,充分利用“和欣”操作系統的能力等優化工作也在開展。本文基本上只實現了從腳本語言到CAR構件的調用,還沒有實現從CAR構件到腳本語言的逆向調用。實現逆向調用就可以讓用戶使用腳本語言進行簡單的邏輯處理供CAR構件回調,從而進一步簡化開發。
參考文獻:
[1]Koretide. Elastos 2.0 Operating System Manual[EB/OL]. http://www.koretide.com.cn, 20-04/200506.
[2]Koretide. CAR’s Manual[EB/OL]. http://www.koretide.com.cn, 20-04/200506.
[3]Daniel P Bovet, Marco Cesati. Understanding the Linux Kernel(2nd edition)[M]. Sebastopol:O’Reilly, 2002.2235.
[4]Linda R Walmer, Mary R Thompson. A Programmer’s Guide to the Mach System Calls[EB/OL]. http://www.cs.cmu.edu, 1988/200506.
[5]Andrew S Tanenbaum, Albert S Woodhull. Operating Systems Design and Implementation (2nd edition)[M]. Beijing:Publishing House of Electronics Industry, 1998.7074.
[6]Aiming Pan. COM’s Principle and COM’s Application[M]. Beijing:Tsinghua Press, 1999.302306.
[7]Stanley B Lippman. Inside the C++ Object Model[M]. Wuhan:Huazhong Science and Technology University Press, 2001.129231.
[8]Mozilla. JavaScript C Engine Embedder’s Guide[EB/OL]. http://developer.mozilla.org, 2005.
[9]John K Ousterhout. Scripting: Higher Level Programming for the 21st Century[EB/OL]. http://home.pacbell.net/ouster/scripting.html,1998.
作者簡介:
鄭錕(1981),男,新疆克拉瑪依人,碩士研究生,主要研究方向為系統軟件支撐技術;陳榕(1952),男,北京人,主任,科泰世紀科技有限公司首席科學家,主要研究方向為網絡操作系統、構件技術;顧偉楠(1946),男,江蘇無錫人,副主任,教授,主要研究方向為嵌入式操作系統。
注:本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文