动态增量式AOP框架的研究与实现
2013-07-22杨曦,李彤
杨 曦,李 彤
1.福州大学 阳光学院,福州 350015 2.云南大学 软件学院,昆明 650091
动态增量式AOP框架的研究与实现
杨 曦1,李 彤2
1.福州大学 阳光学院,福州 350015 2.云南大学 软件学院,昆明 650091
1 引言
软件是对现实世界问题空间与解空间的具体描述,是客观事物的一种反映,是人类思维的外化产物[1]。由于人类思维的多样性和易变性,导致软件也在不停地“运动”、“变化”。尤其互联网成为主流计算环境之后,软件变化性、复杂性更是进一步增强,导致软件工业的危机频频发生。鉴于此,人们纷纷从不同视角对软件理论、技术和方法进行研究(例如从软件形态方面提出了网构软件[2]的概念;从网络资源整合角度,提出了网格计算、普适计算、云计算等;从计算模式方面,提出了自治计算[3]、自适应软件、SOA等)。纵观所有这些新的概念、思想和理论,都牵涉到一个共同的问题:开放计算环境下软件系统的动态演化理论和应用研究。而开放计算环境下软件系统的动态演化[4]理论和应用的研究尚处于起步阶段,相关研究成果在理论基础(例如对条件超图文法[6]等的研究缺少坚实的理论基础)、覆盖面(例如Gilgul只能解决有限的软件动态演化问题,Walter Czaaola提出的反射元模型[7]仅支持预设的演化)、实现难易度(例如反射技术、动态指派技术、K-Commponent[8]等都有较大的实现难度)等方面都存在着不足。另一方面,关注点分离的思想在解决软件危机方面起到了至关重要的作用。而AOP(Aspect-Oriented Programming,面向方面的编程)对横贯多个功能模块的非功能性维度(横切关注点)能进行有效封装,实现了多维度的关注点分离,是OOP方法的合理补充。但如何提高编织效率也是AOP面临的重要挑战。本文在基于C++的面向方面的编程框架中引入Bigraph图论[9]的动态演化思想,解决了系统演化行为一致性和相容性的问题,同时使用增量式编织机制实现了方面的高效编织,某种程度上对AOP技术和动态演化的发展有着重要的促进作用。
2 AODF编程框架的提出
多年来,许多研究人员都致力于研究新的更符合人类认知行为的、趋于多维度思想的模块化机制,以解决因为关注点分离不足而导致的诸多问题。而新的关注点分离思想的关键点在于如何克服单维度思想的功能性主体在OOP设计及实现中的专制性,从而对横切关注点实现高内聚、低耦合的有效封装。AOP思想由此应运而生,早在1997年欧洲召开的面向对象编程大会上,Gregor等就首次提出了AOP的概念[10]。AOP保留了面向对象的抽象增强、模块化和代码重用等目标,依据信息隐蔽性的原则,允许开发者动态修改面向对象模型,实现更高程度的关注点分离。作为一种思维形态,AOP本身并未规定具体的实现形式。为顺应定义上的标准,本文参考了AspectJ的相关概念和原理,其中包括Aspect(方面)、Joint Point(连接点)、Pointcut(切入点)、Advice(通知)、Inter-type declaration(类型间声明)、Weave(编织)等。
另一方面,C++作为传统类型上的OOP语言,在很多领域尤其是嵌入式系统,有着不可替代的地位。国内外关于C++的AOP研究虽有所发展,如C++模版技术[11-12]是根据参数类型生成通用类和通用函数,某种程度上实现了软件复用;Aspect C++用C++语言实现了AspectJ,还有宏编程[13]等,但这些都无法支持AOP架构的动态演化,并且在编织效率上也有所欠缺,从而只是片面实现了AOP概念[14]。本文提出一种动态AOP编程框架——AODF[15](Aspect-Oriented Dynamic Framework),是支持C++语言扩展(Language Extension)的方面编程环境。图1为AODF的总体结构。可以看出,AODF事实上是方面代码到标准C++源码的前端转换系统,从语言层提供对方面的支持,无需改动语言本身任何结构及特性,就可以实现遗留系统面向方面的扩展。而且支持自编制和可配置两种类型的方面,并可配置为标准组件入库,实现方面的重用。AODF的动态演化性主要由方面配置管理器的“动态演化设置”模块实现(第3章),而基于日志技术的增量式编织机制由方面配置管理器的“增量式编织”模块实现(第4章)。AODF的原理及具体实现将在第5章详述。
3 AODF的动态演化性
动态演化是网格计算、普适计算、云计算等开放计算环境的基础,近年来逐渐成为学术界研究的热点。动态演化的研究主要集中于语言、模型和运行环境三个方面,而软件体系结构(Software Architecture,SA)对动态演化的支持,也体现为以体系结构为核心的应用模式和软件框架的研究。例如:J.Dowling等人设计的 K-Commponent[8]框架元模型通过提供体系结构元模型和适配契约(Adaptation Contracts)来支持系统动态配置。Walter Czaaola提出由拓扑元对象和策略元对象形成体系结构反射元模型,但也仅支持预设的演化[7]。国内徐洪珍等提出用约束超图表示SA,用条件超图文法建模SA的动态演化过程[6],但未能解决SA动态演化行为一致性的问题。本文基于Bigraph的图形化理论将动态演化的思想结合到AOP的软件体系结构中,试图解决软件系统演化的行为一致性和相容性问题。
AODF的动态演化特性主要由动态演化设置模块实现,该模块的设计基于Bigraph理论。Bigraph具有完备的公理系统,其直观的图形化表述不仅方便SA建模,而且还有相关的项语言(term language)[15]对系统性质进行推理和演绎。另一方面,Bigraph理论为软件演化的一致性和相容性等问题也提供了理论基础。
3.1 Bigraph反应系统
图1 AODF系统框架
为建模方面SA的动态演化,对Bigraph静态结构的定义进行了扩展,使其能够描述AODF编程框架。然后运用BRS(Bigraph反应系统)的反应规则表示AODF的动态演化操作,将动态演化操作转换为BRS上的操作。以银行的ATM系统为例,核心关注点有取款和登录模块等,横切关注点主要有用户验证,所以把用户验证模块提取为方面(AsV)。当执行取款操作时,ATM系统需再行验证用户的取款权限,所以取款模块执行之前要切入“取款权限验证”方面(AsAu),这就需要对系统进行演化操作。图2为ATM系统动态演化前后的Bigraph图形及项语言。上半部分为ATM演化前的Bigraph图及项语言,在Bigraph反应系统中使用反应规则,将取款(W)节点动态插入(演化操作)新的方面节点AsAu,使其转换为Bigraph ATM'(图的下半部分),实现了取款之前进行权限验证的动态演化操作。
图2 ATM动态演化前后的Bigraph图及项语言
Bigraph从软件体系结构层面支持动态演化,从而可以把AODF看成一个Bigraph,这样对体系结构的演化操作可通过对Bigraph进行转换来实现。BRS中的反应规则可以表示动态重配置,则AODF的动态演化过程就可以映射为BRS中一个Bigraph通过反应规则转换为另外一个Bigraph的过程。用Bigraph的图形表述软件体系结构的演化更加直观,项语言的形式化理论有利于下一步对软件演化特性的验证。
3.2 Bigraph演化的完整性
Bigraph静态和动态特性所基于的范畴论,其中最为重要的IPO(Idem Pushout)和RPO(Relative Pushout)的数学性质,可以证明在BRS中,当存在RPO和最小转换时,Bigraph之间的互模拟事实上是相合(Congruence)的。针对现有动态演化研究无法解决行为一致性和相容性问题,本文基于Bigraph为动态演化的形式化规约和性质验证提供一种有效解决途径。
Bigraph反应系统S=<R,r,R′>:R→R′,R和 R′都为Bigraph,分别为反应物和生成物,r为反应规则。
定理1(Bigraph演化相容性)当R和r满足系统约束的条件下,则通过该反应规则生成的R′也应满足系统的约束条件。
证明 设R为反应物Bigraph,R′为生成物Bigraph,r为反应规则。假设R和r均满足系统约束条件关系C。根据Bigraph项语言操作语义可知,从R中可分离出Bigraph G,因为R满足C,则G也应满足C,于是R=G°r。从反应系统的迁移规则推导,可得出R′=G°r,又因为合成操作满足满射的数学特征,所以在G与r满足系统约束条件C的情况下,G′也满足系统的约束条件,命题得证。
同理可以得到推论1:
推论1反应物Bigraph集和反应规则集合ri(i=1,2,…,n)满足系统约束,则通过ri集合转换的生成物Bigraph集也同样满足系统的约束条件。
故可以得出结论,基于Bigraph完备性理论构建的演化系统具有完整性。
3.3 Bigraph演化的一致性和相容性
基于Bigraph完整性的基础,可以考虑演化的一致性和相容性。所谓一致性,可以是行为的一致,即生成物能完成反应物的任何行为;而相容性主要指系统演化前后行为的正确性,生成物不会导致死锁等问题。
定理2假设给定系统环境E及其构件c1、c2,对于反应规则集合 ri(i=1,2,…,n),存在相应标签序列 Li,使得,则称c1与c2相容。
证明 根据Bigraph理论的标签转换系统LTS[16]以及异步π演算原理[17]可知指构件c1、c2在上下文环境E中,针对r存在对应标签使构件间同步交互,并能正常终止的过程。根据相容性的定义,定理2得证。
引理 安全BRS中,若最小转换的等价互模拟相合,即x~y,则对任意活动上下文z,有 z°x~z°y[12]。
定理3 BRS中存在RPO和最小转换时,则互模拟是同构的,即若x~y,则对任意活动上下文z,有z°x~z°y,同时x可以保持一致性演化至y。
证明 由引理可知,若最小转换的等价互模拟相合,即x~y,则构件x在任何上下文环境中,均能演化至y,根据行为等价性和互模拟性的定义可知,x可以保持一致性演化至y。
AODF的动态演化性是基于Bigraph理论的,故AODF的行为演化满足了一致性和相容性。
3.4 示例验证
如图3所示,某软件系统由客户端C、服务器端S及C与S之间通信连接件CN,系统未实施演化前,基于Bigraph图论解析出来的系统软件体系结构的Bigraph图为图3(a)。
图3 C/S软件架构的动态演化示例图
该系统主要演化行为是:AddService(当软件应用满足不了客户端功能和性能时,需在服务器端增加服务)和SendData(在客户端、服务器端之间传递数据的行为),根据这两种演化行为的反应规则,可以得到如下反应前后的项语言:
可以看到,图3(a)中客户端(C)的数据可以通过通信连接件(CN)传送至服务器端(S),经服务器端处理完后发送出去。显然图3(b)也能实现这一行为,即基于Bigraph理论演化后的系统可以模拟演化前的所有操作,并且反应规则均维持通信连接件的单一性。由定理2可知,该动态演化保证了C/S体系结构的完整性,因此可以验证该系统的演化是一致和完整的。
4 增量式编织机制
由于编织效率对软件性能影响较大,若对所有组件都采用简单的完全编织策略,势必导致编织效率低下。AODF采用增量式编织机制,结合方面的动态演化设置,可以实现更高效的编织。增量式编织机制主要由方面配置管理器的“增量式编织”模块实现。实施增量式编织最核心的问题是演算编织状态的改变量。计算出方面状态的改变量,则只需对修改部分进行编织,而无需针对整个aspect进行完全编织,从而能够较好提升编织效率。增量式编织的原理如图4所示。
为了方便编织,AODF方面组件库中的组件都被赋于如图4所示的四种属性值,若最近编织时间为0,则需要完全编织,根据“连接点设置”模块生成的编织匹配集进行源代码的织入,具体织入规则参看5.3节。若“最近编织时间-最近修改时间”大于等于0说明方面无变更,则无需编织;若小于0,则需要进行增量式编织。实现增量式编织的重点是计算编织状态的改变量,即图4中的∆weave,先对方面进行量化的结构描述及匿名切入点命名转化后,将其存储模型定义为三个集合:切入点集、连接点集、通知集。以切入点为中心组成线性链表,链表中每个节点包含3个指针域和一个键值域,指针分别指向连接点集、通知集及下一节点,每个连接点及通知均设置了标志位,可标示新增状态、删除状态和初始态。通过对连接点、通知状态的判定,很容易计算出编织状态改变量,从而实现增量式编织。
AODF基于日志系统来构建增量编织机制,创建了三种日志,IndexLog用于索引编织日志(WeaveLog),目的是加快检索编织状态,每个日志项是一个三元组〈Slant(记录方面编织状态信息在WeaveLog中的相对偏移量),Count(记录方面编织次数),AspectID(方面标识号,关键字)>;WeaveLog记录了方面的编织历史及更新历史,其日志项为四元组〈AspectID,CurrentWeaveStatus(当前编织状态),LastWeave(最后一次编织时间),LastUpdate(最后一次更新时间)>;SysLog存放一些系统全局信息,日志项是一个两元组〈AspectID,Count>。IndexLog用哈希表存储,每个关键字AspectID对应一个存放着aspect信息的哈希桶,当aspect被编织或重编织时,将编织计数值Count及偏移量Slant存入桶中,则最新的方面状态索引项总处于哈希桶的顶部。采用哈希表的存储结构的目的是让索引时间复杂度降为O(1),避免了对整个索引日志的遍历,从而提高AOP的效率。
5 AODF的实现及实验情况
AODF主要由源码转换器、方面组件生成器和方面配置管理器组成,下面将分别阐述。
5.1 源码转换器
源码转换器主要包括源码扫描、语法分析、语义分析三个模块。
图4 增量式编织原理
源码扫描模块的主要任务是对源程序从前到后逐个字符扫描,经解析后,依次读取、判断源代码文件中的每一个符号,包括标识符、关键字、运算符、常量、分隔符和注释等,得到源代码文件的标识符集合,保存在指定的Token链表中。
语法分析模块的任务是在源码扫描基础上,根据C++的语法规则判断输入串语法正确与否,若无错误就能正确生成语法树,以语法树的形式将符号token序列分解成各类语法单位。这里选择Lemon来辅助完成语法分析工作,根据C++标准语法规则生成的C++语法分析器,辅助语法分析模块生成语法树。该模块的输入为标识符流,输出为语法树根节点,用于连接点查找及进一步的语义分析。
AODF中的语义分析模块对语法分析模块生成的语法树进行简单扫描,用指针链表的形式存储语法树中的类及函数的相关信息(包括类和函数名、属性列表、方法列表、函数所属类、参数列表、返回值类型等),生成符号仓库用于连接点设置,所以无需进行完整的C++语义解析。
5.2 方面组件生成器
方面组件生成器负责扫描程序员按方面语法规则编写的aspect代码,按规定格式将方面的名字、属性和方法,切入点的属性和类型,通知的类型和代码等提取出来,输出到方面配置管理器的织入模块。方面组件有两种情况:一种是自编制的方面组件,即可以重新定义切入点、连接点、通知等,生成新的、独立的方面组件,经方面组件生成器解析后,提取放入到方面组件库待用;另一种是可配置方面组件,通过配置文件,可以像使用库函数一样来使用方面,直接读取到方面配置管理器中进行动态演化设置、连接点匹配及最终的代码织入。
5.3 方面配置管理器
方面配置管理器一方面对方面组件进行有效配置与管理,另一方面基于正确的连接点匹配,代码织入模块负责将方面组件编织进标识符流的相应位置,完成最终代码编织工作,方面配置管理器的工作流程如图5所示,主要有以下几个步骤:
(1)连接点查找
连接点查找模块主要对源码转换器生成的语法树和符号仓库依据连接点类型定义进行搜索,把源码中所有可能连接点找出,以链表形式保存在相应参数中。
(2)动态演化设置
C++构件、连接件经基于Bigraph公理系统的“SA析构模块”解析生成系统软件体系结构(SA)的Bigraph图,作为动态演化设置模块的输入,经动态演化设置模块解析为相应的项语言,根据反应规则,方面组件的织入行为转化为对Bigraph图及项语言的演化,经BRS反应系统演化后的生成物Bigraph和项语言交由连接点匹配模块进行进一步的连接点设置。
(3)连接点匹配
该模块根据动态演化设置模块传输过来的生成物Bigraph和项语言分析其织入行为,对每一个方面组件的CppAdvice对象分析切入点表达式,若与连接点查找模块生成的链表中的连接点标识符相匹配,则读取CppJointPoint类与符号仓库ClassDB进行匹配运算,若都满足条件,则需进一步判断连接点的类型并对其设置WeaveAction类属性。最后将设置好编织动作的连接点置入到匹配集链表jpweaveset中,供代码织入模块调用。
(4)增量式编织
增量式编织模块根据连接点编织匹配集,进行源代码的动态编织动作,而无需为了使用aspect而改动任何C++源代码。增量式编织关键要解决,编织状态的改变量(第4章)及不同类型的连接点织入到语法树位置的问题。AODF设定了如下编织规则:
①对于CALL类型的连接点:如果代码为_wrapper_code或_call_code型,则织入到语法树节点jpweaveset->caller_func的左兄弟节点所指的token之后;对于_replace_code型代码,织入到语法树节点jpweaveset->callnode的左兄弟节点所指的token之后,并删除callnode对应的整个子树的token序列。
②对于EXCUTION类型的连接点:将Before代码插入到语法树节点jpweaveset->func_info左兄弟节点所指的token之后;将After代码插入到语法树节点jpweaveset-> func_info右兄弟节点所指的token之后;最后将jpweaveset-> func_info所指的token重命名。
③对CLASS类型的连接点:直接将ClassCode代码插入到语法树节点jpweaveset->classrefNode所指的token之后。
图5 方面配置管理器工作流程
5.4 实验情况概述
为验证AODF编程框架能否实现设计的初衷——正确、高效、动态地织入方面代码,AOP的性能是否带来负面效应,都需要通过实验来验证。实验环境如表1所示。
表1 实验环境参数表
把编写好的aspect文件won.as和C++源代码文件main.cc存放在before目录下,after为编织后的代码保存路径,对编织前的代码before/main.cc和编织后的代码after/ main.cc进行测试对比,结果表明,aspect代码能准确织入到C++程序的相应位置,并正确地转化为标准C++语法,交由GC++、Visual C++等C++编译器可进一步编译执行。编织后的代码量相应增大,但编译时间仅略微增加。
为了分析AOP语言的执行性能,对AOP及OOP的编织、编译进行了多次实验,实验数据统计如图6所示。从实验结果可以看出,AOP编织时间比OOP的编译时间略大一些,因为AOP是构筑于OOP之上的,性能与效率肯定会受影响。但从实验结果可以看到,AOP的编织时间与OOP的编译时间相差仅毫秒级,这点差异与当前的计算机处理速度相比,几乎可以忽略。由此可以得出,AODF是一种有效的面向方面编程框架,能较好地对C++代码进行面向方面的扩展,实现多维度分离关注点的目的。对自行编制的aspect源码可设置为AODF的标准方面组件,既达到了对原有系统动态增加横切关注点这一非功能性主体的目的,又实现了方面的重用。使得源代码的可读性、易扩展性、可维护性更强。
图6AOP与OOP性能对比实验
6 结束语
在互联网技术成为主流计算环境的形式下,软件已逐步走向开放、动态和难以预测。人类思维的多变与不可控注定了软件的动态与复杂,而为软件开发提出有效的结构性框架已成为软件科学与技术面临的挑战性问题。本文提出一种基于C++的面向方面动态编程框架AODF,其作为一种语言扩展,使得C++遗留系统不必为使用aspect做任何变更;另一方面,增量式动态编织机制不仅使得编织效率得到提高,还使得AODF具有动态演化能力,而基于Bigraph理论的演化解决了行为一致性和相容性问题。但AODF还有许多需要改进的地方,比如,仅支持“织入”行为,未能实现“织入”行为的逆工程(比如动态删除方面、更新方面等)。下一步工作主要是提高连接点查找效率,改善编织算法,进一步研究对演化行为的后期度量及评审、对AODF耦合度的评估、对编程过程的形式化验证等。
[1]杨芙清.软件工程技术发展思索[J].软件学报,2005,16(1):1-7.
[2]梅宏,黄罡,赵海燕,等.一种以软件体系结构为中心的网构软件开发方法[J].中国科学:E卷,2006,36(10):1100-1126.
[3]陶丽,张自力.基于面向自治计算的Agent系统动态重构模型[J].计算机科学,2007,34(5):147-151.
[4]Lehman M M,Rail J F.Software evolution-background,theory,practice[J].Inf Process Lett,2003,88(1/2):33-44.
[5]Casanova M,Van-Der Straeten R,Jonckers V.Supporting evolution in component-based developmentusing component libraries[C]//Proceedingsof7th European Conference on Software Maintenance and Reengineering,2003:123-132.
[6]Xu Hongzhen,Zeng Guosun,Chen Bo.Conditional hypergraph grammars and its analysis of dynamic evolution of software architectures[J].Journal of Software,2011,22(6):1210-1223.
[7]Cazzola W,Pini S,Ghoneim A,et al.Co-evolving application code and design models by exploiting meta-data[C]// Proceedings of the 12th Annual ACM Symposium on Applied Computing(SAC’07),Seoul,South Korea,2007:1275-1279.
[8]Dowling J,Cahill V.The K-component architecture meta-model for self-adaptive software[C]//Proceedings of the 2001 Symposium on Software Reusability:Putting Software Reuse in Context,Toronto,Ontario,Canada,2001:41-50.
[9]Jensen O H,Milner R.Bigraphs and mobile processes(revised),UCAM-CL-TR-580[R].Cambridge:Computer Laboratory,University of Cambridge,2004.
[10]Kiczales G.Aspect-oriented programming[C]//Proceedings of ECOOP,Finland,1997:220-242.
[11]Czarnecki K,Dominick L,Eisenecker U W.Aspect-oriented programming in C++[Z].2001.
[12]Czarnecki K,Eisenecker U W.Generative programming:methods,tools,and applications[M].New York:ACM Press,2000.
[13]Dounence R,Fradet P,Südholt M.Composition,reuse and interaction analysis of stateful aspects[C]//Aspect-Oriented Software Development(AOSD),2004:141-150.
[14]Elrad T,Filman R E,Bader A.Aspect-oriented programming[C]// CACM,2001:29-32.
[15]杨曦,李彤.一种支持动态演化的AOP框架[J].计算机工程,2012,38(19):52-55.
[16]Jensen O H,Milner R.Bigraph and transition[C]//POPL’03 Proceedings of the 30th ACM SIGPLAN-SIGACT,2003,38(1):38-49.
[17]Amadio R M,Castellani I,Sangiorgi D.On bisimulations for the asynchronous π-calculus[J].TheoreticalComputer Science,1998,195:291-324.
YANG Xi1,LI Tong2
1.College of Sunshine,Fuzhou University,Fuzhou 350015,China 2.School of Software,Yunnan University,Kunming 650091,China
On the basis of AOP principles research,it proposes an aspect-oriented programming framework AODF,which introduces incremental weaving mechanisms based on log technology,not only improves the weaving efficiency,but also supports dynamic evolution based on the Bigraph theory and achieves behavior consistency and compatibility.On the other side,it provides the aspects with support from language layer,without changing any structure and characteristics of the language itself.Furthermore,the self_organizational aspect configurated by AODF can be added in the framework as the standard components so that the further system can reuse them.So the legacy system obtains aspect extended by AODF but no need to make any changes. Key words:Aspect-Oriented Programming(AOP);Aspect-Oriented Dynamic Framework(AODF);aspect-oriented;dynamic evolution;Bigraph theory
在研究AOP原理的基础上,提出一种面向aspect的编程框架AODF,采用基于日志技术的增量式编织机制,不仅提高了编织效率,而且基于Bigraph理论的AODF支持方面的动态演化,实现了行为的一致性与相容性。另外,AODF从语言层提供对方面的支持,无需改动语言本身任何结构及特性,而且可以把自行编制的aspect配置为标准组件入库,实现方面的重用。从而使得遗留系统无需变更就可以获得面向方面的扩展。
面向方面的编程(AOP);面向方面的动态框架(AODF);面向方面;动态演化;Bigraph理论
A
TP311
10.3778/j.issn.1002-8331.1305-0466
YANG Xi,LI Tong.Research and implementation of AOP framework based on incremental dynamic evolution.Computer Engineering and Applications,2013,49(23):39-44.
国家自然科学基金(No.60963007);福建省教育厅科技项目(No.JB11251)。
杨曦(1977—),女,讲师,CCF会员,研究领域为软件动态演化、构件选择优化;李彤(1963—),男,博士,教授,博士生导师,研究领域为软件演化、形式化方法。E-mail:Yangxi@fzu.edu.cn
2013-06-03
2013-08-26
1002-8331(2013)23-0039-06