葛光富,吳凱迪,韋 濤
(中國電子科技集團公司第二十八研究所,南京 210007)
隨著計算機領域的迅猛發展,不斷提高的軟件規模及其復雜性,導致愈加暴露的軟件危機[1],提高軟件生產效率成了軟件有關產業的當務之急.這使得軟件的復用性得到了越來越多的關注,因為通過軟件復用,可以很明顯地提高軟件開發的效率和質量,軟件系統的開發不必完全的從零開始,而是可以利用一些已有的部分進行拼裝[2].構件化軟件集成是一種可高效復用軟件、解決軟件危機、提高軟件生產效率、增加軟件的開放性和對外部擾動適應性的主要途徑,它將軟件項目從一個以代碼編寫和錯誤修正為中心的過程變為一個更為受控的集成過程,軟件的升級變為了替換具有良好邊界的軟件功能單元的過程.
利用軟件構件化進行軟件集成,人們在21 世紀初以來就開展了研究探索和實踐,提出了有關的框架設計與思路方法[3–16],但這些方法是針對VxWorks、Windows等某特定單一系統平臺進行的淺適應性構件化軟件集成研究,而未對面向異構多平臺環境可復用的構件化軟件集成通用方法進行深入性的研究.而在軍民用市場上,尤其是陸軍領域,有著大量的計算處理設備用于搭建各型電子與信息系統.這些設備卻部署著種類多樣、復雜不一的操作系統運行環境,其中嵌入式裝備尤為突出,如車載終端的VxWorks、ReWorks 等,便攜終端的Android、WinCE、AOS、SyberOS 等.這些都無形中增加了項目軟件研制開發集成的復雜性.因此,為支撐業務系統快速改造組裝、降低項目遷移改造風險、提升應用軟件系統質量,構建跨平臺運用于這些異構環境的軟件構件集成技術,成為電子與信息系統軟件服務平臺統籌規劃中的必要考慮因素.
面向異構環境進行軟件構件集成方法的通用化研究,工程實踐中如在VxWorks 系統上有較為成熟運用的基于以函數形式規范定義構件操作接口來進而完成軟件的構件化集成組裝方法,該方法按照集成規范約定構件可被集成調度用的構件初始化、啟用、操作響應等接口的函數名稱、參數等形式,之后在軟件運行時通過查找系統符號表來獲取構件接口函數用以執行完成對應構件的初始化、啟用、操作響應等,實現軟件的構件化集成與功能調度.故該方法僅適用于于能夠提供名稱查找執行函數的操作系統,而不能適用于其它如Linux/類Linux 等系統.進而,研究一種跨異構環境復用的且能夠適應支撐軟件集成構件清單按需配置的構件化軟件集成方法,是在跨操作系統平臺應用實踐中急需解決的問題.
為了解決上述難題,本文提出了一種滿足多跨平臺軟件研發實踐需要的類反射式軟件構件集成方法,它能夠為異構軟硬件環境的電子與信息系統包括嵌入式裝備提供可跨平臺復用的軟件構件集成通用手段,支撐電子與信息系統軟件的快速開發與迭代集成,有利于降低系統開發維護成本、提升行業企業效益.
反射的概念是由Smith 在1982年首次提出的,主要是指一類能夠自描述和自控制的應用,這類應用通過采用某種機制來實現對自己行為的描述和監測,并能根據自身行為的狀態和結果,調整或修改應用所描述行為的狀態和相關的語義,本文方法通過運用工廠模式結合回調機制來實現反射這一機制.
工廠模式常用于設計模式中,沒有正式統一的表述定義,其形象比喻就是當客戶需要工廠產品時通過統一向工廠下單讓工廠生產后提貨相應產品即可,而不用去管產品是怎么做出來的,如圖1(a)所示.本文方法中,產品是反射類對象,工廠是指反射類工廠.
回調機制常用于程序設計實現中,沒有正式統一的表述定義,這一機制運用過程的形象比喻就是意為A 讓B 做某件事時,B 做事的過程中又回過頭來運用了A 提供的方法,如圖1(b)所示.

