一种避免行为层组合时行为变体重复编织的处理方法

文档序号:8498599阅读:618来源:国知局
一种避免行为层组合时行为变体重复编织的处理方法
【技术领域】
[0001]本发明涉及一种面向上下文编程中避免行为层组合时行为变体重复编织的处理方法,特别是避免JCOP声明式行为层组合的行为变体重复编织,基于抽象语法树结构构造源程序的静态调用关系图,进一步采用基于调用关系图的调用关系检测方法,检测方法之间是否存在调用关系,从而决定是否插入监控语句,最终避免行为变体的重复编织,降低对现有JCOP运行支撑环境的影响。
【背景技术】
[0002]随着上下文在软件系统中发挥着越来越大的作用,开发和设计上下文敏感软件逐渐形成一种趋势。为了高效地进行上下文敏感软件的设计与开发,学者们提出了不同抽象级别的方案,其中既有软件体系架构级别,又有基于组件的设计。面向上下文编程(ContextOriented Programming, COP)方法为开发上下文敏感软件提供了语言级别的解决方案。
[0003]JCOP语言采用基于块结构的激活机制,是面向上下文编程中的主流语言之一。为了解决行为层激活语句在程序中散布(scattering)的问题,JCOP引入了声明式行为层组合。声明式行为层组合中,开发人员只需定义何时应该进行激活,以及激活哪个行为层。JCOP编译器以面向剖面编程的方式将激活语句插入到程序中的指定位置。
[0004]通常情况下,激活语句的插入位置是指定的方法调用前。JCOP语言也支持对程序中多个方法调用前编织行为层激活语句。然而,当两个方法之间在运行时刻存在调用关系时,现有编织方法会造成一条激活语句的重复编织。进一步地,激活语句中的行为变体对应的方法可能会重复执行,程序不能按照程序员预期的方式运行,发生不可预期的错误。
[0005]为了解决该问题,需要对现有编织方法进行修改,保证在运行时刻可能存在调用关系的方法之间不会重复编织同一条激活语句,从而保证程序按照开发人员的预期运行。

【发明内容】

