Aspect-oriented programming: Difference between revisions

Content deleted Content added
Filled in 14 bare reference(s) with reFill ()
Rescuing 87 sources and tagging 7 as dead. #IABot (v1.6.5)
Line 12:
 
==History==
AOP has several direct antecedents A1 and A2:<ref>{{Cite conference | doi = 10.1007/BFb0053381 | title = Aspect-oriented programming | work = Proceedings of the 11th European Conference on Object-Oriented Programming | conference = [[European Conference on Object-Oriented Programming|ECOOP]]'97 | volume = 1241 | pages = 220–242 | series = [[Lecture Notes in Computer Science|LNCS]] | year = 1997 | last1 = Kiczales | first1 = G. | author1-link = Gregor Kiczales | last2 = Lamping | first2 = J. | last3 = Mendhekar | first3 = A. | last4 = Maeda | first4 = C. | last5 = Lopes | first5 = C. | last6 = Loingtier | first6 = J. M. | last7 = Irwin | first7 = J. | isbn = 3-540-63089-9 | citeseerx = 10.1.1.115.8660 | url = http://www.cs.ubc.ca/~gregor/papers/kiczales-ECOOP1997-AOP.pdf | deadurl = no | archiveurl = https://web.archive.org/web/20160112141810/http://www.cs.ubc.ca/%7Egregor/papers/kiczales-ECOOP1997-AOP.pdf | archivedate = 2016-01-12 | df = }}</ref> [[reflection (computer programming)|reflection]] and [[Metaobject|metaobject protocol]]s, [[subject-oriented programming]], Composition Filters and Adaptive Programming.<ref>"Adaptive Object Oriented Programming: The Demeter Approach with Propagation Patterns" ''Karl Liebherr'' 1996 {{ISBN|0-534-94602-X}} presents a well-worked version of essentially the same thing (Lieberherr subsequently recognized this and reframed his approach).</ref>
 
[[Gregor Kiczales]] and colleagues at [[Xerox PARC]] developed the explicit concept of AOP, and followed this with the [[AspectJ]] AOP extension to Java. IBM's research team pursued a tool approach over a language design approach and in 2001 proposed [[Hyper/J]] and the [[Concern Manipulation Environment]], which have not seen wide usage. The examples in this article use [[AspectJ]] as it is the most widely known AOP language.{{Citation needed|date=November 2010}}
Line 82:
</source>
 
One can think of AOP as a debugging tool or as a user-level tool. Advice should be reserved for the cases where you cannot get the function changed (user level)<ref>{{cite web|url=https://www.gnu.org/software/emacs/manual/html_node/elisp/Advising-Functions.html|title=gnu.org|author=|date=|website=www.gnu.org|accessdate=5 May 2018|deadurl=no|archiveurl=https://web.archive.org/web/20171224053656/http://www.gnu.org/software/emacs/manual/html_node/elisp/Advising-Functions.html|archivedate=24 December 2017|df=}}</ref> or do not want to change the function in production code (debugging).
 
==Join point models==
Line 166:
Any solution that combines programs at runtime has to provide views that segregate them properly to maintain the programmer's segregated model. Java's bytecode support for multiple source files enables any debugger to step through a properly woven .class file in a source editor. However, some third-party decompilers cannot process woven code because they expect code produced by Javac rather than all supported bytecode forms (see also "[[#Criticism|Criticism]]", below).
 
[[Deploy-time]] weaving offers another approach.<ref>{{cite web |url=http://www.forum2.org/tal/AspectJ2EE.pdf |title=Archived copy |accessdate=2005-06-19 |deadurl=yes |archiveurl=https://web.archive.org/web/20051008065854/http://www.forum2.org/tal/AspectJ2EE.pdf |archivedate=2005-10-08 |df= }}</ref> This basically implies post-processing, but rather than patching the generated code, this weaving approach ''subclasses'' existing classes so that the modifications are introduced by method-overriding. The existing classes remain untouched, even at runtime, and all existing tools (debuggers, profilers, etc.) can be used during development. A similar approach has already proven itself in the implementation of many [[Java EE]] application servers, such as [[IBM]]'s [[WebSphere]].
 
===Terminology===
Line 186:
== Adoption issues ==
 
Programmers need to be able to read code and understand what is happening in order to prevent errors.<ref>[[Edsger Dijkstra]], [http://www.cs.utexas.edu/users/EWD/ewd02xx/EWD249.PDF ''Notes on Structured Programming''] {{webarchive|url=https://web.archive.org/web/20061012020239/http://www.cs.utexas.edu/users/EWD/ewd02xx/EWD249.PDF |date=2006-10-12 }}, pg. 1-2</ref>
Even with proper education, understanding crosscutting concerns can be difficult without proper support for visualizing both static structure and the dynamic flow of a program.<ref>{{cite web|url=http://pp.info.uni-karlsruhe.de/uploads/publikationen/constantinides04eiwas.pdf|title=''AOP Considered Harmful''|author=|date=|website=uni-karlsruhe.de|accessdate=5 May 2018|deadurl=no|archiveurl=https://web.archive.org/web/20160323061458/https://pp.info.uni-karlsruhe.de/uploads/publikationen/constantinides04eiwas.pdf|archivedate=23 March 2016|df=}}</ref> Beginning in 2002, AspectJ began to provide IDE plug-ins to support the visualizing of crosscutting concerns. Those features, as well as aspect code assist and [[Code refactoring|refactoring]] are now common.
 
Given the power of AOP, if a programmer makes a logical mistake in expressing crosscutting, it can lead to widespread program failure. Conversely, another programmer may change the join points in a program &ndash; e.g., by renaming or moving methods &ndash; in ways that the aspect writer did not anticipate, with [[unforeseen consequences]]. One advantage of modularizing crosscutting concerns is enabling one programmer to affect the entire system easily; as a result, such problems present as a conflict over responsibility between two or more developers for a given failure. However, the solution for these problems can be much easier in the presence of AOP, since only the aspect needs to be changed, whereas the corresponding problems without AOP can be much more spread out.
 
==Criticism==
The most basic criticism of the effect of AOP is that control flow is obscured, and is not only worse than the much-maligned [[GOTO]], but is in fact closely analogous to the joke [[COME FROM]] statement. The ''obliviousness of application'', which is fundamental to many definitions of AOP (the code in question has no indication that an advice will be applied, which is specified instead in the pointcut), means that the advice is not visible, in contrast to an explicit method call.<ref name="harmful">"[https://pp.info.uni-karlsruhe.de/uploads/publikationen/constantinides04eiwas.pdf AOP Considered Harmful] {{webarchive|url=https://web.archive.org/web/20160304055622/http://pp.info.uni-karlsruhe.de/uploads/publikationen/constantinides04eiwas.pdf |date=2016-03-04 }}", Constantinos Constantinides, Therapon Skotiniotis, Maximilian Störzer, ''European Interactive Workshop on Aspects in Software'' (EIWAS), Berlin, Germany, September 2004.</ref><ref>[[C2:ComeFrom]]</ref> For example, compare the COME FROM program:<ref name="harmful"/>
<source lang=basic>
5 input x
Line 217:
Indeed, the pointcut may depend on runtime condition and thus not be statically deterministic. This can be mitigated but not solved by static analysis and IDE support showing which advices ''potentially'' match.
 
General criticisms are that AOP purports to improve "both modularity and the structure of code", but some counter that it instead undermines these goals and impedes "independent development and understandability of programs".<ref name="steimann">{{Cite journal | doi = 10.1145/1167515.1167514| title = The paradoxical success of aspect-oriented programming| journal = ACM SIGPLAN Notices| volume = 41| issue = 10| pages = 481| year = 2006| last1 = Steimann | first1 = F. }}, ([http://people.dsv.su.se/~johano/ioor/succ_aop.pdf slides] {{webarchive|url=https://web.archive.org/web/20160304060007/http://people.dsv.su.se/~johano/ioor/succ_aop.pdf |date=2016-03-04 }},[http://www.eecs.ucf.edu/~leavens/modular-aop/Discussion.pdf slides 2] {{webarchive|url=https://web.archive.org/web/20150923234021/http://www.eecs.ucf.edu/~leavens/modular-aop/Discussion.pdf |date=2015-09-23 }}, [http://www.oopsla.org/2006/submission/essays/the_paradoxical_success_of_aspect-oriented_programming.html abstract] {{webarchive|url=https://web.archive.org/web/20150924060711/http://www.oopsla.org/2006/submission/essays/the_paradoxical_success_of_aspect-oriented_programming.html |date=2015-09-24 }}), Friedrich Steimann, Gary T. Leavens, [[OOPSLA]] 2006</ref> Specifically, quantification by pointcuts breaks modularity: "one must, in general, have whole-program knowledge to reason about the dynamic execution of an aspect-oriented program."<ref>{{cite web|url=http://www.eecs.ucf.edu/~leavens/modular-aop/|title=More Modular Reasoning for Aspect-Oriented Programs|publisher=|accessdate=11 August 2015|deadurl=no|archiveurl=https://web.archive.org/web/20150812045258/http://www.eecs.ucf.edu/~leavens/modular-aop/|archivedate=12 August 2015|df=}}</ref> Further, while its goals (modularizing cross-cutting concerns) are well understood, its actual definition is unclear and not clearly distinguished from other well-established techniques.<ref name="steimann"/> Cross-cutting concerns potentially cross-cut each other, requiring some resolution mechanism, such as ordering.<ref name="steimann"/> Indeed, aspects can apply to themselves, leading to problems such as the [[liar paradox]].<ref>{{cite web|url=http://www.fernuni-hagen.de/ps/pubs/FOAL2006.pdf|title=AOP and the Antinomy of the Liar|author=|date=|website=fernuni-hagen.de|accessdate=5 May 2018|deadurl=no|archiveurl=https://web.archive.org/web/20170809201001/http://www.fernuni-hagen.de/ps/pubs/FOAL2006.pdf|archivedate=9 August 2017|df=}}</ref>
 
Technical criticisms include that the quantification of pointcuts (defining where advices are executed) is "extremely sensitive to changes in the program", which is known as the ''fragile pointcut problem''.<ref name="steimann"/> The problems with pointcuts are deemed intractable: if one replaces the quantification of pointcuts with explicit annotations, one obtains attribute-oriented programming instead, which is simply an explicit subroutine call and suffers the identical problem of scattering that AOP was designed to solve.<ref name="steimann"/>
Line 224:
The following [[programming language]]s have implemented AOP, within the language, or as an external library:
*[[.NET Framework]] languages ([[C Sharp (programming language)|C#]] / [[Visual Basic .NET|VB.NET]])<ref>Numerous:
[https://github.com/vc3/Afterthought Afterthought] {{webarchive|url=https://web.archive.org/web/20160315162029/https://github.com/vc3/Afterthought |date=2016-03-15 }}, [http://www.rapier-loom.net/ LOOM.NET] {{webarchive|url=https://web.archive.org/web/20080827215106/http://www.rapier-loom.net/ |date=2008-08-27 }}, [http://www.codeplex.com/entlib Enterprise Library 3.0 Policy Injection Application Block] {{webarchive|url=https://web.archive.org/web/20070119154829/http://www.codeplex.com/entlib |date=2007-01-19 }}, [http://sourceforge.net/projects/aspectdng/ AspectDNG] {{webarchive|url=https://web.archive.org/web/20040929053513/http://sourceforge.net/projects/aspectdng |date=2004-09-29 }}, [http://www.castleproject.org/projects/dynamicproxy/ DynamicProxy] {{webarchive|url=https://web.archive.org/web/20151205001755/http://www.castleproject.org/projects/dynamicproxy/ |date=2015-12-05 }}, [http://composestar.sourceforge.net/ Compose*] {{webarchive|url=http://archive.wikiwix.com/cache/20050821193804/http://composestar.sourceforge.net/ |date=2005-08-21 }}, [http://www.postsharp.net/ PostSharp] {{webarchive|url=https://web.archive.org/web/20160503095409/https://www.postsharp.net/ |date=2016-05-03 }}, [http://www.seasar.org/en/dotnet/ Seasar.NET] {{webarchive|url=https://web.archive.org/web/20060725015434/http://www.seasar.org/en/dotnet/ |date=2006-07-25 }}, [http://dotspect.tigris.org/ DotSpect (.SPECT)] {{webarchive|url=https://web.archive.org/web/20060331071126/http://dotspect.tigris.org/ |date=2006-03-31 }}, [http://www.springframework.net/ Spring.NET] {{webarchive|url=https://web.archive.org/web/20060402205922/http://springframework.net/ |date=2006-04-02 }} (as part of its functionality), [http://www.cs.columbia.edu/~eaddy/wicca Wicca and Phx.Morph] {{webarchive|url=https://web.archive.org/web/20061207110849/http://www1.cs.columbia.edu/~eaddy/wicca/ |date=2006-12-07 }}, [http://setpoint.codehaus.org/ SetPoint] {{webarchive|url=https://web.archive.org/web/20081007002006/http://setpoint.codehaus.org/ |date=2008-10-07 }}</ref>
**[https://www.postsharp.net/ PostSharp] is a commercial AOP implementation with a free but limited edition.
**[[Unity Application Block|Unity]], It provides an API to facilitate proven practices in core areas of programming including data access, security, logging, exception handling and others.
*[[ActionScript]]<ref>{{cite web|url=http://www.as3commons.org/as3-commons-bytecode|title=Welcome to as3-commons-bytecode|author=|date=|website=as3commons.org|accessdate=5 May 2018|deadurl=no|archiveurl=https://web.archive.org/web/20141003100345/http://www.as3commons.org/as3-commons-bytecode/|archivedate=3 October 2014|df=}}</ref>
*[[Ada (programming language)|Ada]]<ref>{{cite web|url=http://www.adacore.com/uploads/technical-papers/Ada2012_Rational_Introducion.pdf|title=Ada2012 Rationale|author=|date=|website=adacore.com|accessdate=5 May 2018|deadurl=no|archiveurl=https://web.archive.org/web/20160418132340/http://www.adacore.com/uploads/technical-papers/Ada2012_Rational_Introducion.pdf|archivedate=18 April 2016|df=}}</ref>
*[[AutoHotkey]]<ref>{{cite web|url=http://www.autohotkey.com/forum/viewtopic.php?p=243426|title=Function Hooks|author=|date=|website=autohotkey.com|accessdate=5 May 2018}}{{dead link|date=May 2018 |bot=SheriffIsInTown |fix-attempted=yes }}</ref>
*[[C (programming language)|C]] / [[C++]]<ref>Several: [[AspectC++]], [http://wwwiti.cs.uni-magdeburg.de/iti_db/forschung/fop/featurec/ FeatureC++], [http://www.cs.ubc.ca/labs/spl/projects/aspectc.html AspectC] {{webarchive|url=https://web.archive.org/web/20060821190630/http://www.cs.ubc.ca/labs/spl/projects/aspectc.html |date=2006-08-21 }}, [http://www.aspectc.net/ AspeCt-oriented C] {{webarchive|url=https://web.archive.org/web/20081120144608/http://www.aspectc.net/ |date=2008-11-20 }}, [http://www.bramadams.org/aspicere/index.html Aspicere]{{dead link|date=May 2018 |bot=SheriffIsInTown |fix-attempted=yes }}</ref>
*[[COBOL]]<ref>{{cite web|url=http://homepages.vub.ac.be/~kdeschut/cobble/|title=Cobble|author=|date=|website=vub.ac.be|accessdate=5 May 2018}}{{dead link|date=May 2018 |bot=SheriffIsInTown |fix-attempted=yes }}</ref>
*The [[Cocoa (API)|Cocoa]] [[Objective-C]] frameworks<ref>{{cite web|url=http://www.ood.neu.edu/aspectcocoa/|title=AspectCocoa|author=|date=|website=neu.edu|accessdate=5 May 2018|deadurl=yes|archiveurl=https://web.archive.org/web/20071026022525/http://www.ood.neu.edu/aspectcocoa/|archivedate=26 October 2007|df=}}</ref>
*[[ColdFusion]]<ref>{{cite web|url=https://web.archive.org/web/20051105014513/http://coldspringframework.org/|title=ColdSpring Framework: Welcome|author=|date=5 November 2005|website=archive.org|accessdate=5 May 2018|deadurl=bot: unknown|archiveurl=https://web.archive.org/web/20051105014513/http://coldspringframework.org/|archivedate=5 November 2005|df=}}</ref>
*[[Common Lisp]]<ref>{{cite web|url=http://common-lisp.net/project/closer/aspectl.html|title=Closer Project: AspectL.|publisher=|accessdate=11 August 2015|deadurl=no|archiveurl=http://archive.wikiwix.com/cache/20110223172923/http://common-lisp.net/project/closer/aspectl.html|archivedate=23 February 2011|df=}}</ref>
*[[Borland Delphi|Delphi]]<ref>{{cite web|url=https://code.google.com/p/infra/|title=infra - Frameworks Integrados para Delphi - Google Project Hosting|publisher=|accessdate=11 August 2015|deadurl=no|archiveurl=https://web.archive.org/web/20150909070130/http://code.google.com/p/infra/|archivedate=9 September 2015|df=}}</ref><ref>{{cite web|url=https://code.google.com/p/meaop/|title=meaop - MeSDK: MeObjects, MeRTTI, MeAOP - Delphi AOP(Aspect Oriented Programming), MeRemote, MeService... - Google Project Hosting|publisher=|accessdate=11 August 2015|deadurl=no|archiveurl=https://web.archive.org/web/20150910210536/http://code.google.com/p/meaop/|archivedate=10 September 2015|df=}}</ref><ref>{{cite web|url=https://code.google.com/p/delphisorcery/|title=Google Project Hosting|publisher=|accessdate=11 August 2015|deadurl=no|archiveurl=https://web.archive.org/web/20141225080131/https://code.google.com/p/delphisorcery/|archivedate=25 December 2014|df=}}</ref>
*[[Delphi Prism]]<ref>{{cite web|url=http://prismwiki.codegear.com/en/Cirrus|title=RemObjects Cirrus|author=|date=|website=codegear.com|accessdate=5 May 2018|deadurl=yes|archiveurl=https://web.archive.org/web/20120123094027/http://prismwiki.codegear.com/en/Cirrus|archivedate=23 January 2012|df=}}</ref>
*[[E (verification language)|e]] (IEEE 1647)
*[[Emacs Lisp]]<ref>{{cite web|url=https://www.gnu.org/software/emacs/elisp/html_node/Advising-Functions.html|title=Emacs Advice Functions|author=|date=|website=gnu.org|accessdate=5 May 2018|deadurl=no|archiveurl=https://web.archive.org/web/20111024211408/http://www.gnu.org/software/emacs/elisp/html_node/Advising-Functions.html|archivedate=24 October 2011|df=}}</ref>
*[[Groovy (programming language)|Groovy]]
*[[Haskell (programming language)|Haskell]]<ref>[[monad (functional programming)]] ({{cite journal | citeseerx = 10.1.1.25.8262 | title = Monads As a theoretical basis for AOP }}) and [http://portal.acm.org/citation.cfm?id=1233842 Aspect-oriented programming with type classes.] [http://dl.acm.org/citation.cfm?id=2451457 A Typed Monadic Embedding of Aspects]</ref>
*[[Java (programming language)|Java]]<ref>Numerous others: [http://www.caesarj.org/ CaesarJ] {{webarchive|url=https://web.archive.org/web/20081219181529/http://caesarj.org/ |date=2008-12-19 }}, [http://composestar.sourceforge.net/ Compose*] {{webarchive|url=http://archive.wikiwix.com/cache/20050821193804/http://composestar.sourceforge.net/ |date=2005-08-21 }}, [http://dynaop.dev.java.net/ Dynaop] {{webarchive|url=https://web.archive.org/web/20070724061030/https://dynaop.dev.java.net/ |date=2007-07-24 }}, [http://jac.objectweb.org/ JAC] {{webarchive|url=https://web.archive.org/web/20040619135517/http://jac.objectweb.org/ |date=2004-06-19 }}, [[Google Guice]] (as part of its functionality), [http://www.csg.is.titech.ac.jp/~chiba/javassist/ Javassist] {{webarchive|url=https://web.archive.org/web/20040901095342/http://www.csg.is.titech.ac.jp/~chiba/javassist/ |date=2004-09-01 }}, [http://ssel.vub.ac.be/jasco/ JAsCo (and AWED)] {{webarchive|url=https://web.archive.org/web/20050411010213/http://ssel.vub.ac.be/jasco/ |date=2005-04-11 }}, [http://www.ics.uci.edu/~trungcn/jaml/ JAML] {{webarchive|url=https://web.archive.org/web/20050415091244/http://www.ics.uci.edu/~trungcn/jaml/ |date=2005-04-15 }}, [http://labs.jboss.com/portal/jbossaop JBoss AOP] {{webarchive|url=https://web.archive.org/web/20061017211354/http://labs.jboss.com/portal/jbossaop/ |date=2006-10-17 }}, [http://roots.iai.uni-bonn.de/research/logicaj LogicAJ] {{webarchive|url=https://web.archive.org/web/20060504154852/http://roots.iai.uni-bonn.de/research/logicaj/ |date=2006-05-04 }}, [http://www.objectteams.org/ Object Teams] {{webarchive|url=https://web.archive.org/web/20050831200910/http://objectteams.org/ |date=2005-08-31 }}, [http://prose.ethz.ch/ PROSE] {{webarchive|url=https://web.archive.org/web/20070124094344/http://prose.ethz.ch/ |date=2007-01-24 }}, [http://www.aspectbench.org/ The AspectBench Compiler for AspectJ (abc)] {{webarchive|url=https://web.archive.org/web/20141216200424/http://aspectbench.org/ |date=2014-12-16 }}, [[Spring framework]] (as part of its functionality), [[Seasar]], [http://roots.iai.uni-bonn.de/research/jmangler/ The JMangler Project] {{webarchive|url=https://web.archive.org/web/20051028191025/http://roots.iai.uni-bonn.de/research/jmangler/ |date=2005-10-28 }}, [http://injectj.sourceforge.net/ InjectJ] {{webarchive|url=https://web.archive.org/web/20050405080539/http://injectj.sourceforge.net/ |date=2005-04-05 }}, [http://www.csg.is.titech.ac.jp/projects/gluonj/ GluonJ] {{webarchive|url=https://web.archive.org/web/20070206010219/http://www.csg.is.titech.ac.jp/projects/gluonj/ |date=2007-02-06 }}, [http://www.st.informatik.tu-darmstadt.de/static/pages/projects/AORTA/Steamloom.jsp Steamloom] {{webarchive|url=https://web.archive.org/web/20070818100432/http://www.st.informatik.tu-darmstadt.de/static/pages/projects/AORTA/Steamloom.jsp |date=2007-08-18 }}</ref>
**[[AspectJ]]
*[[JavaScript]]<ref>Many: [http://i.gotfresh.info/2007/12/7/advised-methods-for-javascript-with-prototype/ Advisable] {{webarchive|url=https://web.archive.org/web/20080704052200/http://i.gotfresh.info/2007/12/7/advised-methods-for-javascript-with-prototype |date=2008-07-04 }}, [https://code.google.com/p/ajaxpect/ Ajaxpect] {{webarchive|url=https://web.archive.org/web/20160709203939/https://code.google.com/p/ajaxpect/ |date=2016-07-09 }}, [http://plugins.jquery.com/project/AOP jQuery AOP Plugin] {{webarchive|url=https://web.archive.org/web/20080113184156/http://plugins.jquery.com/project/AOP |date=2008-01-13 }}, [http://aspectes.tigris.org/ Aspectes] {{webarchive|url=http://archive.wikiwix.com/cache/20060508035836/http://aspectes.tigris.org/ |date=2006-05-08 }}, [http://www.aspectjs.com/ AspectJS] {{webarchive|url=https://web.archive.org/web/20081216010832/http://www.aspectjs.com/ |date=2008-12-16 }}, [http://www.cerny-online.com/cerny.js/ Cerny.js] {{webarchive|url=https://web.archive.org/web/20070627024906/http://www.cerny-online.com/cerny.js/ |date=2007-06-27 }}, [http://dojotoolkit.org/ Dojo Toolkit] {{webarchive|url=https://web.archive.org/web/20060221211958/http://www.dojotoolkit.org/ |date=2006-02-21 }}, [http://humax.sourceforge.net/ Humax Web Framework] {{webarchive|url=https://web.archive.org/web/20081209103012/http://humax.sourceforge.net/ |date=2008-12-09 }}, [https://code.google.com/p/joose-js/ Joose] {{webarchive|url=https://web.archive.org/web/20150318193601/http://code.google.com/p/joose-js/ |date=2015-03-18 }}, [[Prototype.js|Prototype]] - [http://www.prototypejs.org/api/function/wrap Prototype Function#wrap] {{webarchive|url=https://web.archive.org/web/20090505233620/http://www.prototypejs.org/api/function/wrap |date=2009-05-05 }}, [http://developer.yahoo.com/yui/3/api/Do.html YUI 3 (Y.Do)] {{webarchive|url=https://web.archive.org/web/20110125115930/https://developer.yahoo.com/yui/3/api/Do.html |date=2011-01-25 }}</ref>
*[[Logtalk (programming language)|Logtalk]]<ref>Using built-in support for categories (which allows the encapsulation of aspect code) and event-driven programming (which allows the definition of ''before'' and after ''event'' handlers).</ref>
*[[Lua (programming language)|Lua]]<ref>{{cite web|url=http://luaforge.net/projects/aspectlua/|title=AspectLua|publisher=|accessdate=11 August 2015|deadurl=no|archiveurl=https://web.archive.org/web/20150717094121/http://luaforge.net/projects/aspectlua/|archivedate=17 July 2015|df=}}</ref>
*[[make (software)|make]]<ref>{{cite web|url=http://www.bramadams.org/makao/|title=MAKAO, re(verse)-engineering build systems|publisher=|accessdate=11 August 2015}}{{dead link|date=May 2018 |bot=SheriffIsInTown |fix-attempted=yes }}</ref>
*[[Matlab]]<ref>{{cite web|url=http://www.sable.mcgill.ca/mclab/aspectmatlab/index.html|title=McLab|publisher=|accessdate=11 August 2015|deadurl=no|archiveurl=https://web.archive.org/web/20150924093214/http://www.sable.mcgill.ca/mclab/aspectmatlab/index.html|archivedate=24 September 2015|df=}}</ref>
*[[ML (programming language)|ML]]<ref>{{cite web|url=http://www.cs.princeton.edu/sip/projects/aspectml/|title=AspectML - Aspect-oriented Functional Programming Language Research|publisher=|accessdate=11 August 2015|deadurl=no|archiveurl=https://web.archive.org/web/20101205005108/http://www.cs.princeton.edu/sip/projects/aspectml/|archivedate=5 December 2010|df=}}</ref>
*[[Perl]]<ref>{{cite web|url=https://metacpan.org/module/Aspect|title=Aspect - Aspect-Oriented Programming (AOP) for Perl - metacpan.org|author=Adam Kennedy|publisher=|accessdate=11 August 2015|deadurl=no|archiveurl=https://web.archive.org/web/20130831064935/https://metacpan.org/module/Aspect|archivedate=31 August 2013|df=}}</ref>
*[[PHP]]<ref>Several: [http://aop.io PHP-AOP (AOP.io)] {{webarchive|url=http://archive.wikiwix.com/cache/20140818050736/http://aop.io/ |date=2014-08-18 }}, [http://go.aopphp.com Go! AOP framework] {{webarchive|url=https://web.archive.org/web/20130301043014/http://go.aopphp.com/ |date=2013-03-01 }}, [https://code.google.com/p/phpaspect/ PHPaspect] {{webarchive|url=https://web.archive.org/web/20160822234503/https://code.google.com/p/phpaspect/ |date=2016-08-22 }}, [http://www.seasar.org/en/php5/index.html Seasar.PHP] {{webarchive|url=https://web.archive.org/web/20051226040309/http://www.seasar.org/en/php5/index.html |date=2005-12-26 }}, [http://php-aop.googlecode.com/ PHP-AOP]{{dead link|date=May 2018 |bot=SheriffIsInTown |fix-attempted=yes }}, [https://flow.neos.io/ Flow] {{webarchive|url=https://web.archive.org/web/20180104132543/https://flow.neos.io/ |date=2018-01-04 }}, [https://github.com/AOP-PHP/AOP AOP PECL Extension] {{webarchive|url=https://web.archive.org/web/20170411031809/https://github.com/AOP-PHP/AOP |date=2017-04-11 }}</ref>
*[[Prolog]]<ref>{{cite web|url=http://www.bigzaphod.org/whirl/dma/docs/aspects/aspects-man.html|title=bigzaphod.org is coming soon|author=|date=|website=www.bigzaphod.org|accessdate=5 May 2018|deadurl=no|archiveurl=https://web.archive.org/web/20160420181837/http://www.bigzaphod.org/whirl/dma/docs/aspects/aspects-man.html|archivedate=20 April 2016|df=}}</ref>
*[[Python (programming language)|Python]]<ref>Several: [http://peak.telecommunity.com/ PEAK] {{webarchive|url=https://web.archive.org/web/20050409082546/http://peak.telecommunity.com/ |date=2005-04-09 }}, [http://old.aspyct.org Aspyct AOP]{{dead link|date=May 2018 |bot=SheriffIsInTown |fix-attempted=yes }}, [http://www.cs.tut.fi/~ask/aspects/aspects.html Lightweight Python AOP] {{webarchive|url=https://web.archive.org/web/20041009194711/http://www.cs.tut.fi/~ask/aspects/aspects.html |date=2004-10-09 }}, [http://www.logilab.org/projects/aspects Logilab's aspect module] {{webarchive|url=https://web.archive.org/web/20050309034259/http://www.logilab.org/projects/aspects |date=2005-03-09 }}, [http://pythius.sourceforge.net/ Pythius] {{webarchive|url=https://web.archive.org/web/20050408072457/http://pythius.sourceforge.net/ |date=2005-04-08 }}, [http://springpython.webfactional.com/1.1.x/reference/html/aop.html Spring Python's AOP module] {{webarchive|url=https://web.archive.org/web/20160304055741/http://springpython.webfactional.com/1.1.x/reference/html/aop.html |date=2016-03-04 }}, [http://pytilities.sourceforge.net/doc/1.1.0/guide/aop/ Pytilities' AOP module] {{webarchive|url=https://web.archive.org/web/20110825101213/http://pytilities.sourceforge.net/doc/1.1.0/guide/aop/ |date=2011-08-25 }}, [http://python-aspectlib.readthedocs.org/en/latest/ aspectlib] {{webarchive|url=https://web.archive.org/web/20141105061010/http://python-aspectlib.readthedocs.org/en/latest/ |date=2014-11-05 }}</ref>
*[[Racket (programming language)|Racket]]<ref>{{cite web|url=http://planet.racket-lang.org/display.ss?package=aspectscheme.plt&owner=dutchyn|title=PLaneT Package Repository : PLaneT > dutchyn > aspectscheme.plt|publisher=|accessdate=11 August 2015|deadurl=no|archiveurl=https://web.archive.org/web/20150905062740/http://planet.racket-lang.org/display.ss?package=aspectscheme.plt&owner=dutchyn|archivedate=5 September 2015|df=}}</ref>
*[[Ruby (programming language)|Ruby]]<ref>{{cite web|url=http://aspectr-fork.sourceforge.net/|title=AspectR - Simple aspect-oriented programming in Ruby|publisher=|accessdate=11 August 2015|deadurl=no|archiveurl=http://archive.wikiwix.com/cache/20150812003432/http://aspectr-fork.sourceforge.net/|archivedate=12 August 2015|df=}}</ref><ref>{{cite web|url=http://aquarium.rubyforge.org/|title=Home|author=Dean Wampler|publisher=|accessdate=11 August 2015}}{{dead link|date=May 2018 |bot=SheriffIsInTown |fix-attempted=yes }}</ref><ref>{{cite web|url=https://github.com/gcao/aspector|title=gcao/aspector|work=GitHub|accessdate=11 August 2015|deadurl=no|archiveurl=https://web.archive.org/web/20150104180534/https://github.com/gcao/aspector|archivedate=4 January 2015|df=}}</ref>
*[[Squeak]] [[Smalltalk]]<ref>{{cite web|url=http://www.prakinf.tu-ilmenau.de/~hirsch/Projects/Squeak/AspectS/|title=AspectS|author=|date=|website=tu-ilmenau.de|accessdate=5 May 2018|deadurl=yes|archiveurl=https://web.archive.org/web/20060106112030/http://www.prakinf.tu-ilmenau.de/~hirsch/Projects/Squeak/AspectS/|archivedate=6 January 2006|df=}}</ref><ref>{{cite web|url=http://csl.ensm-douai.fr/MetaclassTalk|title=MetaclassTalk: Reflection and Meta-Programming in Smalltalk|publisher=|accessdate=11 August 2015|deadurl=no|archiveurl=https://web.archive.org/web/20150729062351/http://csl.ensm-douai.fr/MetaclassTalk|archivedate=29 July 2015|df=}}</ref>
*[[UML 2|UML 2.0]]<ref>{{cite web|url=http://www.iit.edu/~concur/weavr|title=WEAVR|author=|date=|website=iit.edu|accessdate=5 May 2018|deadurl=no|archiveurl=https://web.archive.org/web/20081212200221/http://www.iit.edu/~concur/weavr/|archivedate=12 December 2008|df=}}</ref>
*[[XML]]<ref>{{cite web|url=https://code.google.com/p/aspectxml/|title=aspectxml - An Aspect-Oriented XML Weaving Engine (AXLE) - Google Project Hosting|publisher=|accessdate=11 August 2015|deadurl=no|archiveurl=https://web.archive.org/web/20150912161613/http://code.google.com/p/aspectxml/|archivedate=12 September 2015|df=}}</ref>
 
==See also==