phantom: a modern aspect language for pharo

40
PHANtom: A Modern Aspect Language for Pharo Johan Fabry, Daniel Galdames. PLEIAD Lab, DCC - Universidad de Chile

Upload: esug

Post on 20-May-2015

653 views

Category:

Technology


3 download

DESCRIPTION

ESUG 2011, Edinburgh

TRANSCRIPT

Page 1: PHANtom: A Modern Aspect Language for Pharo

PHANtom:A Modern Aspect Language for Pharo

Johan Fabry, Daniel Galdames. PLEIAD Lab, DCC - Universidad de Chile

Page 2: PHANtom: A Modern Aspect Language for Pharo

Johan Fabry

AOP ??

2

Page 3: PHANtom: A Modern Aspect Language for Pharo

Johan Fabry

AOP ??

2

Cross-cutting concerns

Aspect = module

‣ Behavior = WHAT = advice

‣ Quantification = WHEN = pointcuts

Running application = stream of join points

‣ ST computation = messages

‣ In PHANtom: method exec

Page 4: PHANtom: A Modern Aspect Language for Pharo

Johan Fabry

AOP ??

2

Cross-cutting concerns

Aspect = module

‣ Behavior = WHAT = advice

‣ Quantification = WHEN = pointcuts

Running application = stream of join points

‣ ST computation = messages

‣ In PHANtom: method exec

Page 5: PHANtom: A Modern Aspect Language for Pharo

Johan Fabry

AOP ??

2

Cross-cutting concerns

Aspect = module

‣ Behavior = WHAT = advice

‣ Quantification = WHEN = pointcuts

Running application = stream of join points

‣ ST computation = messages

‣ In PHANtom: method exec

Page 6: PHANtom: A Modern Aspect Language for Pharo

Johan Fabry

AOP ??

2

Cross-cutting concerns

Aspect = module

‣ Behavior = WHAT = advice

‣ Quantification = WHEN = pointcuts

Running application = stream of join points

‣ ST computation = messages

‣ In PHANtom: method exec

Page 7: PHANtom: A Modern Aspect Language for Pharo

Johan Fabry

AOP ??

2

Cross-cutting concerns

Aspect = module

‣ Behavior = WHAT = advice

‣ Quantification = WHEN = pointcuts

Running application = stream of join points

‣ ST computation = messages

‣ In PHANtom: method exec

Page 8: PHANtom: A Modern Aspect Language for Pharo

Johan Fabry

In the spirit of Smalltalk

3

Dynamic

Simple Powerful

Page 9: PHANtom: A Modern Aspect Language for Pharo

Johan Fabry

In the spirit of Smalltalk

3

Dynamic

Simple Powerful

Dynamic AOP

Page 10: PHANtom: A Modern Aspect Language for Pharo

Johan Fabry

In the spirit of Smalltalk

3

Dynamic

Simple Powerful

Dynamic AOP Develop normally

Page 11: PHANtom: A Modern Aspect Language for Pharo

Johan Fabry

In the spirit of Smalltalk

3

Dynamic

Simple Powerful

Dynamic AOP Develop normally

Minimal set of Constructs

Page 12: PHANtom: A Modern Aspect Language for Pharo

Johan Fabry

In the spirit of Smalltalk

3

Dynamic

Simple Powerful

Dynamic AOP Develop normally

Minimal set of ConstructsUniform / no restrictions

Page 13: PHANtom: A Modern Aspect Language for Pharo

Johan Fabry

In the spirit of Smalltalk

3

Dynamic

Simple Powerful

Dynamic AOP Develop normally

Minimal set of ConstructsUniform / no restrictions

First-class everything

Page 14: PHANtom: A Modern Aspect Language for Pharo

Johan Fabry

In the spirit of Smalltalk

3

Dynamic

Simple Powerful

Dynamic AOP Develop normally

Minimal set of ConstructsUniform / no restrictions

First-class everythingNew language features

Page 15: PHANtom: A Modern Aspect Language for Pharo

Johan Fabry

Pointcuts

4

Dyn

PowSim

Page 16: PHANtom: A Modern Aspect Language for Pharo

Johan Fabry

Pointcuts

4

PhPointcut receivers: 'TestCase' selectors: 'assert:'

Dyn

PowSim

Page 17: PHANtom: A Modern Aspect Language for Pharo

Johan Fabry

Pointcuts

4

PhPointcut receivers: 'TestCase' selectors: 'assert:'

PhPointcut receivers: 'TestCase+' selectors: #(assert: assert:equals:)

Dyn

PowSim

Page 18: PHANtom: A Modern Aspect Language for Pharo

Johan Fabry

Pointcuts

4

PhPointcut receivers: 'TestCase' selectors: 'assert:'

PhPointcut receivers: 'TestCase+' selectors: #(assert: assert:equals:)

Dyn

Pow

context: #(receiver sender arguments)

Sim

Page 19: PHANtom: A Modern Aspect Language for Pharo

Johan Fabry

Pointcuts

4

PhPointcut receivers: 'TestCase' selectors: 'assert:'

PhPointcut receivers: 'Test*' selectors: #(assert: assert:_: assert:_:_:) context: #(receiver) restrict: #(Tests_Mine)

PhPointcut receivers: 'TestCase+' selectors: #(assert: assert:equals:)

Dyn

Pow

context: #(receiver sender arguments)

Sim

Page 20: PHANtom: A Modern Aspect Language for Pharo

Johan Fabry

Advice

5

Sim Pow

Dyn

Page 21: PHANtom: A Modern Aspect Language for Pharo

Johan Fabry

Advice

5

PhAdvice pointcut: pc send: #incCount: to: self type: #after

Sim Pow

Dyn

Page 22: PHANtom: A Modern Aspect Language for Pharo

