1、第六章 软件演化技术,本章内容,6.1 软件演化概述 6.2 软件需求演化 6.3 软件演化的分类 6.3.1 基于过程和函数的软件演化 6.3.2 面向对象的软件演化 6.3.3 基于构件的软件演化 6.3.4 基于体系结构的软件演化 6.4 软件静态演化技术,本章内容,6.5 软件动态演化技术 6.5.1 动态软件体系结构 6.5.1.1 动态软件体系结构的概念 6.5.1.2 动态更新的原则 6.5.1.3 基于构件的动态体系结构模型 6.5.2 动态软件体系结构的意义 6.5.3 动态体系结构描述语言 6.5.4 动态演化工具 6.6 可演化软件的设计,6.1 软件演化概述,软件的开发
2、、发布和维护是一个渐进变化并要达到预期目标的过程,是一种演化过程 在软件系统开发完毕正式投入使用之后,用户需求发生了改变,或者要将该系统移植到另一个运行环境中,或者在新环境中需求发生变化,都需要对软件系统进行修改和完善 软件系统进行渐进完善并达到所希望的目标的过程就是软件演化(Software Evolution),6.1 软件演化概述,软件演化过程是由一系列复杂的变化活动组成的,控制系统按照预期目标进行变化是开发者所追求的目标,6.1 软件演化概述,软件演化是指在软件生命周期内进行系统维护和系统更新的动态行为 软件演化的核心问题是:如何使软件系统适应外界的改变,软件演化过程是软件演化和软件过
3、程的统一 软件演化过程应该具有以下几个特征: 迭代性:在软件演化过程中,必须不断地对系统进行变更,许多活动要比在传统模式中具有更高的重复执行频率,6.1 软件演化概述,并行性:为了提高软件演化的效率,必须对软件演化过程进行并行处理 反馈性:用户需求和软件系统所处的工作环境总是在不断地发生该变,一旦环境发生变化后,就必须作出反馈,启动软件演化过程 多层次性:软件演化是一项多层次的工作,它是多方面因素共同作用的结果 交错性:软件演化既具有连续性有具有间断性,二者是交错进行的,6.2 软件需求演化,软件演化是不断调节应用系统以满足用户需求的过程,是对已有系统不断进行修改、补充和完善,以适应外界环境变
4、化的过程 随着新需求和新技术的不断涌现,几乎所有的系统都要不断地进行升级和更新,这种变化的起因更多地归结为软件需求的演化 在软件生命周期的各个阶段,软件需求都可能发生改变,6.2 软件需求演化,系统需求主要包括非功能性需求和功能需求两部分,非功能性需求往往具有全局性,在框架结构级别上,比较容易体现出来 软件体系结构、非功能性需求和功能需求之间的关系,6.2 软件需求演化,首先,必须在功能需求中体现非功能性需求,在软件体系结构中体现功能需求和非功能性需求 其次,非功能性需求对软件体系结构和功能需求具有约束 此外,软件体系结构也进一步约束了功能需求 需求分析往往具有无法避免的不彻底性和不完备性,一
5、些无法预料的外部条件变化也总是在所难免的 软件需求演化主要分为以下三类:,6.2 软件需求演化,需求增加:软件工程师检查用户提出的新需求是否与原有功能冲突,如果产生冲突则向开发小组报告,否则将新需求加入到系统需求规格说明中,启动软件演化过程 需求删除:在开发和运行阶段,系统往往存在着某些不必要的或重复功能,必须删除这些功能所对应的需求描述 需求改写:经过与客户的商讨之后,软件工程师对功能定义、数据定义和实现方法进行修改,然后通知相关人员按照新需求重新启动软件演化过程,6.2 软件需求演化,在软件需求演化过程中,应该注意以下几个问题: 如何预先推导变更的结果和影响的范围 在更替软件元素时,需要保
6、证替换前后元素的外部行为是一致的 在软件需求演化过程中,应该具备控制变更过程的手段,以保持其完整性,6.3 软件演化的分类,软件演化指的是系统进行变化并达到预期目标的过程,可以分为静态演化和动态演化两种类型 静态演化是指系统在停机状态下所进行的修改 动态演化则是指软件在运行期间所进行的更新 在静态演化中,先对需求变化进行分析,锁定软件更新的范围,然后实施系统升级 在停机状态下,系统的维护和二次开发就是一种典型的软件静态演化,6.3 软件演化的分类,对于执行关键任务的一些软件系统而言,通过停止、更新和重启来实现维护演化任务将会导致不可接受的延迟、代价和危险 例如:当对航班调度系统和某些实时监控系
7、统进行演化时,不能进行停机更新,而必须切换到备用系统上,以确保相关服务仍旧可用 条件发生改变时,移动计算系统需要调整对应的计算构件,以适应外界环境的变化,6.3 软件演化的分类,诸如:交通控制软件、电信交换软件、Internet服务应用软件以及高可用性的公共信息软件 软件动态演化可以分为两种类型:预设的和非预设的 动态变化的因素是软件设计者能够预先设想到的,可实现为系统的固有功能,这就是预设的软件动态演化,6.3 软件演化的分类,对系统配置进行修改和调整是直到软件投入运行以后才能确定的,这就要求系统能够处理在原始设计中没有完全预料到的新需求,这就是非预设的软件动态演化 从实现方式和粒度上看,演
8、化主要包括:基于过程和函数的软件演化、面向对象的软件演化、基于构件的软件演化和基于体系结构的软件演化,6.3.1 基于过程和函数的软件演化,早期的动态链接库DLL的动态加载就是以DLL为基础的函数层的软件演化 DLL的调用方式可以分为加载时刻的隐含调用和运行时刻的显式调用 加载时的隐含调用由编译系统来完成对DLL的加载和卸载工作,属于软件静态演化 运行时的显式调用则是由编程者使用API函数来加载DLL和卸载DLL,以实现调用DLL的目的,6.3.1 基于过程和函数的软件演化,Mark给出了一个名为PODUS(Procedure-Oriented Dynamic Updating System)
9、的原型系统 程序的更新是通过载入新版本的程序,用过程的新版本来替换旧版本,同时,在运行时将当前的捆绑改为新版本的捆绑来实现的,6.3.2 面向对象的软件演化,在面向对象语言出现之后,许多研究者开始考虑利用面向对象技术来提高软件系统的演化能力 利用对象和类的相关特性,在软件升级时,可以将系统修改局限于某个或某几个类中,以提高演化的效率 可动态演化的对象应该具备以下几个特征: 在系统运行时,允许进行重新配置,6.3.2 面向对象的软件演化,动态调整不涉及实现代码,可直接在运行实例中修改应用系统 使用反射、元数据及元对象协议来实现对象的动态更新 参照透明,即被替换的对象无需告诉它的使用者,在客户机-
10、服务器(Client-Server)模式中,服务器Server的更新对客户机Client保持透明 状态迁移,在对象动态演化中,被替换对象的相关状态信息,例如:属性和当前运行状态,应该迁移到新对象上,6.3.2 面向对象的软件演化,相互引用问题,对象之间往往存在着某种相互依赖的关系 在面向对象技术中,类层次的动态演化是最具代表性的方法,其原理是:在代理机制下,实现类的动态替换 Java语言使用了动态类的概念,并通过修改标准Java虚拟机,增加相应动态类载入器,在升级前先检查类型的正确性,6.3.3 基于构件的软件演化,从复用的粒度来讲,软件构件要比对象大得多,更易于复用,而且也更易于演化 构件演
11、化是在现有构件的基础上,对其进行修改,以满足用户的新需求 从构件组成的角度来看,构件演化主要包括三种类型: 信息演化是给构件增加新的内部状态 行为演化是在保持构件对外接口不变的情况下,修改构件的具体功能,重新实现构件的内部逻辑,6.3.3 基于构件的软件演化,接口演化则是要对构件的接口进行修改,包括:增加、减少和替换原构件的接口 反射式中间件(Reflective Middleware)是一种通过开放内部实现细节以获取更高灵活性的中间件 通过引入反射技术,以一种受限的方式来操纵中间件运行时的内部状态和行为,使系统具有反射性,6.3.3 基于构件的软件演化,系统的反射性是指系统能够提供对自身状态
12、和行为的自我描述,并且系统的实际状态和行为始终与自我描述保持一致 自我描述的改变能够立即反映到系统的实际状态和行为中,而系统的实际状态和行为改变也能够立即在自我描述中得到反映 反射系统定义了一个层次化的反射体系,包括一个基层和一个或多个元层,6.3.3 基于构件的软件演化,工作在基层中的实体执行系统正常的业务功能,而工作在元层中的实体负责建立和维护系统的自我描述 软件构件之间的交互是通过连接件中相关信息的变化来实现的,同时,这种信息的变化可以触发和驱动系统自身的调整 演化平台可以截获构件之间的调用请求和构件状态,6.3.3 基于构件的软件演化,当接收到演化命令时,演化平台将调用请求阻塞,根据体
13、系结构配置信息对构件进行重新组装和部署 完成连接件的重定向并释放构件的调用请求 基于构件的演化与面向对象的演化既有一定的区别,又有一定的联系 软件构件的实例是一种更为复杂的对象,在更新时仍然需要借助面向对象的演化方法,6.3.4 基于体系结构的软件演化,从宏观的角度来刻画软件演化问题,一种行之有效的手段就是从软件体系结构出发,来把握整个系统的更新问题 由于系统需求、技术、环境和分布等因素的变化,最终将导致系统框架按照一定的方式来变动,这就是软件体系结构演化 如果单纯从系统是否运行的角度出发,软件体系结构演化包括:静态演化和动态演化,6.3.4 基于体系结构的软件演化,在非运行时刻,系统框架结构
14、的修改和变更被称为软件体系结构的静态演化 在运行时刻,系统框架结构的变更被称为软件体系结构的动态演化 软件体系结构静态演化 在停止运行的状态下,体系结构演化的基本活动包括:删除构件、增加构件、修改构件、合并构件和分解构件,6.3.4 基于体系结构的软件演化,在体系结构的静态演化中,表面上看是对构件进行增加、替换和删除操作,但是,实质上这种变化蕴涵着一系列的连带和波及效应,更多的表现为变化的构件和连接件与其它相关联的构件和连接件的重新组合与调整 在静态演化阶段,对软件的任何扩充和修改都需要在体系结构的指导下来完成,以维持整体设计的合理性和性能的可分析性,为维护的复杂性和代价分析提供依据,6.3.
15、4 基于体系结构的软件演化,软件体系结构动态演化 在软件体系结构的动态演化中,要求框架结构模型不仅具有刻画静态结构特性的能力,而且还应该具有描述构件状态变化和构件之间通过连接件的相互作用等动态特性的能力 需要将构件之间的相互作用与约束细化为构件与连接件之间的相互作用与约束 从不动点转移的角度来看,软件体系结构静态演化实质上是动态演化的一个子过程,6.3.4 基于体系结构的软件演化,软件体系结构演化可以分为以下四个阶段: 设计时的体系结构演化,随着对系统理解的不断深入,系统的整体框架会越来越清晰,这本身就是一个体系结构设计方案不断完善的过程 运行前的体系结构演化,此时,框架各部分所对应的代码已经
16、被编译到软件系统中,但系统还没有开始运行 安全运行模式下的体系结构演化,这种演化方式又称受限运行演化,系统运行在安全模式下,即系统的运行要受到一定条件的约束和限制,6.3.4 基于体系结构的软件演化,运行时刻的体系结构演化,在系统运行过程中,框架演化通常与构件演化密切相关 软件体系结构对于系统演化的意义主要表现在以下几个方面: 对系统的框架结构进行形式化表示,提高软件的可构造性,从而更加易于软件的演化 体系结构设计方案将有助于开发人员充分地考虑将来可能出现的各种演化问题、演化情况和演化环境,6.3.4 基于体系结构的软件演化,在应用系统中,软件体系结构以一类实体显性地被表示出来,被整个运行环境
17、所共享,可以作为整个系统运行的基础 体系结构对系统的整体框架进行了充分地描述,说明了构件与构件之间的对应关系、构件与连接件之间的连接关系、以及系统架构的配置状况,在系统演化阶段,可以充分地利用这些信息 在设计系统的框架结构时,通常将相关协同逻辑从计算部件中分离出来,进行显式地、集中地表示,同时,解除系统部件之间的直接耦合,这会有助于系统的动态调整,6.3.4 基于体系结构的软件演化,从软件更新的角度来看,软件演化和软件维护有着非常密切的联系 软件维护是对已交付的系统进行修改,使目标系统能够完成新任务,或是在新环境中完成同样的功能,主要指在维护期间对现有系统的修改活动 软件演化则着眼于整个软件生
18、命周期,从功能行为角度来观察系统的变化,是软件的一种向前发展过程,主要体现在软件功能的不断完善 在软件维护期间,通过具体的维护活动可以使系统不断地向前演化,6.4 软件静态演化技术,静态演化可以是一种更正代码错误的简单变更,也可以是更正设计方案的重大调整,可以是对描述错误所作的较大范围的修改,还可以是针对新需求所作的重大完善 在演化时,首先根据用户的需求变动,开发新功能模块或更新已有的功能模块,然后编译链接生成新应用系统,最后部署更新后的软件系统,6.4 软件静态演化技术,静态演化技术的优点是:在更新过程中,不需要考虑系统的状态迁移和活动线程问题 静态演化技术的缺点是:停止应用程序意味着停止系
19、统所提供的相关服务,也就是使软件暂时失效 软件静态演化的步骤包括: 软件理解:查阅软件文档,分析系统内部结构,识别系统组成元素及其之间的相互关系,提取系统的抽象表示形式,6.4 软件静态演化技术,需求变更分析:软件的静态演化往往是由于用户需求变化、系统运行出错和运行环境发生改变所导致的 演化计划:对原系统进行分析,确定更新范围和所花费的代价,制定更新成本和演化计划 系统重构:根据演化计划对原软件系统进行重构,使之能够适应当前的需求 系统测试:对更新后的软件元素和整个系统进行测试,以查出其中的错误和不足之处,6.4 软件静态演化技术,软件静态演化的过程模型,6.4 软件静态演化技术,在对系统功能
20、进行更新时,最简单的机制就是创建相关类的子类,然后重载需要变更的方法,利用多态性来调用新创建的方法 在开发构件时,通常采用接口和实现相分离的原则,构件之间只能通过接口来进行通信 具有兼容接口的不同构件实现部分可以相互取代,在静态演化过程中,这已经成为一条非常有效的途径,6.4 软件静态演化技术,在基于构件的开发模式中,经常出现的构件接口与系统设计接口不兼容的情况包括:接口方法名称不一致和参数类型不一致 为了提高软件演化的效率,通常使用构件包装器(Component Wrapper)来修改原构件的接口,包装器对构件接口进行封装以适应新的需求环境 在构件包装器中,封装了原始构件,同时提供了系统所需
21、要的接口,这样就解决了构件接口不兼容的问题,6.4 软件静态演化技术,包装器的实质是一个筛选器,将对原构件的请求进行过滤并调用对应的方法 将一个或多个构件作为复合构件的组成部分,包装允许构件组合和聚集起来完成新的功能,6.4 软件静态演化技术,继承机制也可以实现构件演化 新创建的构件是通过继承原构件而获得的,是原构件的子类型 子类型化是通过加强原构件创建一个新构件,并重用其实现部分来完成的 在原构件的基础上,使用继承机制来创建子构件,并按照需求重新实现相关的虚函数,就可以完成构件演化任务,6.4 软件静态演化技术,6.4 软件静态演化技术,软件体系结构给出了系统的整体框架,可以作为设计、实现和
22、更新的基础,承担了“保证最经常发生的变动是最容易进行的”这一重担 在软件静态演化过程中,对系统任何部分所作的扩充和修改都需要在体系结构的指导下来完成 以软件体系结构为基础,对系统需求变化进行整体把握,将有助于确定系统更新的最佳方案,更好地控制软件质量和演化成本,6.4 软件静态演化技术,软件体系结构演化基本上可以归结为3类 局部更新是指修改单个软件构件,包括:构件删除、构件增加和构件修改 非局部更新则是指对几个软件构件进行修改,但不影响整个体系结构,包括:构件合并、构件分解和若干个构件的修改 体系结构级更新则会影响到系统各组成元素之间的相互关系,甚至要改动整个框架结构,6.4 软件静态演化技术
23、,局部更新是最经常发生的,也是最容易实现的 在系统功能发生调整时,会出现非局部更新,其处理过程要相对复杂一些 当系统功能发生重大变化时,会发生体系结构级更新 在正交体系结构中,因为线索是正交的,因此,每一个需求变动只影响一条线索,而不涉及其它线索,6.4 软件静态演化技术,需求变动只对相关模块起作用,不会影响到其它模块,从而使系统的修改更加容易实现 当应用程序发生演化时,可以在原软件结构的基础之上,通过新增、修改和删除线索来生成新系统的框架结构 整个演化过程是以原结构的线索和构件为基础,由左向右自顶向下来进行的 正交软件体系结构的演化过程如下: (1)需求变动归类,6.4 软件静态演化技术,(
24、2)制定体系结构演化计划 (3)修改、增加或删除构件 (4)更新构件之间的相互作用 (5)产生演化后的软件体系结构 (6)迭代,如果第(5)步得到的体系结构不够详细,还不能实现变化的需求,可以对(3)(5)步进行多次迭代 (7)对以上步骤进行确认,进行阶段性技术评审,6.4 软件静态演化技术,6.5 软件动态演化技术,为了支持软件的动态演化,人们在编程语言和工作机制方面做了大量探索性的研究工作 基于硬件的动态演化,使用多个冗余的硬件设备,用于软件的动态升级服务 动态装载,在编程语言方面,引进相关机制来支持软件系统的动态演化 动态类:在软件运行过程中,类的实现可以动态地变化 冻结”策略,系统等待
25、已存在的旧版本的对象被客户释放,6.5 软件动态演化技术,“重建”策略,系统使用动态类的新版本来创建相关对象,同时,将旧版本的对象的状态信息拷贝到新对象中 “共存”策略,动态类新、旧版本的对象共存,但是,以后对象的创建使用动态类的新版本 在实现动态类时,通常需要引入代理(Proxy)机制 代理负责维护动态类的所有实现版本和实现版本的外部存储 代理机制下的动态类是一种轻量级的动态演化技术,它不需要编译器和底层运行环境(例如:操作系统和虚拟机)的支持,比较容易实现,6.5 软件动态演化技术,6.5 软件动态演化技术,中间件为运行构件的动态替换和升级提供了相关实现机制,主要包括:命名服务、反射技术和
26、动态适配等 在命名服务机制中,给构件实例命名,以便客户使用名字来获取构件实例 反射技术是软件的一种自我描述和自我推理,它提供了系统关于自身行为表示的一种有效手段 动态调用接口支持客户请求的动态调用,动态骨架接口支持将请求动态地指派给相对应的构件,6.5 软件动态演化技术,基于构件的动态演化 按照功能划分,将构件的接口分为两种:用于处理构件所提供的服务,即行为接口,用于处理构件的演化,即演化接口,演化接口被设置成在特定的服务接口被调用时起作用 在使用构件时,可以通过访问演化接口,为相关的动态插入点定义回调(CallBack)方法,增加或替换成用户需要的代码 基于过程的动态演化,6.5 软件动态演
27、化技术,形式化描述系统在运行过程中的状态,建立系统的状态机模型 在状态机模型中,系统的演化可以对应于状态的迁移 基于体系结构描述语言的动态演化 在体系结构描述语言中,增加动态描述成份,通过语言来定义构件之间是如何进行互操作的,构件是如何被替换的,以实现动态演化 基于体系结构模型的动态演化 这类方法是通过建立一个体系结构模型,并使用这个模型来控制构件行为,控制结构改变和行为演化,6.5.1 动态软件体系结构,目前,软件体系结构的研究主要集中在静态体系结构上,对系统设计方案和设计框架进行静态描述 软件体系结构的静态描述方法缺乏动态更新机制,很难用它来分析和描述实时、不间断运行的系统,更不能指导系统
28、的动态演化 软件体系结构静态描述方法已经不能适应越来越多的运行时所发生的系统需求变更,动态软件体系结构(Dynamic Software Architecture,DSA)应运而生,6.5.1.1 动态软件体系结构的概念,DSA的特殊之处在于:随着外界环境的变化,系统的框架结构可以进行动态调整 DSA的动态性指的是:在运行时刻,由于需求、技术、环境和分布等因素的变化,框架结构会发生改变 DSA允许系统在运行过程中对其体系结构进行修改,这主要是通过其框架结构的动态演化来实现的,6.5.1.1 动态软件体系结构的概念,软件体系结构的动态演化主要包括以下几个方面: 属性改变 行为变化 拓扑结构改变
29、风格变化 在运行时刻,要全面地支持软件体系结构的演化,必须解决好以下几个问题: DSA的形式语义规约,6.5.1.1 动态软件体系结构的概念,软件框架和模型的定义 在运行时刻,软件体系结构必须作为有状态、有行为和可操作的实体形式存在,能够准确地描述目标系统的真实状态与行为 灵活的演化计划和处理机制,综合考虑和协调动态演化过程中的诸多因素,给出系统动态配置的完整方案 在替换构件时,不仅要使它们的接口保持兼容,而且要保证替换前后构件的外部行为也一致 良好的运行平台支持,6.5.1.1 动态软件体系结构的概念,DSA的演化是研究的重点,主要包括:演化需求、演化阶段和演化步骤等几个问题 DSA的演化需
30、求是指引起软件框架在运行时刻发生改变的因素,分为内、外两种因素 内因,即软件内部执行所导致的体系结构改变 外因,即系统的外部请求所引起的软件重新配置 DSA的演化发生在四个时期,即设计时、预执行时、受约束运行时和运行时,6.5.1.1 动态软件体系结构的概念,设计时演化的对象是体系结构模型,发生在与之相关的代码编译之前 预执行时演化发生在编译之后和系统执行之前 受约束运行演化只发生在某些特定的约束条件下 运行时演化,即系统框架结构在运行时不能满足要求所作的修改 DSA实施动态演化的步骤如下: 捕捉分析需求变化 生成体系结构演化策略,6.5.1.1 动态软件体系结构的概念,根据演化策略,实施软件
31、体系结构的演化 演化后的评估与检测 动态更新的原则 运行时软件的演化过程应该不破坏体系结构的正确性、一致性和完整性,为了便于演化后的维护,还需要进一步考虑演化过程的可追溯性 一致性:在动态更新之后,原系统中正在执行的实例能够成功地转换到新系统中继续执行,并保证转换后的执行过程不会出现错误 正确性:更新后的系统仍然是稳定的,6.5.1.2 动态更新的原则,完整性:动态演化不破坏体系结构规约中的约束,演化前后的系统状态不会丢失,否则系统将变得不安全,甚至是不能正确运行 可追溯性:应该被延伸到运行时刻,保证系统的任何一次修改都会被验证 设计过程应该满足以下要求: 系统结构描述语法的完整性,描述语法的
32、完整性可以让设计者通过语法检测来发现更新后的框架结构中所存在的一些问题,6.5.1.2 动态更新的原则,数据的连贯性,删除一个构件,可能导致后续构件的输入不连贯,通过增加相关机制来提供后续构件的输入,或者删除那些输入数据不连贯的后续构件 语义的正确性,在框架结构发生变化后,语义正确性可以保证系统仍然能够正确地执行 失败的原子性,如果一个动态更新操作执行失败或者被取消,则该更新不能继续执行 数据的正确性,为了实现数据恢复,每次更新数据都要保存数据日志,6.5.1.3 基于构件的动态体系结构模型,CBDA(Component Based Dynamic Architecture),即所谓的基于构件
33、的动态体系结构模型,是一种典型的动态更新框架 CBDA模型支持系统的动态更新,主要包括三层:应用层、中间层和体系结构层 应用层处于最底层,包括构件连接、构件接口和执行三个部分 构件连接定义了构件与连接件之间的关联关系 构件接口说明了构件所提供的相关服务,例如:消息、操作和变量等,6.5.1.3 基于构件的动态体系结构模型,在应用层中,可以添加新构件、删除或更新己有的构件 中间层包括连接件配置、构件配置、构件描述以及执行四个部分 连接件配置管理连接件和接口通信 构件配置管理构件的所有行为 构件描述则说明构件的内部结构、行为、功能和版本信息 在中间层中,可以添加版本控制机制和不同的构件装载方法,6
34、.5.1.3 基于构件的动态体系结构模型,体系结构层位于最上层,用于控制和管理整个框架结构,包括体系结构配置器、体系结构描述和执行三个部分 体系结构描述说明了构件和它们所关联的连接件,阐述了体系结构层的功能行为 体系结构配置器控制整个分布式系统的执行,管理配置层 在体系结构层中,可以扩展更新机制,修改系统的拓扑结构,更新构件到处理元素之间的映射关系,6.5.1.3 基于构件的动态体系结构模型,6.5.2 动态软件体系结构的意义,研究DSA的意义在于: 减少系统开发的费用和风险,在以任务和安全性为主的系统中,如果使用动态软件体系结构,那么运行时改变框架结构可以减少由此所带来的成本开销 提供自定义
35、功能和可扩展功能,动态软件体系结构为用户提供了更新服务,以实现系统属性的动态修改,6.5.3 动态体系结构描述语言,说明构件、连接件及其配置关系的语言,就是体系结构描述语言ADL ADL无法刻画系统的动态行为,也不能描述运行时的框架结构 在ADL的基础之上,许多学者提出了动态ADL的概念 动态ADL可以分为形式化描述语言和非形式化描述语言两种,目前的研究主要以形式化描述语言为主,6.5.3 动态体系结构描述语言,形式化动态ADL具有以下几点特性: 能够描述构件和连接件等独立实体,在软件体系结构中,能够说明构件和连接件的属性,例如:构件的抽象层次和连接件的通用性等 能够描述构件与连接件之间的交互
36、关系,检查构件和连接件的一致性 在运行时刻,能够描述软件体系结构的演化过程 DSA的形式化描述语言主要包括:图的方法、基于进程代数的方法、基于图和进程代数的方法和逻辑重写方法,6.5.3 动态体系结构描述语言,基于图的方法: 在该方法中,使用图结点来描述构件,利用边来表示连接件 引入了协调管理机制,使用图重写(Graph Rewriting)规则来描述框架结构的动态特征 比较典型的语言包括:CHAM语言、Le Metayer语言和Dynamic Wright语言 基于进程代数的方法: 该方法可用于并发系统的设计,主要涉及代数和微分知识,6.5.3 动态体系结构描述语言,比较典型的语言有:Dar
37、win语言、-ADL语言和D-ADL语言 基于图和进程代数的方法: 该方法融合了图论和进程代数的相关优点 比较典型的语言有:SAAM模型描述语言和JB/SADL语言 逻辑重写方法: 比较典型的语言包括:C2SADL语言和Rapide语言,6.5.3 动态体系结构描述语言,非形式化动态ADL主要采用XML技术来实现 比较典型的语言是ABC/ADL 相对于形式化描述方法而言,非形式化方法具有表达直观和易以理解的特点,在精确性方面,却远不及形式化方法,而且也不能支持各种特性的分析与验证工作,6.5.4 动态演化工具,在各个不同的演化层面上,都存在着极具代表性的软件演化平台 意大利学者Cazzola设
38、计了mChaRM工具,利用多信道元模型来完成实体之间的调用 StarDRP是由国防科技大学研制和开发的,这是一种基于CORBA构件的动态配置模型 PKUAS是一种基于J2EE的构件演化工具,由北京大学自主研发,主要应用于电力部门 青鸟软件构架动态模拟运行工具,能够支持系统的动态模拟和动态演化,6.5.4 动态演化工具,加州大学Irwine分校实现了基于软件体系结构的开发和运行环境ArchStudio Argo提供了体系结构的图形化描述和操作手段 ArchShell给出了文本和命令式的体系结构变更语言 扩展向导提供了一种可执行的脚本更改语言,用以完成体系结构的连续演化 体系结构演化管理(Arch
39、itecture Evolution Manager,AEM)将通报这些变化,有权利撤销破坏系统整体性能的演化请求,6.5.4 动态演化工具,6.5.4 动态演化工具,软件体系结构助理(Software Architects Assistant,SAA)是动态框架支持工具 是一个交互式图形化工作环境,可以用来描述、分析和构建动态体系结构 在SAA的图形化环境中,体系结构设计人员可以描述Darwin系统的结构模型,6.6 可演化软件的设计,为了使软件具有演化能力和应对外界环境变化的能力,具有较强的灵活性和适应性,在设计时,应该遵循以下原则: 系统具有较强的结构性 开发初期应考虑软件的演化能力 采用面向对象和构件技术 分离构件与连接件 分离代码和数据,本章讲授内容已结束,谢谢,