基于Lua的AOP架构.doc

上传人:滴答 文档编号:1253359 上传时间:2019-01-19 格式:DOC 页数:12 大小:488.50KB
下载 相关 举报
基于Lua的AOP架构.doc_第1页
第1页 / 共12页
亲,该文档总共12页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

1、基于 Lua 的 AOP 架构1基于 Lua的 AOP架构摘要:在本文中,我们描述了一个面向方面的架构基于 Lua 语言来处理动态 AOP。这种架构是由 AspectLua 组成,一个 Lua 扩展,支持对象的声明,元对象协议,LuaMOP,即通过统一提供的 Lua 自监察和反射机制。对象使用 AspectLua 孤立定义,然后将它们通过 LuaMOP 编织。 AspectLua 的一个重要特点是允许的应用程序代码的未声明的对象元素(预接合点) 。此外,它结合了一系列功能,使 AOP更方便,功能强大。关键字:MOP;反射;AOP;AOP 动态;Lua ;预接合点1. 引言面向方面编程(AOP)

2、因专注于横切关注点模块化而广获关注, 。一般情况下,面向方面的方法是静态的 - 方面代码和组件(基本代码)在编译时(静态织)混合。在这种情况下,需要一特殊的编译器的方面代码与基码相结合。虽然这种策略避免了类型不匹配,它规定了应用程序动态演化的限制。最近一些动态的方法已经被提出了在运行时支持织造。一般来说,他们都建立在一个脚本语言之上如Python13,Ruby 14,和 Smalltalk 22。我们选择 Lua 语言来处理动态 AOP 因为它是动态类型以及它用于在底层解释器时无需为修改延伸它的行为提供设施。这些设施进行了探索在 AspectLua 和LuaMOP 的定义。我们认为,这引入了一

3、个不同的风格面向方面的编程,动态是一个关键问题,编织是在运行时完成的,这两个组件和方面可以插入和删除的应用程序在运行时。此外,Lua 的理念简而小。我们的目标是保持这一理念在我们的AOP 架构。2. 面向方面编程的基本概念面向方面编程强调有必要去耦合那些与该应用程序中的横切组件。虽然目前还没有有关的术语和面向方面编程的要素达成共识,我们在这项工作中参考AspectJ 中 10中使用的术语,因为它是最常用的面向方面的编程语言。这构成 AOP的元素有:接合点、切点、通知 、混入。说明接合点的一个很好的示例是:在代码调用一个方法时,发生调用的那一点被认为是一个接合点。切点用于指定或定义希望在程序流中

4、截获的接合点。切点还包含一个通知,该通知在到达接合点时基于 Lua 的 AOP 架构发生。因此,如果在一个调用的特定方法上定义一个切点,那么在调用该方法或接合点时,AOP 框架将截获该切点,同时还将执行切点的通知。通知有几种类型,但是最常见的情况是将其看作要调用的另一个方法。在调用一个带有切点的方法时,要执行的通知将是另一个要调用的方法。要调用的这个通知或方法可以是对象中被截获的方法,也可以是混入的另一个对象中的方法。3. 面向方面的基础结构AOP 的 LUA 支持由用于定义动态名为 LuaMOP 一元对象协议编织方面的一个方面类提供。图 1 展示出了组成,我们称之为 AspectLua AO

5、P 架构的块。第一层是由与它的反光设施 Lua 语言的。第二层是由所述 LuaMOP 设施取的 Lua 反射机制的优势。 LuaMOP 提供了一组支持动态引入第三层定义方面的元类。 AspectLua 提供方面类AOP 元素的定义。程序员可以利用 AspectLua 的任何 LuaMOP 或者 Lua 的反光特性。此外,AspectLua 不违反 Lua 语言的内在机制,因为它是建立在 Lua 的反射功能基础上。图 1:AspectLua 结构3.1 LUAMOPLuaMOP 是支持的元表示的创建以构成上述的 Lua 运行时环境中的每个元件的元对象协议:变量,函数,表格,用户数据等。各元件由一

