Aspektvävare

Aspektvävare
Tillgänglig i AspectC++ , AspectJ
Typ Aspektorienterad programmering

En aspektvävare är ett metaprogrammeringsverktyg för aspektorienterade språk utformat för att ta instruktioner som specificeras av aspekter (isolerade representationer av viktiga begrepp i ett program) och generera den slutliga implementeringskoden . Väveren integrerar aspekter i de platser som specificeras av programvaran som ett förkompileringssteg . Genom att slå samman aspekter och klasser (representationer av strukturen av enheter i programmet), genererar vävaren en vävd klass.

Aspektvävare tar instruktioner som kallas råd specificerade genom användning av pointcuts och join points , speciella kodsegment som indikerar vilka metoder som ska hanteras av aspektkod. Implementeringen av aspekten specificerar sedan om den relaterade koden ska läggas till före, efter eller genom de relaterade metoderna. Genom att göra detta förbättrar aspektvävare modulariteten och håller kod på ett ställe som annars skulle ha varit insprängt i olika, orelaterade klasser.

Motivering

Många programmeringsspråk är redan allmänt accepterade och förstådda. Men önskan att skapa radikalt olika programmeringsspråk för att stödja det aspektorienterade programmeringsparadigmet är inte betydande på grund av affärsrelaterade problem; det finns risker med att ta till sig ny teknik. Användning av ett helt nytt språk är beroende av ett företags förmåga att skaffa nya utvecklare. Dessutom skulle den befintliga kodbasen för ett företag behöva kasseras. Slutligen skulle ett företag behöva skaffa en ny verktygskedja (verktygssvit) för utveckling, vilket ofta är både en kostnad i både pengar och tid. Primära farhågor kring färdplaner för införande av ny teknik tenderar att vara behovet av att utbilda nya utvecklare och anpassa befintliga processer till den nya tekniken.

För att ta itu med dessa affärsproblem, möjliggör en aspektvävare användning av allmänt använda språk som Java med aspektorienterad programmering genom mindre anpassningar som AspectJ som fungerar med befintliga verktyg. Istället för att utveckla ett helt nytt språk, tolkar aspektvävaren tilläggen som definieras av AspectJ och bygger "vävd" Java-kod som sedan kan användas av vilken befintlig Java-kompilator som helst. Detta säkerställer att all befintlig objektorienterad kod fortfarande kommer att vara giltig aspektorienterad kod och att utveckling kommer att kännas som en naturlig förlängning av det objektorienterade språket. Programmeringsspråket AspectC++ utökar C++ genom att använda en aspektvävare, vilket erbjuder den ytterligare effektiviteten jämfört med AspectJ som är nödvändig för inbyggda system samtidigt som fördelarna med aspektorienterad programmering behålls.

Genomförande

Aspektvävare arbetar genom att ta instruktioner som specificeras av aspekter , så kallade råd , och distribuera dem automatiskt i de olika klasserna i programmet. Resultatet av vävprocessen är en uppsättning klasser med samma namn som de ursprungliga klasserna men med ytterligare kod som automatiskt injiceras i klassernas funktioner . Råden specificerar den exakta platsen och funktionaliteten för den injicerade koden.

Genom denna vävprocess tillåter aspektvävare kod som annars skulle ha duplicerats över klasser. Genom att eliminera denna dubblering främjar aspektvävare modularitet av tvärgående problem . Aspekter definierar implementeringskoden som annars skulle ha duplicerats och använder sedan pointcuts och sammanfogningspunkter för att definiera råden. Under vävning använder aspektvävaren pointcuts och sammanfogningspunkter, känd som en pointcut designator , för att identifiera positionerna i kandidatklasser där implementeringen ska injiceras. Implementeringen injiceras sedan i klasserna vid de identifierade punkterna, vilket gör att koden kan exekveras vid lämpliga tidpunkter utan att förlita sig på manuell duplicering av programmeraren .

  
        
       
          
            
    
        
          
            
    

   
       
        
    
       
        
    
 aspekt  Logger  {  pointcut  method  ()  :  exekvering  (  *  *  (..));  före  ()  :  method  ()  {  System  .  ut  .  println  (  "Entering "  +  thisJoinPoint  .  getSignature  ().  toString  ());  }  efter  ()  :  method  ()  {  System  .  ut  .  println  (  "Leaving "  +  thisJoinPoint  .  getSignature  ().  toString  ());  }  }  public  class  Foo  {  public  void  bar  ()  {  System  .  ut  .  println  (  "Executing Foo.bar()"  );  }  public  void  baz  ()  {  System  .  ut  .  println  (  "Executing Foo.baz()"  );  }  } En 
( exempelaspekt och klass definierad i AspectJ -programmeringsspråket
   
       public  class  Foo  {  public  void  bar  
        
        
        
    
       
        
        
        
    
 )  {  System  .  ut  .  println  (  "Anger Foo.bar()"  );  System  .  ut  .  println  (  "Executing Foo.bar()"  );  System  .  ut  .  println  (  "Leaving Foo.bar()"  );  }  public  void  baz  ()  {  System  .  ut  .  println  (  "Anger Foo.baz()"  );  System  .  ut  .  println  (  "Executing Foo.baz()"  );  System  .  ut  .  println  (  "Leaving Foo.baz()"  );  }  } 
Den vävda klassen som är resultatet av att utföra en aspektvävare på ovanstående exempel

Vävning i AspectJ

I programmeringsspråket AspectJ definieras pointcuts, join points och den modulariserade koden i ett aspektblock som liknar det för Java -klasser . Klasser definieras med Java-syntax. Vävningsprocessen består av att exekvera aspektråden för att endast producera en uppsättning genererade klasser som har aspektimplementeringskoden invävd i sig.

Exemplet till höger visar en potentiell implementering av en aspekt som loggar in- och utgången av alla metoder . Utan en aspektvävare skulle denna funktion nödvändiggöra dubblering av kod i klassen för varje metod. Istället definieras in- och utpasseringskoden enbart inom aspekten.

Aspektvävaren analyserar råden som specificeras av pointcut i aspekten och använder den råden för att distribuera implementeringskoden till den definierade klassen. Koden skiljer sig något i varje metod på grund av små variationer i kraven på metoden (eftersom metodidentifieraren har ändrats). Aspektvävaren bestämmer den lämpliga koden som ska genereras i varje situation enligt definitionen av implementeringsråden och injicerar den sedan i metoder som matchar den specificerade punktsnittet.

Vävning till bytekod

Istället för att generera en uppsättning vävd källkod väver vissa AspectJ-vävare istället ihop aspekterna och klasserna direkt till bytekod , och fungerar både som aspektvävare och kompilator . Det förväntas att prestanda för aspektvävare som också utför kompileringsprocessen kommer att kräva mer beräkningstid på grund av den involverade vävprocessen. Bytekodvävningsprocessen producerar dock mer effektiv körtidskod än vad som vanligtvis skulle uppnås genom kompilerad vävd källa.

Run-time vävning

Utvecklingen inom AspectJ har avslöjat potentialen att införliva just-in-time kompilering i exekvering av aspektorienterad kod för att möta prestandakrav. Vid körning kan en aspektvävare översätta aspekter på ett mer effektivt sätt än traditionella, statiska vävmetoder. Genom att använda AspectJ på en Java Virtual Machine har dynamisk vävning av aspekter under körning visat sig förbättra kodprestandan med 26 %. Medan vissa implementeringar av just-in-time virtuella maskiner implementerar denna funktion genom en ny virtuell maskin, kan vissa implementeringar designas för att använda funktioner som redan finns i nuvarande virtuella maskiner. Kravet på en ny virtuell maskin strider mot ett av de ursprungliga designmålen för AspectJ.

krävs en ändring av den virtuella maskinen som exekverar den kompilerade bytekoden . En föreslagen lösning för AspectJ använder ett skiktat tillvägagångssätt som bygger på den befintliga Java Virtual Machine för att lägga till stöd för kopplingspunktshantering och callbacks till en Dynamic Aspect-Oriented Programming Engine . En alternativ implementering använder en vävmotor som använder brytpunkter för att stoppa exekveringen vid punktsnittet, välja en lämplig metod, bädda in den i applikationen och fortsätta. Användningen av brytpunkter på detta sätt har visat sig minska prestandan på grund av ett mycket stort antal kontextväxlar .

Prestanda

Aspektvävarnas prestanda, såväl som prestandan för koden som de producerar, har varit föremål för analys. Det är att föredra att förbättringen i modularitet som tillhandahålls av aspektvävning inte påverkar körtidsprestandan. Aspektvävare kan utföra aspektspecifika optimeringar. Medan traditionella optimeringar som eliminering av oanvända specialvariabler från aspektkod kan göras vid kompilering , kan vissa optimeringar endast utföras av aspektvävaren. Till exempel innehåller AspectJ två liknande men distinkta nyckelord, thisJoinPoint , som innehåller information om just denna instans av vävd kod, och thisJoinPointStaticPart , som innehåller information som är gemensam för alla instanser av kod som är relevanta för den uppsättningen av råd. Optimeringen av att ersätta thisJoinPoint med det mer effektiva och statiska nyckelordet thisJoinPointStaticPart kan endast göras av aspektvävaren. Genom att utföra denna ersättning undviker det vävda programmet skapandet av ett kopplingspunktsobjekt vid varje exekvering. Studier har visat att onödigt skapande av kopplingspunktsobjekt i AspectJ kan leda till en prestandaoverhead på 5 % vid körning, medan prestandaförsämring endast är cirka 1 % när detta objekt inte skapas.

Kompileringstidsprestanda är i allmänhet sämre hos aspektvävare än deras traditionella kompilatormotsvarigheter på grund av det extra arbete som krävs för att lokalisera metoder som matchar de specificerade punktsnitten. En gjord studie visade att AspectJ-kompilatorn ajc är cirka 34 % långsammare än Sun Microsystems Java 1.3- kompilator och cirka 62 % långsammare än Java 1.4- kompilatorn.

Se även

Bibliografi

Vidare läsning