首页 理论教育 基于本体的跨平台应用软件移植技术研究成果

基于本体的跨平台应用软件移植技术研究成果

时间:2023-11-17 理论教育 版权反馈
【摘要】:即不改变软件外部行为情况下修改源代码,它是一种有效的、受控的清理代码的技术[8]。基于代码重构的软件移植技术最早用于将遗留系统再工程到新的软硬件平台上。最后,在源代码之上进行代码重构的工作。

基于本体的跨平台应用软件移植技术研究成果

2.1.1.1 移植技术的应用背景及特点

代码重构(Refactoring)指的是对软件的内部结构所做的一种调整,目的是在不改变软件可观察行为(Observable behavior)的前提下提高其可理解性,降低其修改的成本。即不改变软件外部行为情况下修改源代码,它是一种有效的、受控的清理代码的技术[8]。主要用于两个或多个特定平台之间的软件移植,即围绕待移植应用软件进行二次设计,使移植后的软件符合目标平台的运行要求。代码重构能很好地解决应用软件对软硬件环境的依赖问题,是软件跨平台移植方案中较

为彻底的方法,也是实际工程项目中主要采用的方法。

基于代码重构的软件移植技术最早用于将遗留系统(Legacy System)再工程到新的软硬件平台上。遗留系统是对企业或组织的业务非常重要的一类应用软件,在运行多年后,为了进一步提高性能、降低运行风险,以更好地支持企业或组织的业务发展,遗留系统通常面临移植到新的软硬件平台上的需求。然而遗留系统由于其开发时间相对较早,使用技术及所依赖的平台落后、文档缺失或陈旧,缺少了解其相关业务的软件开发人员或维护人员,因此,遗留系统的源代码或是以二进制形式存在的可执行文件[9]就成为再工程中重要的可利用资源。国内外学者就如何对其分析并进行相应的代码重构以使之适应新平台的环境这一问题进行了大量的研究。常用的方法有:①基于源码修改的方法;②基于语言转换的方法;③基于代码总体重构的方法。

2.1.1.2 常用方法

(1)基于源码修改的方法

基于源码修改的方法是在获取待移植应用软件的源代码基础上进行修改,使之适应新的平台。获取源码,可以通过使用逆向工程工具[10][11]。反编译工具作为一种逆向工程工具,执行编译的逆向过程,读取二进制形式的可执行文件,生成与源代码功能基本一致的高级语言代码。经由反编译器得到的源代码与原始代码不完全相同,这是因为在编译过程中会有一些信息丢失。程序的二进制可执行文件中保留的信息量取决于编写代码使用的高级语言,由编译器翻译成的低级语言和所使用的具体的编译器[12][13]。Spices.Net Decompiler[14]就是一个代码恢复和反编译工具,它针对虚拟机进行字节码的反编译,支持将已被编译成MSIL(Microsoft中间语言)的.NET程序反编译为格式化的、最佳的源代码。

获取应用软件的源代码后,在进行代码重构之前,需要通过逆向工程(Reverse Engineering)[15][16]对源代码进行程序理解[17][18],以提取应用软件的业务逻辑[19]。程序切片(Program Slicing)[20][21][22]就是一种程序理解技术,它分为静态和动态两种方法,其中静态程序切片可用于分析软件的逻辑结构、功能、数据流、控制流等。在完成程序信息提取后,需要根据两个或多个特定平台之间的差异分析出待移植系统源代码中与目标运行环境有差异的变量、程序结构、函数接口数据库接口等,建立起相应的转换关系。这种转换关系除极少数以一对一的形式存在外,大部分情况下是目标平台的多个接口进行整合与封装后对应实现某一个原接口。例如,在Windows中,Win32 API函数CreateProcess()用来创建一个新的进程和它的主线程。在Linux中,没有与CreateProcess()唯一对应的函数,但是可以采用封装fork()、setuid()、exec()来等效实现CreateProcess()的功能。最后,在源代码之上进行代码重构的工作。2003年,张凯龙[121]在他的博士论文中提出通过虚拟Win32 API的方法解决将Win32 应用移植到Linux平台。2010年,Jianping Cai等人[23]通过深入研究静态分析工具OINK源代码,分析它的实现机制,并按照其模块划分建立工程,根据各模块之间的依赖关系进行顺序移植,移植过程中手工修改不一致的相关参数,调整各种数据类型、函数的定义,修改环境变量以及其他编译选项,最终实现了将OINK从Unix-like平台移植到Windows平台。

