Upload
marcus-denker
View
608
Download
1
Tags:
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
© Marcus Denker
Unanticipated PartialBehavioral Reflection
David RöthlisbergerMarcus DenkerEric Tanter
© Marcus Denker
Roadmap
> Example> Behavioral Reflection
— Smalltalk / Metaclasstalk— Unanticipated Reflection— Partial Reflection
> Unanticipated Partial Behavioral Reflection> Example revisited> Benchmarks> Conclusion
© 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
© Marcus Denker
Towards a Solution
> Analyse the problem— Install profiler— Analyze— Retract profiler
> Solve the problem— Introduce a caching mechanism— Experiment with multiple solutions
© Marcus Denker
Reflection
> Reflection: computation about computation— base level / meta level— causally connected
> Structural Reflection — Reification of structure
> Behavioral Reflection— Reification of execution
© 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!
© 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!
© 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
© 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
© 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!
© 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
© 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
© 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.
© Marcus Denker
Solving the Problem: Caching
> Operation: — Method Execution (around)
> Hookset: — The one slow method (#toughWorks:)
> Metaobject: — A Cache activation
condition
hookset
metaobject
links
© 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).
© Marcus Denker
Geppetto
> Operations: — MethodEval (like MethodWrappers)— MsgSend, InstVarAccess, TempAccess
> Control— Before, After, Around, Replace
> Activation condition per Link
© Marcus Denker
Benchmarks I
> Slowdown for reification of message send
System Slowdown
Geppetto 10.85
Iguana/J 24
Metaclasstalk 20
© 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
© 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
© Marcus Denker
Conclusion
> Example for the need of Partial Behavioral Reflection> Overview of Geppetto> Solution of the Example> Benchmarks
© Marcus Denker
Conclusion
> Example for the need of Partial Behavioral Reflection> Overview of Geppetto> Solution of the Example> Benchmarks
Questions?