21
© Marcus Denker Unanticipated Partial Behavioral Reflection David Röthlisberger Marcus Denker Eric Tanter

Unanticipated Partial Behavioral Reflection

Embed Size (px)

DESCRIPTION

"Unanticipated Partial Behavioral Reflection"Dynamic, unanticipated adaptation of running systems is of interest in a variety of situations, ranging from functional upgrades to on-the-fly debugging or monitoring of critical applications. In this paper we study a particular form of computational reflection, called unanticipated partial behavioral reflection, which is particularly well-suited for unanticipated adaptation of real-world systems. Our proposal combines the dynamicity of unanticipated reflection, i.e., reflection that does not require preparation of the code of any sort, and the selectivity and efficiency of partial behavioral reflection. First, we propose unanticipated partial behavioral reflection which enables the developer to precisely select the required reifications, to flexibly engineer the metalevel and to introduce the meta behavior dynamically. Second, we present a system supporting unanticipated partial behavioral reflection in Squeak Smalltalk, called Geppetto, and illustrate its use with a concrete example of a Seaside web application. Benchmarks validate the applicability of our proposal as an extension to the standard reflective abilities of Smalltalk.ESUG, 04.09.2006

Citation preview

Page 1: Unanticipated Partial Behavioral Reflection

© Marcus Denker

Unanticipated PartialBehavioral Reflection

David RöthlisbergerMarcus DenkerEric Tanter

Page 2: Unanticipated Partial Behavioral Reflection

© Marcus Denker

Roadmap

> Example> Behavioral Reflection

— Smalltalk / Metaclasstalk— Unanticipated Reflection— Partial Reflection

> Unanticipated Partial Behavioral Reflection> Example revisited> Benchmarks> Conclusion

Page 3: Unanticipated Partial Behavioral Reflection

© Marcus Denker

Running Example

> Typical web application (e.g. Wiki)

> Shows performance problem under high load

> Goals: — Profile and fix the problem— No restart / interruption of service

Page 4: Unanticipated Partial Behavioral Reflection

© Marcus Denker

Towards a Solution

> Analyse the problem— Install profiler— Analyze— Retract profiler

> Solve the problem— Introduce a caching mechanism— Experiment with multiple solutions

Page 5: Unanticipated Partial Behavioral Reflection

© Marcus Denker

Reflection

> Reflection: computation about computation— base level / meta level— causally connected

> Structural Reflection — Reification of structure

> Behavioral Reflection— Reification of execution

Page 6: Unanticipated Partial Behavioral Reflection

© Marcus Denker

Unanticipated Reflection

> “Unanticipated Use” means: — No need to know in advance (and plan for) reflection— Possible to be done at runtime

> Java: reflection only at load time— No runtime change in general— Need to compile in hooks for reflection

> Smalltalk reflection is unanticipated— taken for granted. But it’s quite cool!

Page 7: Unanticipated Partial Behavioral Reflection

© Marcus Denker

Reflection in Smalltalk

> Structural Reflection— Classes / Methods are objects— Can be changed at runtime

> Behavioral Reflection— No model of execution below method body— message sending / variable access hard coded by VM— #doesNotUnderstand / MethodWrappers

> Reflective capabilities of Smalltalk should be improved!

Page 8: Unanticipated Partial Behavioral Reflection

© Marcus Denker

MetaclassTalk

> Extends the Smalltalk metaclass model

> Metaclass defines— message lookup— access to instance variables

> Problems:— Reflection only controllable at class boundaries— No fine-grained selection (e.g. single operations)— Protocol between base and meta level is fixed

Page 9: Unanticipated Partial Behavioral Reflection

© Marcus Denker

Partial Reflection

> Hooksets: collection of operation occurrences> Links

— Bind hooksets to metaobjects— Define Protocol between base and meta

> Goals— Highly selective reification— Flexiblel metalevel engineering

– Protocol specification– Cross-cutting hooksets

activation

condition

hookset

metaobject

links

Page 10: Unanticipated Partial Behavioral Reflection

© Marcus Denker

Geppetto

> Partial Behavioral Reflection pioneered in Java— Code transformation at load time— Not unanticipated (it’s Java...)

> Geppetto: Partial Behavioral Reflection for Smalltalk

> For Squeak 3.9 with ByteSurgeon— but portable to other dialects

> Let’s see an example!

Page 11: Unanticipated Partial Behavioral Reflection

© Marcus Denker

Solving the Problem

> Operation: — Method Execution (around)

> Hookset: — All execution operations in the wiki package

> Metaobject: — A profiling tool activation

condition

hookset

metaobject

links

Page 12: Unanticipated Partial Behavioral Reflection

© Marcus Denker

Solving the Problem: Hookset + Link

> Hookset

allExecs := Hookset new. allExecs inPackage: ’Wiki’; operation: MethodEval.

profile := Link id: #profiler hookset: allExecs metaobject: Profiler new.

profile control: Control around.

> Link

Page 13: Unanticipated Partial Behavioral Reflection

© Marcus Denker

Solving the Problem: Protocol

profile callDescriptor: (CallDescriptor

selector: #profileMethod:in:withArguments: parameters: {Parameter selector.

Parameter self. Parameter arguments.}

passingMode: PassingMode plain).

> Protocol

> Install / Retract

profile install.profile uninstall.

Page 14: Unanticipated Partial Behavioral Reflection

© Marcus Denker

Solving the Problem: Caching

> Operation: — Method Execution (around)

> Hookset: — The one slow method (#toughWorks:)

> Metaobject: — A Cache activation

condition

hookset

metaobject

links

Page 15: Unanticipated Partial Behavioral Reflection

© Marcus Denker

Caching II

toughWorks := Hookset new. toughWorks inClass: Worker; inMethod: #toughWork:;

operation: MethodEval.

> Hookset:

> Link:cache := Link id: #cache

hookset: toughWorks metaobject: Cache new.

cache control: Control around.

cache callDescriptor:(CallDescriptor selector: #cacheFor: parameters: {Parameter arg1} passingMode: PassingMode plain).

Page 16: Unanticipated Partial Behavioral Reflection

© Marcus Denker

Geppetto

> Operations: — MethodEval (like MethodWrappers)— MsgSend, InstVarAccess, TempAccess

> Control— Before, After, Around, Replace

> Activation condition per Link

Page 17: Unanticipated Partial Behavioral Reflection

© Marcus Denker

Benchmarks I

> Slowdown for reification of message send

System Slowdown

Geppetto 10.85

Iguana/J 24

Metaclasstalk 20

Page 18: Unanticipated Partial Behavioral Reflection

© Marcus Denker

Benchmarks II

Metaclasstalk(ms)

Geppetto(ms)

Speedup

message send

108 46 2.3x

instance var read

272 92 2.9x

> Geppetto Vs. Metaclasstalk

Page 19: Unanticipated Partial Behavioral Reflection

© Marcus Denker

Future Work

> Pluggable backends— Bytecode— AST based transformation— VM Support

> Use for typical ByteSurgeon based projects— e.g. Tracing, Unstuck-Debugger

> Experiment with advanced Scoping

Page 20: Unanticipated Partial Behavioral Reflection

© Marcus Denker

Conclusion

> Example for the need of Partial Behavioral Reflection> Overview of Geppetto> Solution of the Example> Benchmarks

Page 21: Unanticipated Partial Behavioral Reflection

© Marcus Denker

Conclusion

> Example for the need of Partial Behavioral Reflection> Overview of Geppetto> Solution of the Example> Benchmarks

Questions?