[0006]发明目的:针对现有技术中存在的问题与不足,本发明提供一种面向上下文编程中避免行为层组合时行为变体重复编织的处理方法。
[0007]技术方案:一种面向上下文编程中避免行为层组合时行为变体重复编织的处理方法,包括如下部分:
[0008]I)避免行为层组合时行为变体重复编织的解决方案;
[0009]2)基于抽象语法树结构的调用关系图构造方法;
[0010]3)基于调用关系图的调用关系检测方法。
[0011]在抽象语法树上构造源程序的调用关系图,进而检测行为变体对应的方法之间的调用关系。面向剖面编程支持监控运行时刻控制流的关注点,借助面向剖面编程的这个功能,根据是否存在调用关系决定是否插入监控语句,避免激活语句的重复编织引起的行为层重复激活的问题。
[0012]静态调用关系图建立在程序的抽象语法树中,是抽象语法树的一部分,可通过抽象语法树的根节点进行访问。静态调用关系图基于类(继承)结构分析的结果,借助JastAdd框架的属性文法实现:利用综合属性收集调用关系图的入口信息,利用非终结属性构建调用关系图中的节点,利用非终结属性以及JastAddJ编译器现有的名字分析(NameAnalysis)建立表示方法调用关系的有向边。
[0013]调用关系检测方法,使用传递闭包算法,以广度优先遍历为基础,逐步求解调用关系图中节点的传递闭包;利用节点的传递闭包,可以判别节点之间是否可达,也即方法之间是否存在调用关系。若不存在调用关系,则不必插入监控控制流的语句,避免引入不必要的加在JCOP运行支撑环境上的负担;若存在,则继续插入相应的监控语句。
[0014]有益效果:与现有技术相比,本发明提供的避免行为层组合时行为变体重复编织的解决方案,该方案首先基于抽象语法树结构构造源程序的调用关系图,并在此基础上提供调用关系检测方法,通过对有调用关系的行为变体相应语句中插入面向剖面编程的监控语句,从而高效地解决行为层组合时行为变体重复编织的问题。
【附图说明】
[0015]图1为避免行为变体重复编织的解决方案的整体模块图;
[0016]图2为ClassDecl等节点的starter O属性计算过程;
[0017]图3为MethodDecl节点的callees()属性计算过程;
[0018]图4 为 Block、WhileStmt、TryStmt 节点的 callees O 属性计算过程;
[0019]图5为Assign节点的属性callees O计算过程;
[0020]图6 为 ClassInstanceExpr、AbstractDot 节点的 callees O 属性计算过程;
[0021]图7为一个简单的代码样例;
[0022]图8为代码样例的简单抽象语法树与调用关系图;
[0023]图9为节点可达性算法;
[0024]图10为简单下载器的核心代码;
[0025]图11为JCOP编译器和解决方案产生的关注点代码。
【具体实施方式】
[0026]下面结合具体实施例,进一步阐明本发明,应理解这些实施例仅用于说明本发明而不用于限制本发明的范围,在阅读了本发明之后,本领域技术人员对本发明的各种等价形式的修改均落于本申请所附权利要求所限定的范围。
[0027]1、避免行为层组合时行为变体重复编织的解决方案
[0028]为了解决行为层激活语句在程序中散布的问题,JCOP语言引入声明式行为层组合。声明式行为层组合在指定方法前激活某个行为层。JCOP语言也支持对程序中多个方法调用前编织行为层激活语句。然而,如果两个方法之间存在调用关系,便会造成行为变体的重复编织。为了解决这个问题,可利用面向剖面编程中的Cflow关注点(poincut)。如果运行时刻,方法之间不存在调用关系,即使没有Cflow关注点,程序仍然能够正确执行。Cflow关注点监控运行时刻的控制流,存在额外开销。为了消除不必要的Cflow关注点引入的额外开销,本解决方案基于抽象语法树构造源程序的静态调用关系图,借此来预估运行时刻的方法之间的调用关系,从而舍弃部分Cflow关注点,消除不必要的运行开销。
[0029]JCOP编译器基于JastAdd框架进行开发,JastAdd框架的核心数据结构是抽象语法树。本发明的解决方案在抽象语法树上进行扩展,由三个模块组成(如图1):调用关系图构造模块,调用关系检测模块,监控语句编织模块。
[0030]调用关系图构造模块,在抽象语法树上增加新节点和必要属性,构造调用关系图。
[0031]调用关系检测模块,基于构造好的调用关系图,采用有向图中顶点的传递闭包算法,判断方法之间是否调用关系。
[0032]监控语句编织模块,根据调用关系检测模块的结果,决定是否插入Cflow关注点。
[0033]2、基于抽象语法树结构的调用关系图构造方法
[0034]调用关系图是一种表示程序中各个方法调用关系的有向图。其中,图中顶点i表示程序中的某一个方法i,而边(i,j)表示方法i调用了方法j。调用关系图与一般有向图的不同之处在于,调用关系图中存在一个(多个)入口节点,这些入口节点表示程序中调用关系的起点。
[0035]调用关系图的入口节点
[0036]为了构造调用关系图,需要知道调用图的入口,也即每个线程的最开始执行的方法。
[0037]不管是单线程程序还是多线程程序,整个程序的入口都只能是main方法。main方法是主线程的开始方法。多线程程序中,其他线程的开始方法一般是run方法。因而,线程的开始方法有两类,一类是main方法,另一类是run方法。
[0038]为了获取线程开始方法,我们需要在抽象语法树的节点上定义一些属性。第一类属性指明了哪些树节点是线程开始方法,显然这些属性应该定义在表示方法的树节点上。在MethodDecl节点上定义综合属性isMainO和isRunO,这两个属性的默认值为假。isMainO属性表示的是该节点是否为前文提到的main方法,即验证方法签名是否一致。isRun O属性表示的是该节点是否为前文提到的run方法,这时需要验证两点:
[0039]1.方法签名是否一致;
[0040]2.该方法所在类是否继承自java.lang.Thread或其子类,或者实现了 java.lang.Runnable 或其子接口。
[0041]第二类属性的作用是从MethodDecl节点开始向抽象语法树根(Program节点)传递线程开始方法这一信息。一般而言,从MethodDecl节点回溯到抽象语法树根节点,依次经过ClassDecl节点,Compilat1nUnit节点,最后到达Proram节点。在这些节点上定义综合(聚集)starter O属性,如图2。Program节点将其所有孩子
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1