舰船电子对抗系统显控软件的跨平台开发
2011-08-10吴小强
吴小强
(海军驻连云港716所军事代表室,连云港222006)
0 引 言
舰船电子对抗系统显控软件是舰船电子对抗系统的人机交互界面,也是舰船电子对抗系统的控制枢纽与灵魂,其性能好坏在很大程度上决定了舰船电子对抗系统性能的好坏。它不但要完成自身的显示控制任务,同时还要适应用户所提出的跨平台要求,即用户希望显控软件能安装在用户所能提供的各种操作系统上,如微软的 Ms Windows NT/2000/XP/CE系列,风河的 VxWorks系列,Sun的Solaris系列,SCO的Unix系列以及开源的Linux操作系统上。基于一个平台开发一个性能良好的舰船电子对抗系统显控软件已属不易,要基于多个平台开发更是难以想象,需要花费更多的人力、财力、物力与时间资源,对于开发者来说,是难以承受的。唯一的解决办法是跨平台开发。最好能做到像Java语言那样,“Write once,run anywhere”(编写1次、到处运行),那是否选择Java来开发就解决了问题呢?不是,因为Java实在太慢了,舰船电子对抗系统显控软件要求实时和快速地对任何外界输入做出反应,故只能选择C/C++,那么用C/C++如何实现跨平台开发呢?下面分析舰船电子对抗系统显控软件的体系结构,从中找出办法。
1 舰船电子对抗系统显控软件跨平台分析
1.1 舰船电子对抗系统显控软件体系结构
如图1所示,舰船电子对抗系统显控软件从层次的角度来看,可分为3层。
图1中人机界面包括用户图形界面(GUI)及显控台上各种开关、按钮的控制;应用逻辑即对任何外界输入做出反应所进行的计算及算法;I/O及数据库联接即各种网络、并口、串口等I/O口连接程序及与应用数据库的连接程序。
图1 舰船电子对抗系统显控软件体系结构图
1.2 舰船电子对抗系统显控软件跨平台分析
1.2.1 人机界面
人机界面主要是用户图形界面,是实现跨平台开发的主要障碍,因为它跟操作系统密切相关,且开发的工作量巨大,如果用户图形界面实现了跨平台开发,那么显控软件的跨平台开发就实现了90%。
上面提到的操作系统从用户图形界面实现的角度可将它们分作两类:Windows系列及类Unix系列(除 Windows系列以外都是,包括VxWorks)。Windows系列的用户图形界面是其自身所附带的,而类Unix系列均是X Window,虽然它们表现各异,实现方式不同,本质还是X Window。
所以,要开发显控软件人机界面程序只须考虑两种平台:Windows和X Window。1.2.2 应用逻辑
应用逻辑与操作系统无关,只需开发时使用标准的C/C++语言即可实现跨平台。1.2.3 I/O及数据库联接
I/O及数据库联接中除并口、串口等I/O口与操作系统密切相关外,网络、及与应用数据库的连接具有工业标准,网络可用BSD的套接字,应用数据库的连接可用ODBC,可实现跨平台。因此,这部分跨平台开发的工作量并不大。
综上所述,显控软件跨平台开发的工作量主要在用户图形界面上,用户图形界面实现了跨平台开发,任务就基本完成了。
2 用户图形界面的跨平台开发
要实现用户图形界面的跨平台开发,关键是寻找一个跨平台的GUI开发工具包,事实上wxWidgets就是这样一个开发工具包。
2.1 wxWidgets简介[1]
wxWidgets原来叫做wxWindows,后为了避开和微软的“Windows”之争,改名为wxWidgets。
wxWidgets项目最初由当时工作于爱丁堡大学的人工智能应用程序研究所的Julian Smart在1992年发起,最初它只面向XView and MFC 1.0。后来,XView发展成Motif,wxWidgets也就相应地面向 Motif和 MFC来开发。1995年,Markus Holzem加入了兼容Xt的功能。1999年,基于Windows和GTK+开发的组件也融入到wxWidgets中。如今,wxWidgets几乎支持所有常见的开发平台和图形库。
wxWidgets是一个C++编写的通用的、试图跨平台的GUI开发框架。从其体系结构可以看出,wxWidgets事实上只是一个简单的 Wrapper,封装了底层的一些图形库,这样的好处就是对跨平台的支持,使得开发的程序能完全做到与平台无关。
表1表明了wxWidgets和下层操作系统的联系,从表1可清晰看出wxWidgets的设计思想和开发思路。从wxWidgets需要实现的目的和意图也可以看出,它将是开发跨平台程序的一大利器。
表1 wxWidgets和下层操作系统的联系
比起其他的跨平台gui库,wxWwidgets的特点和优点如下:
(1)是免费与开源的
wxWidgets的一大吸引力是它的licence类型是属于 L-GPL (Library General Public Licence)的,也就是说,使用它开发的软件并不要求一定得公开源码。这样,无论是免费软件的开发者、GPL类型的软件开发者,还是纯粹商业软件开发者都可以免费使用这个软件包。
(2)是跨平台的GUI库,支持的操作系统很全面,甚至支持PDA
它虽然不像Java那样是“全面”的,而仅仅是GUI库,但GUI是计算机编程中最为麻烦、耗费时间、容易出现的部分,特别当你想要自己的软件运行在多个操作系统上的时候,开发和维护的难度令人难以想象。如果解决了GUI的问题,基本上就解决了C++的“跨平台”问题——至少不用为每种平台都维护1份源代码了。
虽然Java可以实现跨平台的GUI程序,但本质上并不是Java语言跨平台,而是Java虚拟机跨平台,换句话说Java并不是Native Code,它是介于编译语言和脚本语言之间的一种特殊语言,编译期只能完成到Code for Java VM的转换,而真正被编译成bytecode是在运行期完成的(脚本语言的特性),这意味着Java程序第1次启动时需要较长的时间去加载,虽然还有类似GJC的Java Compilers可以一次到位,但大都不能完全并很好地支持Java特性。而wxWidgets被直接编译成机器码,从而获得速度优势。
开发者只需要用自己使用的系统平台的编译器编译源程序,并链接上相应的库文件,生成的程序代码即具有该平台的外观和界面。
(3)xWidgets提供的GUI是大量使用宏的,这就意味着它是在尽可能使用目标系统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的类库从功能上分为两部分:用来构造图形界面的界面构造类库和完成传递信息、保存数据等辅助功能的非界面构造类库。构造界面的类库中,有各种控件类,如菜单栏、菜单项、按钮、文本框等,图2反映wxWidgets类继承体系的一部分,该继承体系与 MFC有一定相似之处,因此,熟悉MFC框架编程的程序员能很快适应wxWidgets的程序开发,同时已有的基于MFC的程序可很方便地移植到wxWidgets。
图2 wxWidgets类继承体系(部分)
2.2 基于wxWidgets显控软件开发
鉴于wxWidgets优秀的跨平台性能及易用性,选择wxWidgets来开发显控软件的用户图形界面,由于wxWidgets与MFC相似,两者的类库绝大部分都是一一对应的,因此,现有的基于MFC的显控软件可以很方便地一直到wxWidgets,同时,可在大多数程序员都熟悉的Windows平台下,甚至在Visual C++6.0的开发环境中来开发基于wxWid-gets的显控软件,然后到用户所要求的平台环境中重新编译1次即可,这样,将大大降低显控软件跨平台开发的难度,减少开发所需的时间及人力。
[1]Julian Smart,Kevin Hock,Stefan Csomor.Cross-platform GUI programming with wxWidgets[M].London:Pearson Education Inc,2006.