6、元类提供一组的方法来查询和修改基类的每个元素的行为来表示。它们在元对象是基间位类(图 2)的分层方式组织的。从这个元类衍生出来的变量元,元函数,元协程,元表,以及元的 UserData 元类。此外,LuaMOP 还提供了一个监视器类,以监测的 Lua 运行时环境中的事件的发生。基于 Lua 的 AOP 架构图 2:LuaMOP 类图通过 LuaMOP 提供的元表示通过的 getInstance(实例)方法的调用创建。此方法返回对应于与由实例参数描述名称或参考的对象的元对象。此元对象是上述的元类的一个实例。对于每个元类有描述,并在支持改变的元对象的行为的方法。因此,的 getType()和的 g

7、etName()方法可以由所有的元类被调用,因为这些方法都是元对象的元类的一部分。这些方法返回,分别为元对象类型和名称。在destroy()方法来断开元对象。addPreGet,addPosGet,addPreSet 和 addPosSet 方法插入一个函数之前(或之后)可变读或写被执行。图 3 展示出了使用这些函数的一个例子。在第一行,余量变量被设置为 10.在下一行,则创建一个元对象来表示平衡变量。以下四个行声明的 checkRead 功能,并与 metavar 元对象该功能相关联,通过 addPreGet 方法。这些功能的主要目的是,以控制进入平衡变量。因此,如果由 addPreGet

8、方法插入函数返回一个值从零不同,阅读过程被中断。其他功能的存在,要求所有函数返回零,可以读取所有变量。这 LuaMOP 标准行为可以通过setAvalPreGet(funcaval)函数进行修改。所述 funcaval 函数接收作为参数的表,通过使用 addPreGet 方法插入的功能所提供的所有的结果。基于此列表中,funcaval 函数返回一个非零值中断阅读。基于 Lua 的 AOP 架构图 3:add 方法 LuaMOP 例子元函数类代表一个 Lua 应用程序的所有功能。这个元类提供了以下方法:getNameFunction,getFunction 和 setFunction。 getN

9、ameFunction()方法获取由元对象引用的函数名称。 getFunction()方法获取由元对象所引用的功能,并 setFunction(newfunction)允许变形例中,在运行时,该功能的行为。所提供给有关元对象细节的一些其他功能:getSrcDefined()返回包含函数定义的文件; getLineDefined()返回包含函数声明行; getTypeFunction()确定如果一个函数写在 Lua 或 c; getNameWhat()标识,如果功能是全局或本地。图 4:setFunction LuaMOP 例子元函数元类还提供 addPreMethod,addPosMethod

10、 和 addWrapMethod 方法。这些方法定义了其中添加行为的地方:Pre(前) ,Pos(后) ,并包裹函数的执行。使用这些函数的一个例子在图 5 中示出。基于 Lua 的 AOP 架构图 5:addPosMethod LuaMOP 例子获得元对象在第 5 行,addPostMethod 方法被调用,从第 1 行定义的 reglog函数添加到 3.当执行 deposit 方法(行 6) ,则 LuaMOP 机制自动调用 reglog 方法。以控制与给定的行为相关联的功能,元函数提供了以下方法:getZMethods,setZMethods 和 delZMethods。所述 getPre

11、Methods 方法,例如,返回加入到预行为的所有方法的列表。由 getPreMethods 提供的列表是有序的,并作为参数发送到 setPreMethods 方法。这后一种方法修改的定义到预行为的方法的执行顺序。的方法的去除可以使用 delPreMethods 方法来完成。元表类表示应用程序表,并提供以下功能:getfield 命令,getAllFields 和setField。该 getfield 命令(名称)方法接收字段名参数,返回表示它一个MetaField。所述 MetaField 类从 MetaVariable 类继承和,其结果是,提供了一个 MetaVariable 的相同的功能