圖1 工廠模式和回調機制示意
軟件構件為軟件系統中具有相對獨立功能、可以明確辨識、接口由規約指定的可組裝軟件實體[17].多個構件可被集成裝載成為更高層級的軟件,在本文方法中軟件構件以類的形式作為被操作對象,具體實現中軟件構件即意指軟件構件類.
集成就是一些孤立的事物或元素通過某種方式改變原有的分散狀態集中到一起,產生聯系,從而構成一個有機整體的過程[18],本文方法中的集成是指將所需的軟件構件集合裝載成為軟件.
本文所述面向異構環境可復用的類反射式軟件構件集成方法的整體設計包括如下過程步驟:
(1)反射類基本要素構建.運用工廠模式結合回調機制,構建反射類基本要素包括反射類工廠、反射類基類、反射類通用部件.
(2)軟件構件基類構建.運用構件化的思想,由反射類基類派生構建軟件構件基類,支持軟件構件的啟停用、功能響應、心跳查詢、以及其它可擴展功能.
(3)軟件構件集成管理類構建.運用軟件構件基類,構建軟件構件集成管理類,用于集成管理軟件構件的裝卸載、啟停用、心跳檢測、故障修復.
(4)軟件構件實現.軟件構件以類的形式構建,繼承軟件構件基類派生,配裝反射類通用部件,繼承軟件構件基類派生,并由構件自身實現其專有的功能.
(5)軟件按需集成管理.業務系統軟件根據自身需求預配置各自的軟件構件列表,通過運用軟件構件集成管理類,操作執行系統啟動時的軟件構件依序創建、啟用,運行時的軟件構件功能調度、檢測等,退出時的軟件構件停用、關閉,以實現軟件的構件化按需構建與運行管理.
構建的反射類基本要素包括:
(1)反射類工廠
反射類工廠以反射類對象作為反射類工廠中產品,反射類類名為產品的名稱,反射類為產品描述,來管理所有(反射類對象) 產品的生產、回收,如圖2所示.

圖2 反射類工廠原理示意圖
1)產品生產回收一線信息登記.反射類工廠統一登記錄入廠內所有種類產品的生產回收一線信息(注:一線同“一線工人”的“一線”詞義是指在反射類對象這一產品的生產與回收一線) 并生成工廠(可生產回收) 產品清單,其中生產回收一線信息包括產品的名稱、一線生產方法、一線回收方法.工廠產品清單,可用于支撐后續檢索廠內產品并控制相應產品的生產或回收.
2)產品工廠生產.收到輸入的產品生產要求時,反射類工廠根據產品名稱安排進行生產,在工廠產品清單中查找到相應產品,查找到則調用該產品關聯的一線生產方法來生產獲得產品,否則告知不是廠內產品無法進行生產.實現偽代碼如下.

輸入:生產產品名稱name,工廠產品清單list輸出:生產產品product 1.flag←0 2.node←list.begin 3.FOR EACH node!=list.end.next DO 4.IF node.Name=name THEN 5.flag←1 6.break;7.ENDIF 8.node←list.next

9.ENDFOR 10.IF 1=flag THEN 11.product←node.FuncP(name);12.ELSE 13.product←NULL;14.ENDIF?
3)產品工廠回收.原理類同2).即收到輸入的產品回收要求時,反射類工廠根據產品名稱安排進行回收,在工廠產品清單中查找到相應產品,查找到則調用該產品關聯的一線回收方法來回收銷毀產品,否則告知不是廠內產品無法進行回收.
(2)反射類基類
反射類基類即所有反射類的父類,可派生生成子類即反射類.它結合運用回調機制,統一提供反射類工廠產品(即反射類對象)的工廠化生產、回收功能,如圖3所示.

圖3 反射類基類原理示意圖
1)產品生產回收一線信息工廠注冊.反射類基類使用反射類工廠的產品生產回收一線信息登記功能,完成產品的名稱,及其一線生產與回收方法信息的注冊.
2)產品工廠化生產.收到輸入的產品生產要求時,反射類基類根據產品名稱和產品生產預置參數使用反射類工廠的產品工廠生產功能來完成反射類對象自身的預置參數生產.注:該功能實現過程中,反射類回調了其自身的產品一線生產方法.
3)產品工廠化回收.反射類基類收到輸入的產品回收要求時,根據產品名稱使用反射類工廠的產品工廠回收功能來完成反射類對象自身的回收.注:該功能實現過程中,反射類回調了其自身的產品一線回收方法.
(3)反射類通用部件
反射類通用部件可用以構建所有反射類實現的通用組成部分,它統一提供反射類的產品一線生產與回收并管理有關信息,如圖4所示.

