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
- Avgustinov, Pavel; Hajiyev, Elnar; Ongkingco, Neil; de More, Oege; Sereni, Damien; Tibble, Julian; Verbaere, Mathieu (2007). Semantics of Static Pointcuts in AspectJ . Handlingar från det 34:e årliga ACM SIGPLAN-SIGACT-symposiet om principer för programmeringsspråk . ACM . s. 11–23. CiteSeerX 10.1.1.109.1796 . doi : 10.1145/1190216.1190221 . ISBN 978-1-59593-575-5 .
- Colyer, Adrian; Clement, Andy; Bodkin, Ron; Hugunin, Jim (2003). Använda AspectJ för komponentintegration i Middleware (PDF) . Följeslagare till den 18:e årliga ACM SIGPLAN-konferensen om objektorienterad programmering, system, språk och applikationer . s. 339–344. doi : 10.1145/949344.949440 . ISBN 978-1-58113-751-4 . Hämtad 23 januari 2009 . [ permanent död länk ]
- Gal, Andreas; Schröder-Preikschat, Wolfgang; Spinczyk, Olaf (2001). "Om minimala overheadoperativsystem och aspektorienterad programmering" ( PDF) . Proceedings of the 4th Workshop on Object-Orientation and Operating Systems at the 15th European Conference on Object-Oriented Programming (ECOOP-OOOSW) . Hämtad 27 januari 2010 .
- Hilsdale, Erik; Hugunin, Jim (2004). Råd vävning i AspectJ (PDF) . Proceedings of the 3rd International Conference on Aspect-oriented Software Development . ACM . s. 24–35. doi : 10.1145/976270.976276 . ISBN 978-1-58113-842-9 . Arkiverad från originalet (PDF) den 27 juli 2011 . Hämtad 23 januari 2009 .
- Kiczales, Gregor; Hilsdale, Erik; Hugunin, Jim; Kersten, Mik; Palm, Jeffrey; Griswold, William (oktober 2001). "Komma igång med AspectJ". Kommunikation från ACM . 44 (10): 59–65. CiteSeerX 10.1.1.147.2820 . doi : 10.1145/383845.383858 .
- Kiczales, Gregor; Hilsdale, Erik; Hugunin, Jim; Kersten, Mik; Palm, Jeffery; Griswold, William G. (juni 2001). En översikt av AspectJ (PDF) . Handlingar från den europeiska konferensen om objektorienterad programmering . Föreläsningsanteckningar i datavetenskap. Vol. 2072. s. 327–354. doi : 10.1007/3-540-45337-7_18 . ISBN 978-3-540-42206-8 . Arkiverad från originalet (PDF) 2004-07-30 . Hämtad 4 januari 2010 .
- McEachen, Nathan; Alexander, Roger (2005). Distribuera klasser med vävda bekymmer – En undersökning av potentiella felscenarier . Proceedings of the 4th International Conference on Aspect-Oriented Software Development . ACM . s. 192–200. doi : 10.1145/1052898.1052915 . ISBN 978-1-59593-043-9 .
- Popovici, Andrei; Alonso, Gustavo; Gross, Thomas (2003). Just-in-Time-aspekter: Effektiv dynamisk vävning för Java . Proceedings of the 2nd International Conference on Aspect-Oriented Software Development . ACM . s. 100 109. doi : 10.1145/643603.643614 . ISBN 978-1-58113-660-9 .
- Sato, Yoshiki; Chiba, Shigeru; Tatsubori, Michiaki (september 2003). "En selektiv, just-in-time Aspect Weaver" (PDF) . Proceedings of the 2nd International Conference on Generative Programming and Component Engineering . Föreläsningsanteckningar i datavetenskap. 2830 : 189–208. doi : 10.1007/978-3-540-39815-8_12 . ISBN 978-3-540-20102-1 . Arkiverad från originalet (PDF) 2010-09-24 . Hämtad 4 januari 2010 .
- Spinczyk, Olaf; Gal, Andreas; Schröder-Preikschat, Wolfgang (2002). "AspectC++: An Aspect-Oriented Extension to the C++ Programming Language" (PDF) . Proceedings of the Fortionth International Conference on Tools Pacific . 21 : 53–60. Arkiverad från originalet (PDF) den 13 oktober 2009 . Hämtad 4 januari 2010 .
- Spinczyk, Olaf; Lohmann, Daniel (oktober 2007). "Designen och implementeringen av AspectC++" (PDF) . Kunskapsbaserade system . 20 (7): 636–651. CiteSeerX 10.1.1.149.7119 . doi : 10.1016/j.knosys.2007.05.004 . Hämtad 23 januari 2010 .
- Viega, John; Voas, Jeffrey (november 2000). "Kan aspektorienterad programmering leda till mer pålitlig programvara?". IEEE programvara . 17 (6): 19–21. doi : 10.1109/52.895163 .
- Wand, Michael; Kiczales, Gregor; Dutchyn, Christopher (2004). "En semantik för råd och dynamiska kopplingspunkter i aspektorienterad programmering" ( PDF) . ACM-transaktioner på programmeringsspråk och system . 26 (5): 890–910. CiteSeerX 10.1.1.57.6581 . doi : 10.1145/1018203.1018208 . Arkiverad från originalet (PDF) den 25 augusti 2011 . Hämtad 23 januari 2009 .
- Wang, Yi; Zhao, Jianjun (juli 2007). Specificera Pointcuts i AspectJ (PDF) . Handlingar från den 21:a årliga internationella konferensen om programvara och applikationer . Vol. 2. s. 5–10. CiteSeerX 10.1.1.547.6577 . doi : 10.1109/COMPSAC.2007.196 . ISBN 978-0-7695-2870-0 . Hämtad 23 januari 2010 .
Vidare läsning
- Suzuki, Junichi; Yamamoto, Yoshikazu (juni 1999). Moreira, AM; Demeyer, Moreira (red.). "Utvidga UML med aspekter: Aspect Support in the Design Phase" (PDF) . Handlingar från workshopen om objektorienterad teknik . 1743 : 299–300. Arkiverad från originalet (PDF) den 22 juli 2011 . Hämtad 4 januari 2010 .