[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [aosd-discuss] Dynamically scoped functions

Gregor Kiczales wrote:
> (warning, this message is long!)
> I guess I think this framework misses key aspects of AOP.
> I do agree that there is a sense in which the cflow pointcut feels like
> a "lexically scoped dynamic binding". But to try to cast all of AOP into
> this intuitition doesn't work.
> Some of the problems I see with the dynamic binding characterization are:
>   - Dynamic binding is too restrictive for AOP.
>     We want AOP to be able to have pointcuts that involve static
>     analysis as well. Consider just the simple within pointcut
>     in AspectJ.
>     Or consider the more elaborate example from my AOSD talk
>     [http://tinyurl.com/p22w]. In that example, we want the pointcuts
>     to work in terms of a static control flow analysis. We essentially
>     write a pointcut that says "find the places control can reach from
>     here, and do something interesting there".

Both examples are concerned with field accesses, AFAICT. (At least, the 
examples I have seen so far for "within" are concerned with field 
accesses as well.)

I think Java's approach for handling fields is broken, and I think most 
people would agree who have tried to implement language extensions for 
Java. So for the time being, I take the freedom to ignore field access 
issues. ;) (More below.)

wrt "pcflow" - wouldn't you need to capture the "real cflow" anyway, 
according to the notion of Jumping Aspects? What does "pcflow" add then?

>     There are a number of interesting aspects that could use such
>     functionality, and several researchers are working in this area.

I would be very happy to see examples that go beyond field access issues.

>   - dflet is too restrictive.
>     We don't want to have to wrap the entry to the computation in a
>     dflet. This interferes with non-invasiveness (obliviousness).

This is very straightforward to fix. Just redefine that entry.

>   - Just functions is too restrictive.
>     We want join points to be able to be other things, like field
>     accesses.

Huh?!? You probably know best that field accesses are also modelled as 
function calls in CLOS. (...and - before that issue comes up - that it 
doesn't necessarily interfere with efficient execution.)

>   - Lack of compositional crosscutting. 
>     We want to be able to write things like:
>      (see http://tinyurl.com/p259 for details of ... )
>      pointcut move(): ...;
>      pointcut topLevelMove(): move() && !cflowbelow(move());
>     The poincuts are the crosscutting mechanism. They let you take
>     a cut or slice through the code (or execution) and affect
>     semantics there. And, critically, the pointcuts are compositional.
>     (The ll1-discuss people remember Hal and Gerry saying that
>     PL mechanisms have to be compositional and support abstraction.)
>     I don't see that the dflet mechanism is compositional.

Take a look at multidflet. It takes a list of function names as a 
parameter. All I need now is another function that produces a list of 
function names to be captured by multidflet.

Any approach that allows one to write functions that produce lists of 
function names would be candidates for valid pointcut models.

For example, it seems to me that the best way to handle negative 
information ("!cflowbelow") is a logic metaprogramming approach (in the 
sense of SOUL and Tyruba). It's pretty easy to include a logic 
programming framework in Common Lisp...

> Of course you could fix these problems easily enough. You could:
>   - Add more kinds of points than function calls. Maybe call
>     them join points!

See above. Everything can be modelled as a function call in Lisp.

>   - Define compositional predicates on those points. Maybe
>     call them pointcuts!!

See above. multidflet is able to cooperate with any function that 
produces lists of function names. (It's interesting to note that this 
marks a line between base-level and meta-level programming: while dflet 
is purely at the base level, functions that produce lists of function 
names are clearly at the meta level.)

>   - Make it possible to define advice on pointcuts globally,
>     to get complete non-invasiveness (obliviousness) back.
>     Maybe call this advice!!! :)


(setf (symbol-function 'main)
       (lambda (&rest args)
         (dflet ...
           (main ...))))


> I think that would end up being pretty close to the characterization
> in Mitch Wand's papers.

I haven't read his papers in detail yet. On a first sweep it seems to me 
that his work is more concerned with semantic descriptions of "full" AOP 
whereas I am more concerned with the isolation of the fundamental 
language mechanisms.

I am not claiming that my paper provides everything you will ever need 
to do AOP. However, I think it describes the essential contribution of 
AOP. From a Lisp perspective, everything else is pretty straightforward 
macrology. (Or at least, it gets you very far...)


Pascal Costanza               University of Bonn
mailto:costanza@web.de        Institute of Computer Science III
http://www.pascalcostanza.de  Römerstr. 164, D-53117 Bonn (Germany)