12、。例如:添加读取变量的值之前调用的函数。要获得元表的所有 MetaFields, ()可以使用功能 getAllFields。setField(name,value)方法用于修改表字段,如果它不存在,插入表字段。在 Lua 中,类由表元素表示。因此,该 setField 方法可用于添加两个新的属性和新方法。尽管元对象提供 setField 方法的事实,它不排除使用另一种机制来插入新字段。元对象的作用是保持因果关系,并根据在所述基础对象的变化来更新它的属性。图 6 示出这种行为的示例。图 6:LuaMOP 和因果关系基于 Lua 的 AOP 架构关于行 1 和 2 中的 Account 对象与平

13、衡属性定义。在下一行,创建一个元对象来代表 Account 对象。在这一刻 metaAccount 元对象只平衡作为 MetaField。在第5 行,一个新的领域,NameAccount,被定义为 Account 对象。这个动作改变了基础对象,并触发 metaAccount 元对象,提供了 getfield 命令的方法与名称NameAccount 恢复 MetaField 的自动修改。这样 MetaField 提供 MetaVariable 的相同的功能。这使得 addPosSet 方法来处理 NameAccount 领域的修改的调用。3.2 ASPECTLUAAspectLua 定义了一个

14、Aspect 类来处理所有方面的问题。因此,AspectLua 提供了一个抽象层,用户可以定义在任何 LuaMOP 或者 Lua 的反光设施 AOP 元素。使用 AspectLua,有必要通过调用新功能来创建 AspectLua 类的一个实例。创建一个新的实例后,有必要定义一个包含 aspect 元素(名称,明确定义的点组,操作定义)一个 Lua 表。图 7 示出的一个方面的定义: aspect 方法的第一个参数是 aspect 名称; 第二个参数是定义切入点元素一个 Lua 表:其名称,标志和必须被截取的功能或变量。该标志定义切入点类型。 AspectLua 支持以下几种类型:调用函数调用;

15、 callone 为必须只执行一次的方面;介绍在表(在 Lua 对象)引入的功能;并获得和应用组可变量。该列表字段定义将被拦截的函数或变量。它是没有必要的要被截取的元素已经被声明。这个列表可以使用通配符。的,例如银行*意味着方面应适用于银行类的所有方法; 最后,第三个参数是一个 Lua 表,它定义了具体操作元素:类型(后,前,各处,等等) ,并且操作到达切入点时要采取。在图 7 中,logfunction 充当到存款功能的一个方面。对于每个存款函数调用,logfunction 之前它以打印存款值调用。基于 Lua 的 AOP 架构图 7:定义方面的例子该方面方法的调用定义了切入点的各个方面,并

16、返回一个 aspect 标识(ID) 。因此,为了用相同的 aspect 有必要调用每个切入点的 aspect 各切入点关联。要管理的定义方面,AspectLua 提供下列功能:getAspect(ID) ,GETALL() ,removeAspect(ID)和 updateAspect(ID,newasp) 。的 getAspect 和 GETALL 方法可以用来得到一个或已经定义的所有方面。得到一个方面中后,它可以修改或通过使用 updateAspect 方法来更新它的元素。这种方法可以修改切入点和一个方面的具体操作已定义。方面除去可以通过使用 removeAspect 方法来完成。在图

17、7 中,用存款方式的银行对象被声明后,连接点的定义。在以前的版本AspectLua,因为需要一个连接点的每个目标的方法是以前声明的这个定义是不可能的。为了解决此限制,AspectLua 的当前版本使用显示器来实现预接合点 - 一个连接不具有一个元对象点,但具有与之相关联的显示器。预接合点允许定义一个连接点对于尚未在应用程序中声明的元素的程序员。此外,有可能拦截即使它不在应用存在这个连接点。这是预接合点和其它作品1,3,6,10实施了一些解决方案之间的主要区别。这些解决方案支持连接点,尚未被宣布但每个截取连接点恰好就在已经被加载元素的元素的定义。因此,如果没有加载元件,该连接点不截获。在 Asp

18、ectLua 能够拦截连接点为既不定义也不加载元件。图 8 中的存款方法具有将收到执行两个方面。缺省情况下,执行顺序是方面定义的顺序。因此,logfunction 将 checkRights 之前被执行。存款和定义不同的顺序的表:修改该顺序,setOrder 可以用下面的参数来使用。为了得到一个变量或函数的信息,getOrder 被调用接收其名作为参数。基于 Lua 的 AOP 架构图 8:定义为方面调用AspectLua 还允许通过引入标志中的一类采用新的方法。图 9 显示了在引进银行类的退出方法。此标志不要求的具体操作类型。图 9 的最后一行显示,引入了新的方法后,可以以相同的方式使用如前

19、述现有的方法。3.3 性能评估本节讨论关于在 Lua 的执行环境中使用元表示的性能问题。测试比较的执行时间使用和不使用的元对象。这种方式,有可能通过比较函数 X 和 Y,分别被执行,在执行时间,以验证在调用过程的元对象存在的影响,在 59.72 微秒和 3.91 微秒与没有关联的元对象他们。评估是在 PC 毒龙的 1.6MHz 完成 256MB 的 RAM,使用Linux,Mandrake 9.2。图 11:预接合点执行表 1 示出的性能测试的结果。第一行显示的 X 和 Y 的函数的执行时间,并与包含在 Y 函数作为 PreMethod 一元对象相关联的 X 函数的执行时间之间的比较。所不同的

20、是低考虑到元对象需要管理信息的时间。第二行相比较属于一个对象(表)的方法的访问和执行时间,例如 Bank.X() ,与一元对象相关联的同一个对象。仅当,在下面的行,函数(Y)的与 X 功能之后所要执行的银行元对象相关联的这两个调用之间的差异会更大。在这种情况下,从 2.15s 的差增大(在前面的线) ,基于 Lua 的 AOP 架构以 6.7s 这种差异是有关的时间参与装载与 Metafield 相关联的功能的量。4. 相关研究相关研究包括内置脚本语言之上的一些 AOP 的语言。最重要的是基于公知的脚本语言 3 的 AOP 扩展:Python 的 13,Ruby 14和 Smalltalk4。

21、 AOPy2是建在Python 之上。 AOPy 实现通过包装的具体操作方法里面截取于方法。方面定义使用标志调用,只是一个连接点可以在一个切入点来定义。与此相反,AspectLua 支持的几个连接点的定义。 AspectR1是建在 Ruby 之上。它通过包装代码围绕现有的类中的方法实现 AOP 和支持通配符。方面 6是一个佳乐/ Smalltalk 的扩展,以支持 AOP。它采用模块和元级编程来处理 AOP。它还支持通配符。LAC - Lua 的貌组件 5 - 是一个 Lua 扩展,其主要目标是支持貌组件(AC)的概念11。 LAC 是从 AspectLua 完全不同,因为它的元素,以支持同时

22、AspectLua 元件被以下传统 AOP 概念定义 AC 的想法来定义。 LAC 规定,其中组件和方面是由不同风格的类来定义的模板。与此相反,AspectLua 使用表来表示的方面。 LAC 的重点是实现交流的典范。定义这个模型后,Lua 中被选择来实现它。相比之下,AspectLua 的重点是使用 Lua 因为没有引入新的命令或结构的 AOP 语言。PROSE19是一个动态的 AOP 扩展 Java 语言。作为 AspectLua,散文不引入定义方面的新的语法。它使用 Java 语言本身。以同样的方式,没有必要特别的编译器。它使用 Java 虚拟机调试接口(JVMDI)和刚刚在实时(JIT

23、)功能,使其能够拦截和方面的执行。然而,从散文 AspectLua 的主要区别在于,AspectLua 使用纯解释的方法。5. 结语在本文中,我们提出了基于 Lua 的一个 AOP 的基础结构。基础结构是由LuaMOP 和 AspectLua 的。切面使用 AspectLua 定义。 LuaMOP 支持探索的 Lua 的反射功能动态编织。我们已经详细描述织造过程是如何发生的。作为各方面使用的 Lua 表中定义,它是没有必要使用不同的语言的功能代码和方面的代码。对于这两种方案使用 Lua 语言。这是保持 Lua 的理念的一种理念 - 简而小。基础结构提供了一系列的介绍中具有很大的灵活性,以 AO

