Expressiveness and Complexity of Crosscut Languages

Expressiveness and Complexity
of Crosscut Languages
Karl Lieberherr, Jeffrey Palm and Ravi
Sundaram
Northeastern University
FOAL 2005 presentation
1
Goal
• Crosscut Languages are important in AOP
• Study them abstractly using expressions
on graphs: lower bounds and upper bounds
• Assumption: know entire program or class
graph
• Of interest to: AOSD language designers
and tool builders and mathematicians.
2
ALL PROBLEMS
ARE POLYNOMIAL
Regular Expressions on Graphs
• Questions: Given G and reg. exp. r:
– Is there a path in G satisfying r? (SAT)
– Do all paths in G that satisfy r contain n in G?
(ALWAYS)
– Is there a path in G that starts with e and satisfies r?
(FIRST)
• Questions: Given G and reg. exps r1 and r2:
– Is the set of paths in G satisfying r1 a subset of the
set of paths satisfying r2? (IMPL)
• What has this to do with AOSD?
Generalizes regular expressions on strings:
sentences must be node paths in graphs. Work by Tarjan and Mendelzon.
3
Enhanced Regular Expressions
• ERE = regular expressions (primitive,
concatenation, union, star) with
– complement/negation
– nodes and edges
4
Canonical Crosscut Language
Enhanced Regular Expressions
AspectJ Pointcuts
Traversal Strategies
subset of XPath
5
Some PARC-Northeastern History
about Crosscut Languages:
Enhanced Regular Expressions (ERE)
>From [email protected] Thu Aug 31 13:33:57 1995
>To [email protected]
(cc to Gregor, Crista and Jens Palsberg et al.)
Subject: Re: Boolean and Regular
We seem to be converging, but I still think that enhanced regular
expressions can express all of the operators. Here is the enhanced
regular expression language from a while back:
Atomic expressions:
A The empty traversal at class A
lnk A link of type lnk ("any" is a special case of any link type)
For combining expressions, the usual regular expression crowd:
.
concatenation
\cap
intersection
\cup
union
*
repetition
not
negation
6
Same message continued:
Demeter in ERE
[A,B]
through edges
bypassing edges
through vertices
bypassing vertices
d1 join d2
d1 merge d2
d1 intersect d2
not d1
A.any*.B
any*.lnk.any*
not(any*.lnk.any*)
any*.A.any*
not(any*.A.any*)
[d1].[d2]
[d1] \cup [d2]
[d1] \cap [d2]
not([d1])
7
Enhanced Regular Expressions on
PROBLEMS
Graphs ALL
BECOME NP-COMPLETE
• Questions: Given G and reg. exp. r:
– Is there a path in G satisfying r? (SAT)
– Do all paths in G that satisfy r contain n in G?
(ALWAYS)
– Is there a path in G that starts with e and satisfies r?
(FIRST)
• Questions: Given G and reg. exps. r1 and r2:
– Is the set of paths in G satisfying r1 a subset of the
set of paths satisfying r2? (IMPL)
• Ok, related to Demeter but how does AspectJ
come in?
8
9
My response
From lieber Thu Aug 31 13:51:57 1995
From: Karl Lieberherr <lieber>
To: [email protected], [email protected]
Subject: Re: Boolean and Regular
Cc: [email protected], [email protected], [email protected],
[email protected], [email protected], [email protected],
[email protected], [email protected], [email protected]
Hi John:
yes, we agree. The operators of what I called Boolean algebra operators
are just as well counted as regular expression operators.
I like your integration; have to think more about how expressive it is.
-- Karl
CLAIM: ERE are the foundation for crosscut languages
10
Using ERE for AspectJ
AspectJ
k (a primitive)
cflow(k)
&&
||
!
ERE
main any* k
main any* k any*
\cap
\cup
!
11
We continue the study of crosscut
languages
• and show that AspectJ pointcuts are
equivalent to Demeter strategies and vice
versa if you abstract from the unimportant
details.
• we show the correspondence by direct
translations in both directions.
12
Examples first
• Show two programs and their graph
abstractions
13
class Example { // AspectJ program
public static void main(String[] s) {x1(); nx1();}
static void x1() { x2(); nx2(); }
static void x2() { x3(); nx3(); }
static void x3() { target(); }
static void nx1() { x2(); nx2(); }
static void nx2() { x3(); nx3(); }
static void nx3() { target(); }
static void target() {}
}
aspect Aspect {
pointcut p1(): cflow(call (void x1()))
||
cflow(call (void nx2()))
||
cflow(call (void x3()));
pointcut p2() : cflow(call (void nx1()))
||
cflow(call (void x2()));
pointcut p3() : cflow(call (void x1()));
pointcut p4() : cflow(call (void nx3()));
pointcut all(): p1() && p2() && p3() && p4();
before(): all() && !within(Aspect) {
System.out.println(thisJoinPoint);
}
}
main
Meta graph=
Call graph
x1
nx1
x2
nx2
x3
main
x1
x2
x3
target
nx3
target
…
nx3
target
Instance tree
Call tree
Selected by all()
14
class Main { // Java Program with DJ
X1 x1; Nx1 nx1;
public static void main(String[] s) {
ClassGraph cg = new ClassGraph(); Main m = new Main();
cg.traverse(m, // m is the complete tree with 8 leaves
"intersect(" + // union is expressed by concatenation of edges
X1
"{source: Main -> X1 X1 -> target: Target " +
"source: Main ->Nx2 Nx2 -> target: Target " +
"Main -> X3 X3 -> Target}," +
"{source: Main -> Nx1 Nx1 -> target: Target " +
"Main -> X2 X2 -> Target}," +
X2
"{source:Main -> X1 X1 -> target: Target}," +
"{source:Main -> Nx3 Nx3 -> target: Target})",
new Visitor(){
public void start (){System.out.println(" start traversal");}
X3
public void finish (){System.out.println(" finish traversal");}
void before (Target host){System.out.print(host + ' ');}
void before (Nx3 host) {System.out.print(host + ' ');}
void before (X2 host) {System.out.print(host + ' ');}
void before (X1 host) {System.out.print(host + ' ');}
Main
});}
}
X1
class X1 { X2 x2; Nx2 nx2; } class Nx1 { X2 x2; Nx2 nx2; }
X2
class X2 { X3 x3; Nx3 nx3; } class Nx2 { X3 x3; Nx3 nx3; }
X3
class X3 { Target t;
} class Nx3 { Target t;
}
Target
class Target {}
Nx3
Target
…
Main
Meta graph=
Class graph
Nx1
Nx2
Nx3
Target
Instance tree
Object tree
Selected by strategy
15
Crosscut Language SAJ
S ::=
a set of nodes
k |
set of nodes having label k
flow(S) | set of nodes reachable from S
S | S | union
base language
S & S | intersection
!S
complement
16
Crosscut language SD
D ::=
[A,B] |
D.D|
D|D |
D&D|
!D
a set of paths
paths from A to B
concatenation of paths
union of paths
intersection of paths
complement of paths
base language
17
Instance Tree
J is called an instance tree of graph G, if J is
a tree, Root(J)=Start(G) and for each edge
e=(u,v) in E(J), there is an edge e’ = (u’, v’)
in G so that Label(u)=Label(u’) and
Label(v)=Label(v’). J is a rooted tree with
edges directed away from the root. (think
of Label = Class)
18
Expressions on Graphs
Expressions on Instances
• Questions: Given graph G and r: Exists J sat G:
– Is there a path in J satisfying r?
– For a given node m in G: Do all paths in J that satisfy r
contain a node n in J with Label(n) = m?
– Is there a path in J that starts with e and satisfies r?
• Questions: Given G and r1 and r2: Exists J sat G:
– Is the set of paths in J satisfying r1 a subset of the set
of paths satisfying r2?
push down to instances
19
Expressions on instances
• Questions: Given graph G, r and instance
J satisfying G:
– Determine the set of edges e from Root(J) so
that there is a path in J starting with e and
satisfying r?
20
Connections between SAJ and SD
SAJ
• selects set of nodes
in tree (but there is a
unique path from root
to each node)
• set expression flavor
SD
• selects set of paths in
tree
• regular expression
flavor
21
Equivalence of node sets and path
sets
In a rooted tree, such as an instance tree, there is
a one-to-one correspondence between nodes,
and, paths from the root, because there is a
unique path from the root to each node.
We say a set of paths P is equivalent to a set of
nodes N if for each n in N there is a path p in P
that starts at the root and ends at n and similarly
for each p in P it is the case that p starts at the
root and ends in a node n in N.
22
Theorem 1
• A selector expression in SD (SAJ) can be
transformed into an expression in SAJ
(SD) in polynomial-time, such that for all
meta graphs and instance trees the set of
paths (nodes) selected by the SD (SAJ)
selector is equivalent to the set of nodes
(paths) selected by the SAJ (SD) selector.
23
Proof: T: SD to SAJ
SD
T([A,B])
T(D1.D2)
T(D1 | D2)
T(D1 & D2)
!D
SAJ
flow(A) & B
flow(T(D1)) & T(D2)
T(D1) | T(D2)
T(D1) & T(D2)
!T(D)
24
Proof
SAJ
T(k)
SD
Start(G)
25
class Example { // AspectJ program
public static void main(String[] s) {x1(); nx1();}
static void x1() {if (false) x2(); nx2(); }
static void x2() { if (false) x3(); nx3(); }
static void x3() { if (false) target(); }
static void nx1() {if (false) x2(); nx2(); }
static void nx2() {if (false) x3(); nx3(); }
static void nx3() {if (false) target(); }
static void target() {}
}
aspect Aspect {
pointcut p1(): cflow(call (void x1()))
||
cflow(call (void nx2()))
||
cflow(call (void x3()));
pointcut p2() : cflow(call (void nx1()))
||
cflow(call (void x2()));
pointcut p3() : cflow(call (void x1()));
pointcut p4() : cflow(call (void nx3()));
pointcut all(): p1() && p2() && p3() && p4();
before(): all() && !within(Aspect) {
System.out.println(thisJoinPoint);
}
}
main
Meta graph
x1
nx1
x2
nx2
x3
main
x1
x2
x3
target
nx3
target
…
nx3
target
Instance tree
Selected by all()
APPROXIMATION
26
Computational Properties
• Select-Sat: Given a selector p and a meta graph
G, is there an instance tree for G for which p
selects a non-empty set of nodes.
• X/Y/Z
– X is a problem, e.g., Select-Sat
– Z is a language, e.g. SAJ or SD
– Y is one of -,&,! representing a version of Z.
• X/-/Z base language of Z.
• X/&/Z is base language of Z plus intersection.
• X/!/Z is base language of Z plus negation.
27
Approximation and Computational
Properties
• Not Select-Sat: Given a selector p and a
meta graph G, for all instance trees for G
selector p selects an empty set of nodes,
i.e. p is useless.
• If Not Select-Sat(p,G)/*/SAJ holds then
also for the original Java program the
selector p (pointcut) is useless.
28
Same results for 5 problems
• We don’t know yet how to unify all the
proofs.
• So we prove the results separately.
29
Results (Problem)
Problem
SD
SAJ
-
P
P
&
NP-complete
NP-complete
!
NP-complete
NP-complete
30
Results (Problem)
•
•
•
•
•
Results(Select-Sat)
Results(Not Select-Impl)
Results(Select-First)
Results(Not Select-Always)
Results(Not Select-Never)
31
Select-Sat
• Select-Sat/&/SAJ is NP-complete
• This is unexpected because we have only
primitive pointcuts (e.g., call), cflow, union
and intersection. Looks like Satisfiability of
a monotone Boolean expression which is
polynomial.
32
33
An idea by Gregor
• add a new primitive pointcut to AspectJ:
traversal(D).
• cflow(call (void class(traversal({A->B})).
foo()))
&& this(B)
– in the cflow of a call to void foo() of a class
between A and B and the currently executing
object is of class B.
34
Combining SAJ and SD
• Extend SD with [A,*]: all nodes reachable
from A
• Replace in SAJ: flow(S) by nodes(D)
• Can simulate flow(S): use [X,*] for each X
in S and take the union.
35
Crosscut Language SAJ/SD
S ::=
a set of nodes
k|
set of nodes having label k
nodes(D) | set of nodes selected by D in SD
S | S | union
S & S | intersection
!S
complement
SAJ/SD seems interesting. Have both capabilities of AspectJ pointcuts
and Demeter traversals.
This is basically what Gregor Kiczales suggested a few years ago:he called it
traversal(D), instead of nodes(D).
36
Crosscut language SD
D ::=
[A,B] |
D.D|
D|D |
D&D|
!D
a set of paths
paths from A to B
concatenation of paths
union of paths
intersection of paths
complement of paths
37
Mathematics for AOP
string
graph/
instance tree
class graph/
instance tree
reg. exp.
Kleene
Mendelzon (SIAM
Comp. 95, no instance
trees)
Palsberg/Xiao/
Lieberherr (TOPLAS
95)
e. reg. exp
Kleene
PARC/Northeastern
(summer 95)
Palsberg/Patt-Shamir/
Lieberherr (96)
Palsberg/PattShamir/Lieberherr (96)
Palm/Sundaram/
Lieberherr (04)
strategy
graph
?
Patt-Shamir/
Orleans/Lieberherr
(97,05)
Patt-Shamir/
Orleans/Lieberherr
(97, 05)
Wand/Lieberherr (01)
38
SAT: is there a path in G
satisfying r?
graph G/
instance tree
class graph G/
instance tree
reg. exp. r
Mendelzon (SIAM J. Comp. 95, no
instance trees): polynomial
Palsberg/Xiao/
Lieberherr (TOPLAS
95): polynomial
(special case)
e. reg. exp
r
PARC/Northeastern (summer 95)
Palm/Sundaram/ Lieberherr (04):
NP-complete
Palm/Sundaram/
Lieberherr (04): NPcomplete
strategy
graph r
Patt-Shamir/ Orleans/Lieberherr
(97,05): polynomial
Patt-Shamir/
Orleans/Lieberherr
(97, 05): polynomial
39
SAT: is there a path in G
satisfying r?
graph G/
instance tree
class graph
G/
instance tree
reg. exp. r
Mendelzon (SIAM J. Comp. 95,
no instance trees): polynomial
Palsberg/Xiao/
Lieberherr (TOPLAS
95): polynomial
(special case)
e. reg. exp
r
strategy
graph r
PARC/Northeastern (summer 95)
Palm/Sundaram/ Lieberherr (04):
NP-complete
Palm/Sundaram/
Lieberherr (04): NPcomplete
Patt-Shamir/ Orleans/Lieberherr
(97,05): polynomial
Patt-Shamir/
Orleans/Lieberherr
(97, 05): polynomial
40
SAT: is there a path in G
satisfying r? results identical for class graphs
reg. exp.
e. reg. exp.
strat. graph
e. strat. graph
SAJ (AspectJ)
SD (Demeter)
SAJ-base
SD-base
graph G
poly.
NPC (add negation)
poly.
NPC (add intersection/negation)
NPC
NPC
poly. (without intersection)
poly. (without intersection)
41
Abbreviations
Language
regular exp.
enhanced regular exp.
strategy graph
enhanced strategy graph
SAJ (AspectJ)
SD (Demeter)
SAJ-base
SD-base
Abbreviation
RE
ERE
SG
ESG
SAJ
SD
SAJB
SDB
42
Polynomial Translations
• We want to know which languages are
fundamental. We conjecture that all languages
can be translated in polynomial time into ERE.
Maybe we also need ESG?
• The translations must preserve the meaning:
–
–
–
–
same set of nodes or
same set of paths or
set of paths corresponding to a set of nodes or
set of nodes corresponding to a set of paths.
43
Motivation for polynomial
translations
• If a large number of languages can be
translated efficiently to ERE, we only need
an efficient implementation for ERE.
• Currently the AP Library uses SG with
intersection. If we would add complement,
the AP Library would use ESG.
44
translate row to column
N: no, unless P=NP;
NN: no
Polynomial Translations ( any
mistakes?)
RE
RE
ERE
ERE
SG
ESG
SAJ
SD
Y
Y
N
Y
N
N
NN
SG
ESG
SAJ
SD
SAJB
SDB
SAJB
SDB
N
N
N
N
Y
Y
NN
Y
Y
Y
Y
N
Y
Y
Y
Y
Y
Y
Y
Y
Y
Y
NN
45
Discussion
• some results are trivial: an RE sentence is
trivially an ERE sentence.
• an ERE sentence can not be translated in
polynomial time to an RE sentence
because negation cannot be simulated by
union et al.
• An SAJ sentence cannot be translated to
an SDB sentence in polynomial time
because otherwise P=NP (consider SAT).
46
Assignments
• We want to fill in all 64 entries and have a
proof for them. This is a good opportunity
for a beginning PhD student.
• Yuantai: please can you do the upper
triangle.
• Jingsong: please can you do the lower
triangle.
47