CN104461566B - 一种基于对象实例的行为变体的jcop扩展实现方法 - Google Patents
一种基于对象实例的行为变体的jcop扩展实现方法 Download PDFInfo
- Publication number
- CN104461566B CN104461566B CN201410820282.XA CN201410820282A CN104461566B CN 104461566 B CN104461566 B CN 104461566B CN 201410820282 A CN201410820282 A CN 201410820282A CN 104461566 B CN104461566 B CN 104461566B
- Authority
- CN
- China
- Prior art keywords
- behavior
- layer
- jcop
- variant
- object instance
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Abstract
本发明公开了一种基于对象实例的行为变体的JCOP扩展实现方法。上下文敏感软件中引入多线程编程使得上下文触发的跨线程行为变化成为常态,其中常见的是同一个类型的多个实例在应对相同上下文时,需要作出不同的行为变化。而现有面向上下文编程语言仅支持以类为单位的行为变体定义,难以满足此类应用场景的需求。发明专利申请提出了一个基于对象的行为变体模型,以此为基础,在JCOP语言中引入相应的语法设施,实现了一个扩展的JCOP语言,在编程模型和编程语言上解决了上述问题。
Description
技术领域
本发明涉及面向上下文编程中行为变体模型及编程语言实现方法,特别是基于对象实例的行为变体模型,扩展了JCOP编译器与运行环境。
背景技术
随着上下文在软件系统中发挥着越来越大的作用,开发和设计上下文敏感软件逐渐形成一种趋势。为了高效地进行上下文敏感软件的设计与开发,学者们提出了不同抽象级别的方案,其中既有软件体系架构级别,又有基于组件的设计。面向上下文编程(ContextOriented Programming,COP)方法为开发上下文敏感软件提供了语言级别的解决方案。随着应用场景的复杂化和对运行效率要求的提高,上下文敏感软件的开发中大量引入多线程编程,使得上下文触发的跨线程行为变化成为常态。一个典型的需求是,同一类型的多个实例在应对相同上下文时,需要作出不同的行为变化。
COP方法使用行为变体(behavioral variation)来描述能替代或者改变软件基本行为的行为。而传统的COP语言往往扩展自面向对象语言,行为变体是以面向对象编程中的方法/函数体现,即行为变体以类为单位进行定义。此种处理方法,要求开发人员在定义行为变体时,将对应同一个上下文的行为变体定义在一处(如同用类封装相关方法)。也导致了程序在运行时刻,激活某个行为变体,同一个类型的多个实例的行为只能发生相同的改变。
发明内容
发明目的:为了解决该问题,要求扩展行为变体的定义方式,使得同类型的不同对象实例在相同的上下文环境中拥有不同行为,即,上下文敏感软件的多线程编程中同一个类型的多个实例在应对相同上下文时,需要作出不同的行为变化场景需求。本发明基于此问题提出了一种基于对象实例的行为变体模型的JCOP扩展实现方法。
技术方案:一种基于对象实例行为变体的JCOP扩展实现方法,包括如下部分:
1)基于对象实例的行为变体模型;
2)实现该行为变体模型的用于扩展JCOP的语言机制;
3)JCOP扩展语言的编译器和运行支撑环境。
基于对象实例的行为变体模型,行为变体以对象实例为单位进行定义,区别于传统COP语言的以类为单位的定义方式。传统模型中,部分方法描述程序中的行为变化;行为层封装一组相关的行为变化,即行为层包含一组相关的部分方法。新模型中,行为层引入部分方法组用于描述一个行为变化以及其他备选行为变化,部分方法组被用来定义以对象实例为单位的行为变体。
基于上述语言模型,本发明扩展JCOP语言,引入两类关键字group和instancewith/instancewithout。
a)定义部分方法组group:
group部分方法签名({语句块1})({语句块2})…({语句块n})
该语句定义了多个具有相同方法签名的部分方法,并且这些部分方法(行为变体)依附于同一个类,该语法结构与普通的部分方法一样,需定义在行为层layer中。
b)实例激活instancewith/instancewithout
instancewith(行为层名layer,{对象实例obj1,obj2,…},{行为变体编号i,j,…})
该语句在指定的对象实例obj1上激活某行为层layer的第i个行为变体,在指定对象实例obj2上激活某行为层layer的第j个行为变体。
instancewithout(行为层名layer,{对象实例obj1,obj2,…})
该语句在指定对象实例obj1、obj2上去活行为层layer。
COP语言中,用行为层封装一组相关的行为变体;因而,激活行为行为层与激活行为变体同义。
所述编译器采用JastAdd开发框架实现。编译器输入为jcop源代码文件(.jcop)以及其他java源文件(.java);编译器首先利用词法分析器,语法分析器为整个代码建立抽象语法树,其次采用抽象语法树节点重写技术实现JCOP节点到Java节点的转化,最后利用原有java编译器进行编译;
所述运行支撑环境为引入对象级别行为层队列。新的激活机制,只能影响对象级别行为层队列。运行支撑环境不仅保证该行为层队列优先于线程级别的行为层队列执行,而且不同的对象级别行为层队列不会相互影响。
编译器会将支撑环境代码与源代码一起进行编译,最终生成可被标准Java虚拟机执行的class文件。
有益效果:与现有技术相比,本发明提供的基于对象实例行为变体的JCOP扩展实现方法,解决了上下文敏感软件中多线程编程经常遇到的问题:同一个类型的多个实例在应对相同上下文时,需要作出不同的行为变化。并且提供了一个可用的编译器及运行支撑环境。
附图说明
图1为同一上下文中多个同类实例的消息分发;
图2为编译器的结构图;
图3为代码编译前后,其抽象语法树节点的变化情形;
图4为两种行为层队列执行的先后顺序;
图5为Lego小车在不同上下文中左右轮的行为变化;
图6为Lego小车中定义部分方法组以及实例激活机制代码示例。
具体实施方式
下面结合具体实施例,进一步阐明本发明,应理解这些实施例仅用于说明本发明而不用于限制本发明的范围,在阅读了本发明之后,本领域技术人员对本发明的各种等价形式的修改均落于本申请所附权利要求所限定的范围。
1、基于对象实例的行为变体模型
传统COP模型中,行为变体(部分方法)表示改变或者替换软件基本行为的行为;行为层用于封装与特定上下文相关的一组行为变体;动态行为层激活机制则通过运行时刻激活行为层,从而能够动态地影响系统行为。
所述基于对象实例的行为变体模型,在上述模型中引入部分方法组。部分方法组用于描述特定上下文中类的实例拥有的同一行为的多种可能变化。部分方法组被用来定义以对象实例为单位的行为变体。
引入部分方法组后,在激活含有部分方法组的行为层时,需要知道激活哪一个行为变体,原有激活机制不再适用,因而需要实例激活机制(见运行支撑环境)。
从消息分发角度来看,传统COP模型如图1-a所示,在上下文C2中,同类实例Y1和Y2接收m1消息,均执行m1:*:C2方法,同一上下文中多个同类实例的消息分发结果相同;基于对象实例的行为变体模型如图1-b所示,在上下文C2中,同类实例Y1和Y2接收m1消息,分别执行m1’:*:C2方法和m1”:*:C2方法,实现了同一上下文中多个同类实例的差异化消息分发。
2、扩展JCOP的语言机制
本发明向JCOP语言中添加了两类关键字。
第一类是group关键字,用于定义部分方法组。利用group关键字,可在行为层layer中定义一组具有相同方法签名的部分方法。group关键字的用法如下:
group部分方法签名({语句块1})({语句块2})…({语句块n})
部分方法组的定义与部分方法存在两点不同:第一,部分方法组由group关键字修饰;第二,部分方法组的方法体有多个,上述用法分别定义了方法体为语句块1,语句块2,语句块3……的多个相同方法签名的部分方法。
第二类是instancewith/instanewithout关键字,用于实例激活机制。instancewith关键字用于激活,instancewithout用于去活。instancwith/instancewithout关键字的用法如下:
instancewith(行为层名layer,{对象实例obj1,obj2,…},{行为变体编号i,j,…})
instancewithout(行为层layer,{对象实例obj1,obj2,…})
在语法层面,instancewith/instancewithout是一条JCOP(重写为Java)语句。上述用法中,激活过程的效果是在指定的对象实例obj1上激活某行为层layer的第i个行为变体,在指定对象实例obj2上激活某行为层layer的第j个行为变体。而去活过程的效果是在指定对象实例obj1,obj2上去活行为层layer。
3、编译器与运行支撑环境
本发明扩展JCOP编译器,新的编译器的结构如图2所示,它包括词法分析器,语法分析器,抽象语法树改写器,扩展的JCOP运行支撑环境几大部分组成。其中,抽象语法树改写器负责将JCOP程序转换成Java程序。
所述编译器采用可扩展的JastAdd框架开发。该框架允许对抽象语法树进行改写。编译器开发人员只需要负责描述建立抽象语法树规则,以及重写语法树这两个部分的功能。
JastAdd框架中利用.ast文件描述抽象语法树节点之间的关系;.flex文件用于描述词法规则,.parser文件描述建立抽象语法树的规则。这些代码均由JastAdd整合,组成最终的编译器。部分方法组(PartialMethodGroupDecl节点)的建立规则是:
1)PartialMethodGroupDecl partial_method_group=
partial_method_group_header.m method_blocks.l
2)PartialMethodGroupDecl partial_method_group_header=
GROUP modifiers.m?type.retType name_pattern.pattern LPAREN formal_parameter_list.params?RPAREN throws.exceptions?
3)PartialMethodGroupDecl partial_method_group_header=
GROUP modifiers.m?VOID name_pattern.pattern LPAREN formal_parameter_list.params?RPAREN throws.exceptions?
4)List method_blocks=
method_group_body.b|method_blocks.l method_group_body.b
简言之,上述规则将部分方法组视为一个拥有多个方法块的方法。
实例激活机制(InstanceLayerActivation/InstanceLayerDeactivation节点)对应的规则是
5)Access method_invocation=
INSTANCE_LAYER_ACTIVATION LPAREN argument_list.l RPAREN
6)Access method_invocation=
INSTANCE_LAYER_DEACTIVATION LPAREN argument_list.l RPAREN
简言之,上述规则将实例激活机制的关键字视为一类特殊的Access节点。
重写语法树节点的代码由JastAdd采用面向剖面编程(Aspect OrientedProgramming,AOP)的方式编织到最终的编译器中。抽象语法树建立后,重写过程被编译器自动调用。抽象语法树在重写前后的变化如图3所示。PartialMethodGroupDecl节点(部分方法组)包含了多个相同签名的部分方法(行为变体),这些部分方法被改写为Java抽象语法树中的不同方法签名的节点MethodDecl。此外,InstanceLayerActivation节点被改写成对运行支撑环境中JCOP.instancewith()方法的调用;InstanceLayerDeactivation节点被改写成对运行支撑环境中JCOP.instancewithout()方法的调用。
原JCOP运行支撑环境,提供了线程级别的行为层队列来实现线程内上下文变化引起的行为变化,新运行支撑环境提供的与对象绑定的行为层队列。运行支撑环境采用hashmap存储<对象,对象级别的行为层队列>这样的键值对。instancewith关键字(JCOP.instancewith方法)会记录不同实例需要执行的是哪一个行为变体,并修改对应的的对象级别行为层队列,不影响对象所处线程持有的行为层队列。在执行时刻,对象级别的行为层队列在执行的顺序上优先于与线程级别的行为层队列(如图4),从而实现同类实例在相同上下文中互不干扰地执行不同行为变体。
4、使用案例
图5描述使用Lego部件拼装的小车在不同上下文中的行为变化。小车左轮和右轮应该是同一个类Wheel的两个实例,分别由两个线程控制转动。正常上下文时(图5-a),小车沿着直线行走,也即左轮和右轮在正常下文中的行为都是转动相同角度。但是前方出现障碍物时(图5-b),小车需要左拐弯躲避障碍物,处于左拐弯内侧的左轮转动角度要小于右轮转动角度,也即左轮和右轮的行为在障碍物上下文时不一样。
根据上面的应用需求,我们定义基础类Wheel表示小车车轮,如图6-a;行为层TurnLeftLayer用于封装左转弯上下文相关的行为变体。由于左转弯上下文中,Wheel类的两个实例leftWheel,rightWheel需要有不同行为变化,因而在行为层TurnLeftLayer中定义一个部分方法组Wheel.run(),“包含”两个行为变体,该方法组的代码如图6-b。
在控制小车运动的线程中,检测到需要左拐弯时,程序中应该使用instancewith关键字,为leftWheel,rightWheel实例分别激活TurnLeftLayer中的第0个和第1个行为变体,如图6-c。左拐弯完成后需要执行其他操作,使用instancewithout关键字,为leftWheel,rightWheel去活行为变体,如图6-d。
将上述代码使用编译器进行编译,启动Lego小车,运行结果符合预期。
综上所述,本发明所述的基于对象实例的行为变体模型的JCOP扩展实现方法,提出了基于对象实例的行为变体模型,解决同一上下文中,同类的不同实例的不同行为变化的需求;而且向现有JCOP语言中增加了两类语法设施,以及相关编译器,运行支撑环境,提供了一个可用的编程方法。
Claims (3)
1.一种基于对象实例行为变体的JCOP扩展实现方法,其特征在于,包括如下几个部分:
1)基于对象实例的行为变体模型;
2)实现该行为变体模型的用于扩展JCOP的语言机制;
3)JCOP扩展语言的编译器和运行支撑环境;
其中,所述基于对象实例的行为变体模型,用部分方法组表示某一上下文中的同一行为的多种可能变化;
所述实现该行为变体模型的用于扩展JCOP的语言机制包括两类关键字;
所述JCOP扩展语言的编译器和运行支撑环境,编译器采用JastAdd开发框架开发,重写抽象语法树节点达到编译目的;运行支撑环境引入对象级别行为层队列,使得同类实例间的执行过程互不干涉;
扩展的JCOP语法包括两类关键字:group,以及instancewith/instancewithout;
a)定义部分方法组group关键字:
group部分方法签名({语句块1})({语句块2})…({语句块n}),该语句定义了多个具有相同方法签名的部分方法,它们的方法体分别是语句块1,语句块2,……;
b)实例激活机制instancewith/instancewithout关键字:
instancewith(行为层名layer,{对象实例obj1,obj2,…},{行为变体编号i,j,…}),
该语句在指定的对象实例obj1上激活某行为层layer的第i个行为变体,在指定对象实例obj2上激活某行为层layer的第j个行为变体;
instancewithout(行为层layer,{对象实例obj1,obj2,…}),
该语句在指定对象实例obj1,obj2上去活行为层layer;
COP语言中,用行为层封装一组相关的行为变体;因而,激活行为层与激活行为变体同义;COP语言为面向上下文编程语言。
2.根据权利要求1所述的基于对象实例行为变体的JCOP扩展实现方法,其特征在于,所述行为变体模型中,行为变体以对象实例为单位进行定义,行为层引入部分方法组,描述同一行为的多种可能变化,部分方法组可以用于定义以对象实例为单位的行为变体。
3.根据权利要求1所述的基于对象实例行为变体的JCOP扩展实现方法,其特征在于,
所述编译器采用JastAdd开发框架实现,编译器输入为jcop源代码文件以及其他java源文件;编译器首先利用词法分析器,语法分析器为整个代码建立抽象语法树,其次采用抽象语法树节点重写技术实现JCOP节点到Java节点的转化,最后利用原有java编译器进行编译;
所述运行支撑环境为引入对象级别行为层队列,新的激活机制,只能影响对象级别行为层队列;运行支撑环境不仅保证该行为层队列优先于线程级别的行为层队列执行,而且不同的对象级别行为层队列不会相互影响。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410820282.XA CN104461566B (zh) | 2014-12-25 | 2014-12-25 | 一种基于对象实例的行为变体的jcop扩展实现方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410820282.XA CN104461566B (zh) | 2014-12-25 | 2014-12-25 | 一种基于对象实例的行为变体的jcop扩展实现方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104461566A CN104461566A (zh) | 2015-03-25 |
CN104461566B true CN104461566B (zh) | 2017-10-20 |
Family
ID=52907677
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410820282.XA Active CN104461566B (zh) | 2014-12-25 | 2014-12-25 | 一种基于对象实例的行为变体的jcop扩展实现方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104461566B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104820588B (zh) * | 2015-04-23 | 2018-06-05 | 南京大学 | 一种避免行为层组合时行为变体重复编织的处理方法 |
CN106843849B (zh) * | 2016-12-28 | 2020-04-14 | 南京大学 | 一种基于文档的库函数的代码模型的自动合成方法 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102938038A (zh) * | 2012-10-23 | 2013-02-20 | 南京大学 | 一种基于cop的增强软件安全性的方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20070150870A1 (en) * | 2005-12-22 | 2007-06-28 | International Business Machines Corporation | Method and apparatus for context oriented computer program tracing and visualization |
-
2014
- 2014-12-25 CN CN201410820282.XA patent/CN104461566B/zh active Active
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102938038A (zh) * | 2012-10-23 | 2013-02-20 | 南京大学 | 一种基于cop的增强软件安全性的方法 |
Non-Patent Citations (2)
Title |
---|
Declarative Layer Composition with The JCop Programming Language;Malte Appeltauer et al.;《Journal of Object Technology》;20130630;第12卷(第2期);1-37 * |
一个基于COP的控制软件安全性增强方法;陈智勇 等;《计算机工程与应用》;20130315;第49卷(第5期);64-69 * |
Also Published As
Publication number | Publication date |
---|---|
CN104461566A (zh) | 2015-03-25 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US7305666B2 (en) | Description language for an extensible compiler and tools infrastructure | |
Keryell et al. | Khronos SYCL for OpenCL: a tutorial | |
CN110149800B (zh) | 一种用于处理与源程序的源代码相关联的抽象语法树的装置 | |
JPH0561683A (ja) | オブジエクトに基づく情報処理システム及びソフトウエア保守システム | |
JP2010186468A (ja) | 任意の標的アーキテクチャに対する並列simdコードを生成する方法、コンピュータ可読媒体、およびシステム | |
US20160246622A1 (en) | Method and system for implementing invocation stubs for the application programming interfaces embedding with function overload resolution for dynamic computer programming languages | |
CN110673852B (zh) | 一种基于编译器前端实现控制流平坦的方法、系统及设备 | |
Matichuk et al. | An Isabelle proof method language | |
CN107111505A (zh) | 用于在并行异构系统上执行算法的系统和方法 | |
CN104461566B (zh) | 一种基于对象实例的行为变体的jcop扩展实现方法 | |
CA2820058A1 (en) | Multi-modal compiling apparatus and method for generating a hybrid codefile | |
CN107408054B (zh) | 设备中的流控制的方法和计算机可读介质 | |
US20180364991A1 (en) | Method and system for preparing code to be executed by programmable control devices | |
Liu et al. | Consistency and refinement of UML models | |
Bagge et al. | Axiom-based transformations: Optimisation and testing | |
US6499136B1 (en) | Single-shot entry code for software state transition | |
EP2171591B1 (en) | Efficiently locating transactional code blocks in a transactional memory system | |
Beuche et al. | Managing flexibility: Modeling binding-times in simulink | |
CN103577178A (zh) | 一种灵活修改计算规则的方法和系统 | |
CN106815003A (zh) | 一种计算机语言的交互系统及交互方法 | |
Blunk et al. | Efficient Development of Domain-Specific Simulation Modelling Languages and Tools | |
Lagartos et al. | Towards the integration of metaprogramming services into Java | |
Savidis | Translating declarative control elements to imperative using'l-value redefinition graphs' | |
Colvin | An operational semantics for object-oriented concepts based on the class hierarchy | |
Lepper et al. | Rewriting Object Models With Cycles and Nested Collections: A Model-Based Metaprogramming Problem |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |