Wicca v2 demo
description
Transcript of Wicca v2 demo
Wicca Demo
Wicca v2 demoDynamic weaving using the.NET 2.0 Debugging APIs
Marc EaddyColumbia University
1Wicca: A research platformAdvanced separation of concerns (ASOC)First dynamic weaver based on .NET 2.0 Debugging APIsNew breakpoint weaving techniqueNew metrics for measuring crosscuttingNovel language mechanismsStatement annotationsSide classesDynamic software updating
2AOSD 2007Experimenting with techniques for modularizing crosscutting concerns Marc Eaddy Columbia University2Wicca: A research platformAdvanced separation of concerns (ASOC)First dynamic weaver based on .NET 2.0 Debugging APIsNew breakpoint weaving techniqueNew metrics for measuring crosscuttingNovel language mechanismsStatement annotationsSide classesDynamic software updating
3AOSD 2007Experimenting with techniques for modularizing crosscutting concerns Marc Eaddy Columbia University3Wicca supports multiple weaving strategiesInvasiveNoninvasiveByte codeBreakpointStaticCompile timeNADynamicLoad timeRuntime4AOSD 2007 Marc Eaddy Columbia University4Wicca transformation pipeline5AOSD 2007CompilerPost-LinkWeaverDeltasAspectAssembliesCompiledProgramSourceFilesWovenProgramBreakPointsFrontendBackend Marc Eaddy Columbia University5Phx.MorphWiccas backend.NET byte code and breakpoint weaverBuilt using Microsoft PhoenixSupports .NET 1.0, 1.1, and 2.0Demoed at AOSD 2006New: Dynamic weaving, breakpoint weaving, statement annotation support
6AOSD 2007 Marc Eaddy Columbia University6Demo setup: Simple DrawSimpleDraw draws Shapes on a DisplayNave implementation couples Shape and Display concernspublic init() { s = new Shape[3]; s[0] = new Point(10, 10); s[1] = new Point(5, 5); s[2] = new Line(new Point(1, 9), new Point(9, 1)); for (int i = 0; i < s.Length; i++) Display.instance().addShape(s[i]); Display.instance().update();SimpleDraw.cspublic void moveBy(int dx, int dy) { x += dx; y += dy; Display.instance().update();public void moveBy(int dx, int dy) { a.moveBy(dx, dy); b.moveBy(dx, dy); Display.instance().update();Point.csLine.cs7AOSD 2007 Marc Eaddy Columbia University7Demo setup: Simple DrawSimpleDraw draws Shapes on a DisplayNave implementation couples Shape and Display concernspublic init() { s = new Shape[3]; s[0] = new Point(10, 10); s[1] = new Point(5, 5); s[2] = new Line(new Point(1, 9), new Point(9, 1)); for (int i = 0; i < s.Length; i++) Display.instance().addShape(s[i]); Display.instance().update();SimpleDraw.cspublic void moveBy(int dx, int dy) { x += dx; y += dy; Display.instance().update();public void moveBy(int dx, int dy) { a.moveBy(dx, dy); b.moveBy(dx, dy); Display.instance().update();Point.csLine.csCrosscutting8AOSD 2007 Marc Eaddy Columbia University8Demo 1: Static byte code weavingAOSD 20079C#CompilerPhx.MorphDeltasAspectAssembliesCompiledProgramC#FilesWovenProgramBreakPoints Marc Eaddy Columbia University9Dynamic weaving.NET 2.0 Debugging APIsEdit-and-Continue APIReplaces the .NET 1.1 Profiler APIDynamic AOPEdit-and-ContinuePatchingBreakpoint API Noninvasive advisingFuncEval API In-process advice executionIntended for debugging, not dynamic AOPMicrosoft Managed DebuggerHosts Wicca plug-inHosts client program in separate processCommand-line shell for weaving commands10AOSD 2007
Marc Eaddy Columbia University10Demo 2: Dynamic byte code weavingUsing .NET 2.0 Edit-and-Continue API
11AOSD 2007C#CompilerPhx.MorphAspectAssembliesCompiledProgramC#FilesDeltasWovenProgramBreakPoints Marc Eaddy Columbia University11Demo 3: Dynamic bp weavingNoninvasive advising via Breakpoint APIIn-process advice execution via FuncEval API12AOSD 2007Phx.MorphAspectAssembliesCompiledProgramC#FilesBreakPointsWovenProgramDeltasC#Compiler Marc Eaddy Columbia University12Wiccas frontendWicca# compilerExtends C# to supportStatement annotationsSide classesGoalActually modularize crosscutting concerns (without sacrificing other modularity properties)Wicca# language
13AOSD 2007 Marc Eaddy Columbia University13Statement annotationsFine-grained advisingStatement-level advising (more elegant than dummy methods)Declarative instance-level advisingOther possibilitiesOptimization and parallelization hintsContractsAvoiding reweavingFault isolationOblivious debuggingStatement Annotations for Fine-Grained Advising, RAM-SE 2006
Allows any program statement to be annotated//[Concern("Input")]inputMapper.Update(elapsedTime);14AOSD 2007 Marc Eaddy Columbia University14Quantifying crosscuttingIdentifying, Assigning, and Quantifying Crosscutting Concerns, ACOM 2007Display updating in SimpleDrawDegree of scattering: Scattering visualization (ala SeeSoft):0.9215AOSD 2007
Marc Eaddy Columbia University15Demo 4: Concern profilingStatement annotation-based advising16AOSD 2007Wicca#CompilerCompiledProgramWicca#SourceFilesPhx.MorphAspectAssembliesWovenProgramDeltasBreakPoints Marc Eaddy Columbia University16Side classesPowerful and disciplined class extension17AOSD 2007 Marc Eaddy Columbia University17Expression problem revisitedNeed to parse simple expression languagee.g., 3 + 4Expressions: Literal, AddOperations: evalExtensibility goalsEasily add new expressionsEasily add new operationsCannot do both easily18AOSD 2007P. Tarr, H. Ossher, W. Harrison, and S. Sutton Jr., "N Degrees of Separation: Multi-Dimensional Separation of Concerns," ICSE 1999M. Torgersen, "The Expression Problem Revisited," ECOOP 2004Easy in OOEasy in FP Marc Eaddy Columbia University18abstract class Expression {abstract int eval();}
class Add : Expression {public Expression left, right;public Add(Expression left, Expression right) { this.left = left; this.right = right; }public int eval() { return left.eval() + right.eval(); }}
Parser implementation in OO19AOSD 2007Concern: Add printingOperations are crosscutting! Marc Eaddy Columbia University19abstract class PrintingExpr : Expression {abstract void print();}
class PrintingAdd : Add {public void print() { Console.WriteLine(left + + + right); }}
Add printing using subclassing20AOSD 2007InvasiveInflexible Marc Eaddy Columbia University20abstract class PrintingExpr + Expression {abstract void print();}
class PrintingAdd + Add {public void print() { Console.WriteLine(left + + + right); }}
Printing the side class way21AOSD 2007Modularizes the printing concernSide class implicitly extends base classClients (or other sub/side classess) obliviousSide class compositionoperator
Marc Eaddy Columbia University21CachingConcern: Cache expression evaluationInvalidate cache when expression changesAOSD 200722 Marc Eaddy Columbia Universityinterface IObserver {void onChange();}
class CachableExpr + Expression : IObserver {protected IObserver observer = null;protected int cache;protected bool isCacheValid = false;
void onChanged() { isCacheValid = false; if (observer != null) observer.onChanged();}}Side class: Caching eval23AOSD 2007 Marc Eaddy Columbia University23interface IObserver {void onChange();}
class CachableExpr + Expression : IObserver {protected IObserver observer = null;protected int cache;protected bool isCacheValid = false;
void onChanged() { isCacheValid = false; if (observer != null) observer.onChanged();}}Side class: Caching eval24AOSD 2007Memberintertype declarationsInterfaceintertype declaration Marc Eaddy Columbia University24class CachableAdd + Add {
public Add(Expression left, Expression right) { base(left, right);this.left.observer = this;this.right.observer = this; }
override public int eval() {if (!isCacheValid) {cache = base.eval();isCacheValid = true;}return cache; }Side class: Caching eval (2)25AOSD 2007 Marc Eaddy Columbia University25class CachableAdd + Add {
public Add(Expression left, Expression right) { base(left, right);this.left.observer = this;this.right.observer = this; }
override public int eval() {if (!isCacheValid) {cache = base.eval();isCacheValid = true;}return cache; }Side class: Caching eval (2)26AOSD 2007Call next delegate(i.e., proceed) Marc Eaddy Columbia University26Side class: Caching eval (3)override Expression left {set { base.left = value; this.left.observer = this; this.onChange();}}
override Expression right {set { base.right = value; this.right.observer = this; this.onChange();}}}27AOSD 2007 Marc Eaddy Columbia University27Side class: Caching eval (3)override Expression left {set { base.left = value; this.left.observer = this; this.onChange();}}
override Expression right {set { base.right = value; this.right.observer = this; this.onChange();}}}28AOSD 2007Override virtual field Marc Eaddy Columbia University28Side class: Caching eval (4)override Expression [$which = left | right] {set { base.$which = value; this.$which.observer = this; this.onChange();}}29AOSD 2007MetavariableLimited quantification Marc Eaddy Columbia University29class Add : Expression {public virtual Expression left, right;public Add(Expression left, Expression right) { this.left = left; this.right = right; }public virtual int eval() {return left.eval() + right.eval();}}Base class must allow extension30AOSD 2007 Marc Eaddy Columbia University30Addresses needs of existing mechanismsSubclassesInflexible compositionOnly extend one base classOnly extend instance methodsRequires invasive changes in clientsOpen classes/refinements/mixinsNeed for composition orderingNeed for constructor and static member overridingAspectsLack of modular reasoningPoor integration with existing OO semantics and notationNeed for symmetric modelMatching wrong join pointsAOSD 200731 Marc Eaddy Columbia UniversityConclusions32AOSD 2007
Wicca#sideClasses@Statement Marc Eaddy Columbia University32AcknowledgementsMicrosoft Phoenix TeamWicca developersBoriana DitchevaRajesh RamakrishnanAdam Vartanian33AOSD 2007 Marc Eaddy Columbia University33Thank you!34AOSD 2007 Marc Eaddy Columbia University34Phx.Morph architecturePhx.MorphEditorsOpen Classes, binary and breakpoint weavingPhoenix-specific AOPAttribute HandlersPhoenixPEREWAssemblyRe-WriterPhx.AopAOPJoinpoints, pointcuts, AttributesCustom AOP annotations.NETMorphPlugin
35AOSD 2007 Marc Eaddy Columbia University35
Wicca architecture36AOSD 2007Copyright Marc Eaddy36
Phx.MorphWicca #CompilerWicca#CompilerWicca architecture37AOSD 2007Copyright Marc Eaddy37public OnDraw() {//[Note("Creating a line")]line = new Line();38AOSD 2007Legalizing statement annotations Marc Eaddy Columbia University38public OnDraw() {//[Note("Creating a line")]line = new Line();[Statement(9, "Note", "Creating a line")]public OnDraw() {line = new Line();Legalizing statement annotationsLegalize39AOSD 2007 Marc Eaddy Columbia University39Data
VM
Compiler
Front-end
VM
BuildInfo
C#
C#
App
Preprocessor
Source Weaver
Binary Weaver
a
b
Breakpoint Weaver
ICorDbgCallback
DebuggerHost
ICorDbg
Projects
Assemblies
Assemblies
Wicca
Hosted App
Assemblies
Assemblies
App
Weaving
IL + MD Deltas
Joinpoint Breakpoints
Data
VM
Compiler
Front-end
VM
BuildInfo
C#
C#
App
Preprocessor
Source Weaver
Binary Weaver
a
b
Breakpoint Weaver
ICorDbgCallback
DebuggerHost
ICorDbg
Projects
Assemblies
Assemblies
Wicca
Hosted App
Assemblies
Assemblies
App
Weaving
IL + MD Deltas
Joinpoint Breakpoints