吳小強(qiáng)
(海軍駐連云港716所軍事代表室,連云港222006)
艦船電子對(duì)抗系統(tǒng)顯控軟件是艦船電子對(duì)抗系統(tǒng)的人機(jī)交互界面,也是艦船電子對(duì)抗系統(tǒng)的控制樞紐與靈魂,其性能好壞在很大程度上決定了艦船電子對(duì)抗系統(tǒng)性能的好壞。它不但要完成自身的顯示控制任務(wù),同時(shí)還要適應(yīng)用戶所提出的跨平臺(tái)要求,即用戶希望顯控軟件能安裝在用戶所能提供的各種操作系統(tǒng)上,如微軟的 Ms Windows NT/2000/XP/CE系列,風(fēng)河的 VxWorks系列,Sun的Solaris系列,SCO的Unix系列以及開源的Linux操作系統(tǒng)上?;谝粋€(gè)平臺(tái)開發(fā)一個(gè)性能良好的艦船電子對(duì)抗系統(tǒng)顯控軟件已屬不易,要基于多個(gè)平臺(tái)開發(fā)更是難以想象,需要花費(fèi)更多的人力、財(cái)力、物力與時(shí)間資源,對(duì)于開發(fā)者來(lái)說(shuō),是難以承受的。唯一的解決辦法是跨平臺(tái)開發(fā)。最好能做到像Java語(yǔ)言那樣,“Write once,run anywhere”(編寫1次、到處運(yùn)行),那是否選擇Java來(lái)開發(fā)就解決了問(wèn)題呢?不是,因?yàn)镴ava實(shí)在太慢了,艦船電子對(duì)抗系統(tǒng)顯控軟件要求實(shí)時(shí)和快速地對(duì)任何外界輸入做出反應(yīng),故只能選擇C/C++,那么用C/C++如何實(shí)現(xiàn)跨平臺(tái)開發(fā)呢?下面分析艦船電子對(duì)抗系統(tǒng)顯控軟件的體系結(jié)構(gòu),從中找出辦法。
如圖1所示,艦船電子對(duì)抗系統(tǒng)顯控軟件從層次的角度來(lái)看,可分為3層。
圖1中人機(jī)界面包括用戶圖形界面(GUI)及顯控臺(tái)上各種開關(guān)、按鈕的控制;應(yīng)用邏輯即對(duì)任何外界輸入做出反應(yīng)所進(jìn)行的計(jì)算及算法;I/O及數(shù)據(jù)庫(kù)聯(lián)接即各種網(wǎng)絡(luò)、并口、串口等I/O口連接程序及與應(yīng)用數(shù)據(jù)庫(kù)的連接程序。
圖1 艦船電子對(duì)抗系統(tǒng)顯控軟件體系結(jié)構(gòu)圖
1.2.1 人機(jī)界面
人機(jī)界面主要是用戶圖形界面,是實(shí)現(xiàn)跨平臺(tái)開發(fā)的主要障礙,因?yàn)樗僮飨到y(tǒng)密切相關(guān),且開發(fā)的工作量巨大,如果用戶圖形界面實(shí)現(xiàn)了跨平臺(tái)開發(fā),那么顯控軟件的跨平臺(tái)開發(fā)就實(shí)現(xiàn)了90%。
上面提到的操作系統(tǒng)從用戶圖形界面實(shí)現(xiàn)的角度可將它們分作兩類:Windows系列及類Unix系列(除 Windows系列以外都是,包括VxWorks)。Windows系列的用戶圖形界面是其自身所附帶的,而類Unix系列均是X Window,雖然它們表現(xiàn)各異,實(shí)現(xiàn)方式不同,本質(zhì)還是X Window。
所以,要開發(fā)顯控軟件人機(jī)界面程序只須考慮兩種平臺(tái):Windows和X Window。1.2.2 應(yīng)用邏輯
應(yīng)用邏輯與操作系統(tǒng)無(wú)關(guān),只需開發(fā)時(shí)使用標(biāo)準(zhǔn)的C/C++語(yǔ)言即可實(shí)現(xiàn)跨平臺(tái)。1.2.3 I/O及數(shù)據(jù)庫(kù)聯(lián)接
I/O及數(shù)據(jù)庫(kù)聯(lián)接中除并口、串口等I/O口與操作系統(tǒng)密切相關(guān)外,網(wǎng)絡(luò)、及與應(yīng)用數(shù)據(jù)庫(kù)的連接具有工業(yè)標(biāo)準(zhǔn),網(wǎng)絡(luò)可用BSD的套接字,應(yīng)用數(shù)據(jù)庫(kù)的連接可用ODBC,可實(shí)現(xiàn)跨平臺(tái)。因此,這部分跨平臺(tái)開發(fā)的工作量并不大。
綜上所述,顯控軟件跨平臺(tái)開發(fā)的工作量主要在用戶圖形界面上,用戶圖形界面實(shí)現(xiàn)了跨平臺(tái)開發(fā),任務(wù)就基本完成了。
要實(shí)現(xiàn)用戶圖形界面的跨平臺(tái)開發(fā),關(guān)鍵是尋找一個(gè)跨平臺(tái)的GUI開發(fā)工具包,事實(shí)上wxWidgets就是這樣一個(gè)開發(fā)工具包。
wxWidgets原來(lái)叫做wxWindows,后為了避開和微軟的“Windows”之爭(zhēng),改名為wxWidgets。
wxWidgets項(xiàng)目最初由當(dāng)時(shí)工作于愛丁堡大學(xué)的人工智能應(yīng)用程序研究所的Julian Smart在1992年發(fā)起,最初它只面向XView and MFC 1.0。后來(lái),XView發(fā)展成Motif,wxWidgets也就相應(yīng)地面向 Motif和 MFC來(lái)開發(fā)。1995年,Markus Holzem加入了兼容Xt的功能。1999年,基于Windows和GTK+開發(fā)的組件也融入到wxWidgets中。如今,wxWidgets幾乎支持所有常見的開發(fā)平臺(tái)和圖形庫(kù)。
wxWidgets是一個(gè)C++編寫的通用的、試圖跨平臺(tái)的GUI開發(fā)框架。從其體系結(jié)構(gòu)可以看出,wxWidgets事實(shí)上只是一個(gè)簡(jiǎn)單的 Wrapper,封裝了底層的一些圖形庫(kù),這樣的好處就是對(duì)跨平臺(tái)的支持,使得開發(fā)的程序能完全做到與平臺(tái)無(wú)關(guān)。
表1表明了wxWidgets和下層操作系統(tǒng)的聯(lián)系,從表1可清晰看出wxWidgets的設(shè)計(jì)思想和開發(fā)思路。從wxWidgets需要實(shí)現(xiàn)的目的和意圖也可以看出,它將是開發(fā)跨平臺(tái)程序的一大利器。
表1 wxWidgets和下層操作系統(tǒng)的聯(lián)系
比起其他的跨平臺(tái)gui庫(kù),wxWwidgets的特點(diǎn)和優(yōu)點(diǎn)如下:
(1)是免費(fèi)與開源的
wxWidgets的一大吸引力是它的licence類型是屬于 L-GPL (Library General Public Licence)的,也就是說(shuō),使用它開發(fā)的軟件并不要求一定得公開源碼。這樣,無(wú)論是免費(fèi)軟件的開發(fā)者、GPL類型的軟件開發(fā)者,還是純粹商業(yè)軟件開發(fā)者都可以免費(fèi)使用這個(gè)軟件包。
(2)是跨平臺(tái)的GUI庫(kù),支持的操作系統(tǒng)很全面,甚至支持PDA
它雖然不像Java那樣是“全面”的,而僅僅是GUI庫(kù),但GUI是計(jì)算機(jī)編程中最為麻煩、耗費(fèi)時(shí)間、容易出現(xiàn)的部分,特別當(dāng)你想要自己的軟件運(yùn)行在多個(gè)操作系統(tǒng)上的時(shí)候,開發(fā)和維護(hù)的難度令人難以想象。如果解決了GUI的問(wèn)題,基本上就解決了C++的“跨平臺(tái)”問(wèn)題——至少不用為每種平臺(tái)都維護(hù)1份源代碼了。
雖然Java可以實(shí)現(xiàn)跨平臺(tái)的GUI程序,但本質(zhì)上并不是Java語(yǔ)言跨平臺(tái),而是Java虛擬機(jī)跨平臺(tái),換句話說(shuō)Java并不是Native Code,它是介于編譯語(yǔ)言和腳本語(yǔ)言之間的一種特殊語(yǔ)言,編譯期只能完成到Code for Java VM的轉(zhuǎn)換,而真正被編譯成bytecode是在運(yùn)行期完成的(腳本語(yǔ)言的特性),這意味著Java程序第1次啟動(dòng)時(shí)需要較長(zhǎng)的時(shí)間去加載,雖然還有類似GJC的Java Compilers可以一次到位,但大都不能完全并很好地支持Java特性。而wxWidgets被直接編譯成機(jī)器碼,從而獲得速度優(yōu)勢(shì)。
開發(fā)者只需要用自己使用的系統(tǒng)平臺(tái)的編譯器編譯源程序,并鏈接上相應(yīng)的庫(kù)文件,生成的程序代碼即具有該平臺(tái)的外觀和界面。
(3)xWidgets提供的GUI是大量使用宏的,這就意味著它是在盡可能使用目標(biāo)系統(tǒng)native的GUI樣式
這表示如果1個(gè)程序是在Windows下編譯的,將有典型的 Windows程序的外觀與行為,當(dāng)它在Linux下編譯時(shí)將擁有Linux程序的外觀與行為。
(4)支持的編譯器也很多,如:
Visual C++1.5,4.0,5.0,6.0,.net,2005
Borland C++4.5,5.0
Borland C++Builder 1.0,3.0
Watcom C++10.6(Win32)
Cygwin
MinGW32
Metrowerks CodeWarrior 4
GNU C/C++
(5)功能強(qiáng)大,體系結(jié)構(gòu)與微軟的MFC類庫(kù)相似,容易上手
wxWidgets擁有一個(gè)功能比較完善的類庫(kù),wxWidgets的類庫(kù)從功能上分為兩部分:用來(lái)構(gòu)造圖形界面的界面構(gòu)造類庫(kù)和完成傳遞信息、保存數(shù)據(jù)等輔助功能的非界面構(gòu)造類庫(kù)。構(gòu)造界面的類庫(kù)中,有各種控件類,如菜單欄、菜單項(xiàng)、按鈕、文本框等,圖2反映wxWidgets類繼承體系的一部分,該繼承體系與 MFC有一定相似之處,因此,熟悉MFC框架編程的程序員能很快適應(yīng)wxWidgets的程序開發(fā),同時(shí)已有的基于MFC的程序可很方便地移植到wxWidgets。
圖2 wxWidgets類繼承體系(部分)
鑒于wxWidgets優(yōu)秀的跨平臺(tái)性能及易用性,選擇wxWidgets來(lái)開發(fā)顯控軟件的用戶圖形界面,由于wxWidgets與MFC相似,兩者的類庫(kù)絕大部分都是一一對(duì)應(yīng)的,因此,現(xiàn)有的基于MFC的顯控軟件可以很方便地一直到wxWidgets,同時(shí),可在大多數(shù)程序員都熟悉的Windows平臺(tái)下,甚至在Visual C++6.0的開發(fā)環(huán)境中來(lái)開發(fā)基于wxWid-gets的顯控軟件,然后到用戶所要求的平臺(tái)環(huán)境中重新編譯1次即可,這樣,將大大降低顯控軟件跨平臺(tái)開發(fā)的難度,減少開發(fā)所需的時(shí)間及人力。
[1]Julian Smart,Kevin Hock,Stefan Csomor.Cross-platform GUI programming with wxWidgets[M].London:Pearson Education Inc,2006.