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