圖4 反射類通用部件原理示意圖
1)產品一線生產.反射類通過使用自身的產品生產即類對象創建方法來完成產品的一線生產,運算方法為:

其中,obj為類對象,new為類對象創建的程序運算符,ClassX為類名稱,paramList為類對象生產預置參數.
2)產品一線回收.反射類通過自身的產品回收即類對象刪除方法來完成產品的一線回收,運算方法為:

其中,obj為類對象,delete為類對象刪除的程序運算符.
3)產品生產回收一線信息自動注冊.反射類根據輸入的產品名稱,結合自身的產品一線生產與回收方法構成自身的生產回收一線信息,之后應用自身繼承自反射類基類的生產回收一線信息工廠注冊功能完成相應信息的注冊.
軟件構件基類由反射類基類派生而成,除繼承反射類基類的所有功能外,還包括軟件構件規范化的啟停用、功能響應、心跳查詢功能接口,如圖5(a)所示.

圖5 軟件構件基類和軟件構件類結構
1)軟件構件啟用功能接口.支持各具體構件派生實現自身的啟用,使構件開始工作,該接口形式為:

其中,start為構件啟用接口執行函數,無輸入參數.
2)軟件構件停用功能接口.支持各具體構件派生實現自身的停用,使構件停止工作,該接口形式為:

其中,stop為構件停用接口執行函數,無輸入參數.
3)軟件構件操作響應功能接口.支持各具體構件派生實現對外部操作請求自身功能的響應,該接口形式為:

其中,operat為構件操作響應接口執行函數,輸入參數包括:no為功能編號.
4)軟件構件心跳查詢功能接口.支持各具體構件派生實現對外部心跳查詢請求自身健康狀態的響應,即在構件工作正常(即能夠響應外部操作請求)的情況下回復對方本構件心跳正常,該接口形式為:

其中,heartAsk為構件心跳查詢接口執行函數,輸入參數包括:a nswerFunc為心跳回復接口函數,其在構件工作正常的情況下通過該接口告知本構件心跳正常.
軟件構件集成管理類能夠集成管理軟件構件的裝卸載、啟停用、心跳檢測、故障修復,如圖6所示.

圖6 軟件構件集成管理類示意圖
1)軟件構件批量裝載啟用.根據輸入的構件信息(含構件名稱、產品生產預置參數)列表并更新軟件集成的構件信息列表信息,從前往后依次結合運用軟件構件的產品工廠化生產、構件啟用功能,來打開軟件構件實體、生產構件得到相應的操作類對象,之后啟用構件使相應的構件開始工作.
2)軟件構件批量停用卸載.根據自身管理的集成構件信息列表信息,從后往前依次結合運用軟件構件的構件停用、產品工廠化回收功能,來停用構件使相應的構件停止工作、回收構件釋放相應的操作類對象,之后關閉軟件構件實體.
3)軟件構件心跳檢測.根據自身管理的集成構件信息列表信息,從前往后依次運用軟件構件的心跳查詢功能來查詢獲取相應構件的心跳,未超時收到心跳則表明構件工作正常,超時收不到心跳則表明構件工作故障.
4)軟件構件操作響應調度.根據輸入要求響應操作的構件名稱,在管理的列表中找到有關構件,然后運用軟件構件的構件操作響應功能使得相應的構件響應對應功能編號的軟件操作.
5)軟件構件故障修復.根據輸入的構件名稱,修復相應構件的故障,故障修復手段采用先(使用軟件構件的啟用功能)重啟構件進行修復,構件仍無法恢復工作正常時(使用軟件構件的產品工廠化生產功能)重裝構件進行恢復.
軟件構件以類(其名稱由構件類標識“CComp”+構件標識組成,構件標識為不超過8個英文字符的非空字符串)的形式呈現,由軟件構件基類派生構建,其組成包括反射類通用部件、繼承的軟件構件基類、以及其它自身的專有功能.其需按照軟件構件基類的功能接口規范約定實現自身的啟用、停用、操作響應、心跳查詢功能,以及按照構件自身的專有功能定義實現有關的功能,如圖5(b)所示.
軟件通過使用軟件構件集成管理類,根據其自身相應的功能構成需求進行構件化集成管理,如圖7所示.

