Title: ABC: an implementation of AspectJ
1ABC an implementation of AspectJ
- Oege de Moor
- Programming Tools Group
- University of Oxford
- joint work with
- Ganesh Sittampalam, Sascha Kuzins, Chris Allan,
- Pavel Avgustinov, Julian Tibble, Damien Sereni
(Oxford) - Laurie Hendren, Jennifer Lhoták, Ondrej Lhoták,
Bruno Dufour, Christopher Goard, Clark Verbrugge
(McGill) - Aske Simon Christensen (Århus)
2What is AspectJ?
- disciplined metaprogramming
3The bluffer's guide to aspect-lingo
Static
Intertype declarations inject new members
into existing classes at compile-time
Dynamic
aspect observes base program when certain
patterns of events happen, run some extra code
join point event node in (dynamic) call
graph pointcut pattern of events set of
nodes in call graph shadow program point
that corresponds to join point advice extra
code
4EJB policy enforcement
public aspect DetectEJBViolations pointcut
uiCalls() call( java.awt..(..))
before() uiCalls() cflow(call(
EnterpriseBean.(..))) System.err.println("UI
call from EJB") declare error
uiCalls() within(EnterpriseBean)
"UI call from EJB" pointcut
staticMemberAccess() set(static
EnterpriseBean.) declare error
staticMemberAccess() "EJBs are not
allowed to have non-final static vars"
5Counting live objects per class
public aspect AllocFree public interface
Finalize declare parents mypackage..
implements Finalize public void
Finalize.finalize() throws Throwable
LiveData.decr(this.getClass())
before(Object tgt) initialization(mypackage..
.new(..)) this(tgt) LiveData.incr(tgt.get
Class())
6Authorisation
public abstract aspect AbstractAuthAspect
private Subject _authenticatedSubject public
abstract pointcut authOperations() ...
Object around() authOperations()
!cflowbelow(authOperations()) try
return Subject.doAsPrivileged(_authenticatedSubjec
t, new PrivilegedExceptionAction()
public Object run() throws Exception
return proceed() , null)
catch (PrivilegedActionException ex) throw
new AuthorizationException(ex.getException())
7New compiler pass
public aspect AspectTransformPass
AspectTransformer Assign.aspectTransformEnter(As
pectTransformer at) .... Node
Assign.aspectTransformLeave(AspectTransformer at)
... AST node Assign has
subclasses LocalAssign, FieldAssign, ...
8ajc standard AspectJ compiler
aspects
weaving
ajc
java source
class files
jars
- builds on Eclipse compiler
- weaving with BCEL
- incremental
- about 45KLOC, excluding IDE support
- started out as source-to-source
- java parts may be aspect-aware
Daniel Sabbah (VP of development_at_ IBM) critical
to our survival
9Problems with jars vs source
public class MethodMatch public static
void main(String args)
foo((Object)"Object") foo("String")
public static void foo(Object o)
System.out.println("An object " o)
public aspect NewFoo public static void
MethodMatch.foo(String s)
System.out.println("A string " s)
compile together from source An object
Object A string String
weave aspect into MethodMatch.class An object
Object An object String
10What do you pay at runtime?
From the FAQ on aspectj.org We aim for the
performance of our implementation of AspectJ to
be on par with the same functionality hand-coded
in Java. Anything significantly less should be
considered a bug. ...we believe that code
generated by AspectJ has negligible performance
overhead.
11Measuring the cost with J
modified ajc
frontend
tagging bytecodeweaver
standard JVM
Dufour, Goard et al, OOPSLA 2004
JVMPI interface
J dynamic metric tool
JVMPI agent
standard metrics
metric analyser with tag propagator
AspectJ-specific metrics
12ajc performance
13The need for a second compiler
- language definition other than test suite
- explore AOP language design space
- experiment with better code generation
- experiment with static analyses for safety
checks and optimisations
14The AspectBench Compiler ABC
15Polyglot scope for intertype decls
host class
16Soot Jimple
int foo(int, int) Example this
int x, y, i0, i1 this
_at_thisExample x _at_parameter0 int
y _at_parameter1 int if x y goto
label0 i0 y - x return
i0 label0 i1 x - y
return i1
int foo(int x, int y) if (xreturn (y-x) else return (x-y)
normal compilation
want to weave aspect Aspect after()
returning execution( foo(..))
System.out.println("woven") after()
returning(int x) execution(int foo(..))
System.out.println("result"x)
17Weaving at shadows
this _at_thisExample x
_at_parameter0 int y _at_parameter1 int
nop if x y goto label0
i0 y - x i1 i0 goto
label1 label0 i1 x - y
label1 nop return i1
nop theAspect staticinvoke aspectOf()() virtualinvoke theAspect.void afterReturning0()() nop theAspect1
staticinvoke ()
adviceformal i1 virtualinvoke
theAspect1.
(adviceformal) nop
18ABC performance
19Win (1) no closures for around
public class ShadowClass implements
AroundClosure1 public ret-type proceed(int
shadowID, arg-type arg1, ...)
switch(shadowID) case 0 ... do
what first shadow did ... case 1 ... do
what second shadow did ...
public void shadowMethod() ...
Aspect.aspectOf().adviceMethod1(this,0,arg1,...)
... public void anotherShadowMethod()
... Aspect.aspectOf().adviceMethod1(this,1,ar
g1,...) ...
calls thisparam.proceed(0,...)
calls thisparam.proceed(1,...)
20Win (2) no stacks for cflow
cflow(call( foo(..))) call ( bar(..))
matches call stack
- ajc
- simulates call stack by pushing and popping
around foo calls - one stack per thread
bar
...
- abc
- use counter in lieu of stack when possible
- CSE on cflow expressions
- look up thread-local stack/counter only once per
body - static estimate of possible call stacks
can eliminate runtime cost completely allow
cflow in declare warning/error
foo
...
Sereni et al, AOSD 2003.
21Extensibility of abc
size of abc 40KLOC polyglot 60KLOC Soot 180KLOC
- 3 new ast classes
- 3 new weaver classes
- override 1 ast class
- 1 new node factory
- 1 new visitor pass
- total 946 lines
- enable with compiler flags
- three extensions
- local variables in pointcuts
- cast pointcut
- global pointcuts
in the works pointcuts that query program
trace pure modifier on aspects
22ABC Summary
- Implements the same language as ajc
- Whole-program, aimed at
- extensibility
- static analysis
- performance of compiled code
- Suite of associated tools decompiler,
performance measurement, visualisation in
Eclipse - Current status
- pass majority of ajc test suite
- likely release mid-October complete development
in 9 months