(2)基于语言转换的方法

基于语言转换的方法[24]是将一种语言实现的源码转换成另一种与平台无关的语言(如Java语言、C#语言等),使软件具有可移植性。这种转换关键在于找到两种语言的对应关系,通过正确确立的对应关系,进行程序结构、类型、存储结构、常数等转换。转换过程中需要保证程序语义以及功能等价,即对于一个确定的输入,在经历一系列确定的动作序列后,输出相同的结果。基本思路是通过逆向工程中的词法分析方法[25],分析、提取出源代码中的单词符号,并按照各自的类别分别存储入相应的数据结构中。根据源代码设计语言的定义,辨别出这些单词符号的性质、意义,找到目标程序设计语言中与之相匹配的单词符号。然后,对源代码的整体结构进行语法、语义分析,获取源代码的语法组织结构(语法树)和语义结构(程序执行流程),分析各个单词符号在语法结构中的语义信息,并根据语义结构判定各个单词符号间的关系并加以描述。最后,根据目标程序设计语言的语法、语义规则,翻译所提取出的单词符号并转换它们之间的语义关系,得到用目标程序设计语言描述的程序代码。1998年Kontogiannis K.等人[26]提出了一种PL/IX语言到C++语言半自动转换的方法,并将它与手工转换进行比较。2001年,Johannes Martin 等人[27][28][29]在他们的论文中分析比较了C与Java之间的差别,以及在转换过程中存在的困难,并针对这些存在的困难给出了解决策略,最后提出了名为Ephedra的移植方法,并实现了一套工具用于辅助移植过程。

(3)基于代码总体重构的方法

基于代码总体重构的方法,其主要思想是通过逆向工程[30]分析、提取待移植系统的高层抽象,在目标平台上采用特定编程技术重构软件。逆向工程中的软件聚类[31][32][33]方法是提取系统架构的主要技术,它将聚类实体按照一定的尺度通过聚类算法进行归类,使得系统自动分割为关联比较松散的子系统。除此之外,模式匹配方法也是一种获取系统架构模式的技术,它通过模式匹配引擎查找用户定义的架构模式,获取系统架构的概念模型。在通过逆向工程获取系统实现框架后,对其进行抽象和精化以指导新的应用软件开发。1995年,M.Brodie在他们的书中第一次系统阐述通过对原应用系统进行分析,在目标平台采用新的工具重新开发后对原应用系统进行“一次性”替换,并将这种替换方法称为“大爆炸方法(Big Bang approach)”[34][68][69][70][71]。(www.xing528.com)

2.1.1.3 分析比较

基于源码修改的方法和基于语言转换的方法是从比较微观的角度出发,而基于代码总体重构的方法则从较为宏观的角度出发,通过对应用软件的代码进行重构以实现跨平台移植。下面将从语言及编译环境依赖、工程配置文件、工作量、复杂度、风险及成本等几个方面对它们进行比较。详见表1。

表1 代码重构方法比较

表1 表明:

①与其他两种代码重构的方法相比,采用代码总体重构的方法在新平台上重构应用,重构后的系统不受原系统设计语言及编译环境的限制,实现机制也不受原系统的制约。

②Makefile是用于定义系统中各文件之间的依赖性及其编译规则的重要工程配置文件,采用语言转换以及代码总体重构的方法都将在新的集成开发环境中重新建立。

③采用代码总体重构的方法可以对原系统进行功能及性能上的优化

④三种代码重构的方法,其工作量均取决于待移植应用软件的规模。但是相比较而言,由于语言转换可以借助工具来进行,它的工作量最小,而代码总体重构需要对系统进行重新实现,重构工作量相对最大。

⑤三种代码重构的方法复杂度都较大,尤其是代码总体重构的移植方法。复杂度从某种程度上影响着软件移植的成败,是代码重构移植过程中的一个关键因素。2005年,LeiWu[35]等人提出了使用应用程序动态分析、知识恢复、分而治之等技术以减低基于代码重构移植方法中复杂度的方法。

⑥代码总体重构的方法是三种方法中风险以及成本最大的。1997年,Jesus Bisbal等人[36]在文中详细分析了这种代码总体重构的移植方法,指出在实际应用中,其所面临失败的风险是非常大的,采用这种方法需要谨慎考虑。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