圖7 軟件按需集成管理活動示意圖
1)軟件啟動預置構件裝載啟用.軟件啟動時,按照軟件出廠設定(滿足軟件功能初始需求)的構件列表配置并使用軟件構件集成管理類的構件批量裝載啟用功能來實現軟件預置構件組合的動態集成裝載啟用.
2)軟件運行申請構件裝載啟用.軟件運行時,可接受新增(滿足軟件功能臨時需求)構件申請并使用軟件構件集成管理類的構件批量裝載啟用功能來實現軟件臨機需用構件的動態集成裝載啟用.
3)軟件構件操作響應調度.軟件運行時,可接受構件操作響應請求并使用軟件構件集成管理類的構件操作響應功能來執行相應編號的軟件構件功能操作.
4)軟件構件狀態檢測修復.軟件運行時,可接受構件心跳檢測請求并使用軟件構件集成管理類的構件心跳檢測功能來檢測構件的工作狀態,在發現構件工作故障后可以使用構件集成管理類的構件故障修復功能來修復構件故障.
5)軟件構件停用卸載.軟件退出時,使用軟件構件集成管理類的構件批量停用卸載功能來停用卸載軟件集成組裝的構件以釋放占用的資源.
從前文可知,本文的改進軟件構件集成方法的實體組成部件為反射類工廠、軟件構件基類、軟件構件集成管理類;它們不僅是以不同異構(操作系統)環境下都能通用的類和函數的形式來表現,而且可以使用跨平臺通用程序語言同時基于運用跨平臺通用操作系統接口/操作符如 new、delete來實現.故,本文方法具備跨不同異構環境的通用性,且能夠通用規范各異構環境下的軟件構件開發.進一步,它可通過采用跨平臺通用的如C++程序語言來編碼進行程序化實現,且其程序源碼因方法的可跨異構環境通用性而無需重復編碼即可直接復用于Windows、VxWorks、ReWorks、Android、AOS 等各類異構環境,而僅需通過各系統配套開發工具上創建工程加載有關源碼編譯生成相應系統下的軟件構件集成服務程序.該程序以動態庫的形式對外提供,作為后端服務運行,支撐軟件構件的按需集成與功能調度管理.
以Windows 系統應用為實例,在系統軟件出廠時設定軟件默認啟用的構件列表配置,其配置以(支持跨平臺復用的)XML 文件形式提供并按照啟動依賴順序從前到后排序,如圖8所示.

圖8 軟件出廠構件列表配置示意圖
在軟件開發階段,基于軟件構件集成服務程序的軟件基類,各軟件構件完成自有功能實現并生成構件程序.在軟件部署階段,完成默認啟用構件列表配置文件的加載,以及根據構件列表清單完成所有構件的安裝.
在軟件啟動時,軟件構件集成服務程序讀取默認啟用構件列表配置并據此依次從前到后完成各軟件構件的動態集成啟用,同時系統軟件啟動后也可根據臨時需求完成新增構件的啟用;在系統軟件運行過程中,軟件構件集成服務程序可以提供軟件集成啟用的軟件構件列表及其運行狀態、構件功能操作響應調度、以及控制故障軟件構件的修復.同時為用戶提供軟件構件管理界面,可以實時查看軟件集成啟用的軟件構件列表及其運行狀態,并可對軟件進行故障修復等管理操作,如圖9所示.

圖9 軟件構件管理界面示意圖
結合上述應用實例和前文的技術方案,可以看出本文方法能夠很好地支持跨異構環境可復用,也具備較完備的軟件構件集成管理手段.它不僅能夠更便捷地復用于各類異構環境上的業務信息系統,而且利于各系統間軟件構件的快速跨平臺遷移或升級改造,這些都能夠為提高信息系統的集成效率、提升軟件工程質量水平、以及降低系統的開發維護成本,起著積極的作用.同時,也已成功運用于多型如VxWorks、ReWorks、Android、WinCE、AOS、Kylin、Windows 等操作系統的陸軍業務信息系統中.理論實踐均能表明,本文方法適用于電子與信息系統軟件的軟件構件化開發集成.
本文立足于為異構環境上的信息系統的提供可復用的跨平臺通用軟件構件集成手段,論述了類反射式軟件構件集成的相關原理、運用機制.同時,給出了面向異構環境可服用的軟件構件集成方法,這種方法已成功地在多型嵌入式如單兵業務信息系統中得到應用[19],且也能適用于其它信息系統[20],能夠面向陸軍領域裝備現狀解決按計算等資源環境異構差異需各型適配改造軟件集成管理程序的痛點.