24、P 功能:可以在运行时定义方面;它支持方面优先顺序,通配符,并与未申报要素方面的协会的定义。值得指出的是,预接合点的概念是动态性非常有用,因为它允许根据组件程序的基于 Lua 的 AOP 架构新功能方面的动态插入。它超越了目前的 AOP 方法,其中连接点都与静态定义的元素,或者顶多连接点与该动态加载元素,但拦截过程之前有关。动态 AOP 语言的想法并不新鲜。然而,在这项工作中呈现的动态 AOP 的方法结合的一组没有被其他 AOP 语言一起提供的功能。我们选择的 Lua,因为它体积小,易于使用,它提供了反射机制,使语言的扩展。参考文献1A.科比,R. 费尔德。 AspectR - Ruby 简单

25、的面向方面编程。 http:/ 5 生成编程和组件工程。3答加尔,W.施罗德-Preikschat,O. Spinczyk。 AspectC +:语言和具体操作实施的原型。 OOPSLA 2001 研讨会在面向对象的系统,坦帕关注的先进分离 - 佛罗里达州,2001 年10 月。4A.戈德堡,D 罗布森。Smalltalk-80:语言及其实现。 艾迪生-韦斯利出版社,1983 年。5S。赫尔曼,M Mezini。结合组成样式在演化语言 LAC。在 ASoC 研讨会 ICSE-国际软件工程大会,2001 年。6R.赫希菲尔德。面向方面编程。从国际会议 NetObjectDays 上的对象修订文件

26、,组件,架构,服务和应用程序的网络世界里,LNCS 2591,页 216-232,施普林格出版社,伦敦,2002 年。7R. Ierusalimsky,L. H.菲格雷多,W. Celes LUA - 一个可扩展的扩展语言。软件:实践与 xperience,26(6):635-652。 1996 年。8P.梅斯。概念和实验计算反射。在面向对象编程,系统,语言和应用程序(OOPSLA),佛罗里达州奥兰多市,第 147-155 页,1987。9G.Kiczales,J.Lamping,A.Mendhekaretal.Aspect-面向对象编程。在 ECOOP97 - 面向对象程序设计欧洲会议。施普

27、林格出版社,芬兰。 1997 年。10 G.Kiczales,E.Hilsdale,AspectJ 的的 J.Huguninetal.AnOverview。在 ECOOP2001 - 面向对象程序设计欧洲会议。匈牙利首都布达佩斯。 2001 年。11K.Lierberherr,D.Lorenz 与貌组件 M.Mezini.Programming。技术报告 NU-CCS99 -01,Notheastern 大学。1999 年。12R.Miles.LazyLoadingwithAspects.ONJa-,http:/ 年。13G. Rossum。 Python 的参考手册,http:/www.py

28、thon.org/doc/current/ref/ref.html。 2003。14D.Thomas,A.Hunt.ProgrammingRuby:APragmatic 程序员指南.http:/ 2004。15N.卡丘,T 巴蒂斯塔。 AdaptaoDinmica implementao 在第 23 届巴西研讨会计算机网络(SBRC2005),SBC,福塔莱萨,CE,2005 年 5 月,页 495-508。16A.安德森,G. S.布莱尔 F. Eliassen。反射基于组件的中间件服务质量管理。在 PROMS 2000 年,多媒体系统的协议。波兰克拉科夫,2000。17 G.S.Blairetal.ThedesignandimplementationofOpen ORB v2 中。 IEEE 分布式在线系统,2(6),2001 年。http:/www.cs.uit.no/aa/abstracts/blair2001a.htm 湖18J。Sztipanovits,G Karsai。生成程序的嵌入式系统。该 ACM SIGPLAN / SIGSOFT 会

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文资料库 > 毕业论文

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。