Johan Fabry

Advice

5

PhAdvice pointcut: pc send: #incCount: to: self type: #after

PhAdvice pointcut: pc advice: [:ctx | Transcript show: (ctx receiver asString);cr. ctx proceed.]] type: #around.

Sim Pow

Dyn

Page 23: PHANtom: A Modern Aspect Language for Pharo

Johan Fabry

Inter-Type Declaration

6

Sim Pow

Dyn

Page 24: PHANtom: A Modern Aspect Language for Pharo

Johan Fabry

Inter-Type Declaration

6

PhClassModifier on: ACTestCase addIV: 'phacount'

Sim Pow

Dyn

Page 25: PHANtom: A Modern Aspect Language for Pharo

Johan Fabry

Inter-Type Declaration

6

PhClassModifier on: ACTestCase addIV: 'phacount'

PhClassModifier on: ACTestCase addIM: 'phacount ↑phacount ifNil: [phacount := 0]'

Sim Pow

Dyn

Page 26: PHANtom: A Modern Aspect Language for Pharo

Johan Fabry

Aspect

PHAspect subclass: MyAspect ...

(Object subclass: #PhAspect ...)

Add PHAdvice and PHClassModifier instances

Send install to activate

Send uninstall to deactivate

7

Dyn

Sim Pow

Page 27: PHANtom: A Modern Aspect Language for Pharo

Johan Fabry

What happens here?

8

|asp|asp := PhAspect new add: (PhAdvice pointcut: (PhPointcut receivers: 'Transcript class' selectors: 'show:') advice: [ Transcript show: 'Have '] type: #before).asp install.Transcript show: 'reentrancy control'; cr

Page 28: PHANtom: A Modern Aspect Language for Pharo

Johan Fabry

What happens here?

8

|asp|asp := PhAspect new add: (PhAdvice pointcut: (PhPointcut receivers: 'Transcript class' selectors: 'show:') advice: [ Transcript show: 'Have '] type: #before).asp install.Transcript show: 'reentrancy control'; cr

Page 29: PHANtom: A Modern Aspect Language for Pharo

Johan Fabry

What happens here?

8

|asp|asp := PhAspect new add: (PhAdvice pointcut: (PhPointcut receivers: 'Transcript class' selectors: 'show:') advice: [ Transcript show: 'Have '] type: #before).asp install.Transcript show: 'reentrancy control'; cr

Page 30: PHANtom: A Modern Aspect Language for Pharo

Johan Fabry

What happens here?

8

|asp|asp := PhAspect new add: (PhAdvice pointcut: (PhPointcut receivers: 'Transcript class' selectors: 'show:') advice: [ Transcript show: 'Have '] type: #before).asp install.Transcript show: 'reentrancy control'; cr

Page 31: PHANtom: A Modern Aspect Language for Pharo

Johan Fabry

What happens here?

8

|asp|asp := PhAspect new add: (PhAdvice pointcut: (PhPointcut receivers: 'Transcript class' selectors: 'show:') advice: [ Transcript show: 'Have '] type: #before).asp install.Transcript show: 'reentrancy control'; cr

Page 32: PHANtom: A Modern Aspect Language for Pharo

Johan Fabry

What happens here?

8

|asp|asp := PhAspect new add: (PhAdvice pointcut: (PhPointcut receivers: 'Transcript class' selectors: 'show:') advice: [ Transcript show: 'Have '] type: #before).asp install.Transcript show: 'reentrancy control'; cr

Page 33: PHANtom: A Modern Aspect Language for Pharo

Johan Fabry

What happens here?

8

|asp|asp := PhAspect new add: (PhAdvice pointcut: (PhPointcut receivers: 'Transcript class' selectors: 'show:') advice: [ Transcript show: 'Have '] type: #before).asp install.Transcript show: 'reentrancy control'; cr

Page 34: PHANtom: A Modern Aspect Language for Pharo

Johan Fabry

What happens here?

8

|asp|asp := PhAspect new add: (PhAdvice pointcut: (PhPointcut receivers: 'Transcript class' selectors: 'show:') advice: [ Transcript show: 'Have '] type: #before).asp install.Transcript show: 'reentrancy control'; crBOOM

Page 35: PHANtom: A Modern Aspect Language for Pharo

Johan Fabry

Reentrancy control

PHANtom: no problem!

‣Aspect execution by default NOT MATCHED

More power if you want it: Membranes [Tanter & Tabareau]

Use membranes to control

‣ join point emission and capture scope

‣ aspect observing join points

9

Dyn

Sim Pow

Page 36: PHANtom: A Modern Aspect Language for Pharo

Johan Fabry

Advice orderingMultiple advice 1 join point

“Classic”: advice precedence

‣ Global and static

PHANtom deployment precedence

‣ Global and ‘static’

‣ Complement or override on pointcut

PHANtom dynamic precedence in the advice

‣ OrderedCollection of PHAdvice instances

‣ get from context

‣ set on context

10

Dyn

Sim Pow

Page 37: PHANtom: A Modern Aspect Language for Pharo

Johan Fabry

Not in the paper ...

TDD

‣ 155 tests

‣ 90+% coverage

11

Page 38: PHANtom: A Modern Aspect Language for Pharo

Johan Fabry

Not in the paper ...

TDD

‣ 155 tests

‣ 90+% coverage

11

Figura 15: Test coverage con Hapao

60

Page 39: PHANtom: A Modern Aspect Language for Pharo

Johan Fabry

Future work

Optimize the implementation

Compile PHANtom code

Infrastructure for Domain-Specific Aspect Languages

12

Page 40: PHANtom: A Modern Aspect Language for Pharo

Johan Fabry

http://pleiad.cl/PHANtom

13