实际上,软件现代化包括用更好的替换坏的渐进过程。选择专注于软件可移植性而不是条件编译是现代化不可或缺的一部分。
考虑与部署平台现代化相关的工作。假设最初在Windows上使用C++语言开发的应用程序现在需要集成到运行专有操作系统和ARM处理器的现代智能手机中。移植活动需要标识并替换 Microsoft 基础类上的所有依赖项。它还必须分析和解决对Microsoft编译器和Microsoft Windows实现的底层线程调度模型的所有依赖关系。虽然其中一些移植问题是由手机供应商的编译器和链接器输出的诊断消息识别的,但 Microsoft 和智能手机编译器的代码生成方法之间的细微差异只能通过对各自技术进行广泛的测试和/或仔细审查和分析来检测。同样,Microsoft 和智能手机操作系统对线程调度队列、互斥锁和优先级反转避免策略的处理之间的差异必须取决于对各自操作系统和应用程序源代码以及任何可用应用程序设计文档的广泛测试和/或仔细审查和分析。
请注意,通过独立开发的可重用软件组件的模块化组合来构建新应用程序的能力取决于这些组件的可移植性。因此,实现软件可移植性对于开发新系统和维护现有系统至关重要。
条件编译增加了复杂性
对于典型的C++移植工作,必须更改以支持新平台的代码量相对较小,通常不到总代码的 10%。找出必须更改的 10% 的线路是任何移植工作的最大障碍之一。随着各种移植障碍的识别和解决,尽职尽责的软件工程师通过插入有条件编译的代码块并创建文档来帮助阐明将此代码移植到另一个平台(如 Linux、INTEGRITY 或 VxWorks)可能需要的额外工作,从而使应用程序现代化。当然,不能保证从Windows到智能手机的端口可以识别到另一个操作系统或处理器的后续端口可能出现的所有问题。但是,从第一个端口中吸取的经验教训为其他端口提供了宝贵的指导。
软件现代化的一个相互冲突的目标是减少纠正错误、解决性能缺陷或随着系统需求的发展添加增量新功能所需的工作量。通过插入条件编译指令和每个新端口要考虑的问题的文档列表来使应用程序变得可移植,这很难发展。如果对原始应用程序的更改影响有条件编译的代码,则必须将更改传播到表示对每个相关平台的支持的所有有条件编译的代码块中。此外,每个增量更改都必须使用合法条件编译选项的每个组合进行测试。这大大增加了与常见软件维护活动相关的工作量。
可移植语言避免条件编译
使用条件编译指令的一种流行的替代方法是使用更可移植的编程语言实现软件。Java通常是首选,许多人使用短语“软件现代化”来描述将Ada,C或C++软件迁移到Java语言的过程。Java,包括某些实时版本的Java,解决了Java运行时环境(所谓的虚拟机)本身的可移植性问题,而不是要求应用程序中的条件编译指令。Java 语言甚至提供了用于解决多处理问题的特殊控制结构,包括用于识别互斥代码区域的语法以及各个处理器缓存之间的一致性。通过抽象这些可移植性注意事项,Java 语言在典型的软件维护活动中节省了大量成本。一个开发团队报告说,与 C 语言相比,在一个项目中节省了 20 倍的成本,该项目包括组装独立开发的现成软件组件以部署到新的嵌入式平台上。
在一次整体式工作中将整个遗留应用程序重写为 Java 语言在经济上很少可行。当今的典型应用程序由数十万或数百万行代码组成;因此,以增量步骤对旧版应用程序进行现代化改造更为常见。随着每个功能的添加,新功能都在Java中实现,并固定在现有的遗留系统上。如果维护活动显示遗留应用程序的特定方面难以移植或发展,则应用程序的一部分将替换为更现代的 Java 实现。
审核编辑:郭婷
全部0条评论
快来发表一下你的评论吧 !