Aspect weaver - Aspect weaver
![]() | |
K dispozici v | AspectC ++, AspectJ |
---|---|
Typ | Aspektově orientované programování |
An aspekt tkadlec je metaprogramování nástroj pro aspektově orientované jazyky navržen tak, aby přijímal pokyny uvedené v aspekty (izolované reprezentace významných konceptů v programu) a vygenerovat finální implementaci kód. Tkadlec integruje aspekty do umístění specifikovaných softwarem jako předběžnousestavení krok. Sloučením aspektů a třídy (reprezentace struktury entit v programu), tkadlec generuje tkané třídy.
Aspect weavers take pokyny známé jako Rada specifikováno použitím bodové řezy a spojit body, speciální segmenty kódu, které označují co metody by měl být zpracován kódem aspektu. Implementace aspektu pak určuje, zda souvisí kód by měly být přidány před, po nebo do souvisejících metod. Tímto způsobem se tkalci zlepšují modularita, udržování kódu na jednom místě, které by jinak bylo rozptýleno v různých, nesouvisejících třídách.
Motivace
Mnoho programovací jazyky jsou již široce přijímány a chápány. Touha vytvořit radikálně odlišné programovací jazyky na podporu aspektově orientované programování paradigma není významné kvůli obavám z podnikání; s přijetím nových technologií jsou spojena rizika.[1] Použití zcela nového jazyka závisí na schopnosti firmy získávat nové vývojáře. Stávající kódová základna firmy by navíc musela být vyřazena. Nakonec by podnik musel získat nový řetězec nástrojů (sada nástrojů) pro vývoj, což je často nákladem i časem.[2] Primární obavy z cestovní mapy pro přijetí nových technologií bývá potřeba vyškolit nové vývojáře a přizpůsobit stávající procesy nové technologii.[3]
K řešení těchto obchodních obav umožňuje nástroj Weaver používat široce přijímané jazyky, jako je Jáva s aspektově orientovaným programováním prostřednictvím drobných úprav, jako je AspectJ které pracují se stávajícími nástroji.[4] Místo vývoje zcela nového jazyka interpretuje aspekt tkadlec rozšíření definovaná AspectJ a vytváří "tkaný" kód Java, který pak může použít jakýkoli existující kompilátor Java. Tím je zajištěno, že všechny existující objektově orientovaný kód bude stále platným aspektově orientovaným kódem a tento vývoj bude působit jako přirozené rozšíření objektově orientovaného jazyka.[5] The AspectC ++ programovací jazyk se rozšiřuje C ++ prostřednictvím použití aspektu tkadlec, který nabízí další účinnost přes AspectJ to je nezbytné pro vestavěné systémy při zachování výhod aspektově orientovaného programování.[6]
Implementace
Tkalcovské stroje pracují podle pokynů uvedených v aspekty, známý jako Radaa distribuovat jej do různých třídy v programu automaticky. Výsledkem procesu tkaní je sada tříd se stejnými názvy jako původní třídy, ale s přídavným kódem vloženým do tříd ' funkce automaticky. Rada specifikuje přesné umístění a funkčnost vloženého kódu.[7]
Prostřednictvím tohoto procesu tkaní umožňují tkalci aspektů kód, který by byl jinak duplikován napříč třídami. Odstraněním této duplikace se propagují tkalci modularita z průřezové obavy.[8] Aspekty definují implementační kód, který by byl jinak duplikován a poté použit bodové řezy a spojit body definovat radu. Během tkaní používá tkáč aspektů výřezy a spojovací body, známé jako a pointcut označení, k identifikaci pozic v kandidátských třídách, na které by měla být implementace zavedena.[9] Implementace je poté vložena do tříd v identifikovaných bodech, což umožňuje spuštění kódu ve vhodnou dobu bez spoléhání se na ruční duplikaci programátor.[10]
aspekt Logger { pointcut metoda() : provedení(* *(..)); před() : metoda() { Systém.ven.tisk(„Zadávání“ + thisJoinPoint.získat podpis().toString()); } po() : metoda() { Systém.ven.tisk("Odchod" + thisJoinPoint.získat podpis().toString()); }}veřejnost třída Foo { veřejnost prázdnota bar() { Systém.ven.tisk(„Executing Foo.bar ()“); } veřejnost prázdnota baz() { Systém.ven.tisk(„Executing Foo.baz ()“); }} |
Vzorek aspekt a třída definované v AspectJ programovací jazyk |
veřejnost třída Foo { veřejnost prázdnota bar() { Systém.ven.tisk("Zadávání Foo.bar ()"); Systém.ven.tisk(„Executing Foo.bar ()“); Systém.ven.tisk(„Leaving Foo.bar ()“); } veřejnost prázdnota baz() { Systém.ven.tisk(„Zadávání Foo.baz ()“); Systém.ven.tisk(„Executing Foo.baz ()“); Systém.ven.tisk(„Leaving Foo.baz ()“); }} |
Tkaná třída, která je výsledkem provedení tkáče aspektů na výše uvedeném vzorku |
Tkaní v poměru stran J.
V programovací jazyk AspectJ, pointcuts, join points, and the modularized code are defined in an aspect block similar to that of Jáva třídy. Třídy jsou definovány pomocí syntaxe Java. Proces tkaní spočívá v provedení rady aspektů, aby se vytvořila pouze sada vygenerovaných tříd, do kterých je vložen kód implementace aspektu.[11]
Příklad vpravo ukazuje potenciální implementaci aspektu, který zaznamenává vstup a výstup všech metody. Bez tkáče aspektů by si tato funkce vyžadovala duplikace kódu ve třídě pro každou metodu. Místo toho je vstupní a výstupní kód definován pouze v rámci aspektu.[12]
Weaver aspektů analyzuje rady určené bodovým bodem v aspektu a pomocí této rady distribuuje implementační kód do definované třídy. Kód se u každé metody mírně liší kvůli mírným odchylkám v požadavcích na metodu (jako metodu identifikátor změnila). Tkalcovka aspektů určuje vhodný kód, který se má generovat v každé situaci, jak je definována v doporučení pro implementaci, a poté jej vloží do metod odpovídajících zadanému bodovému řezu.[13]
Tkaní na bytecode
Místo vytváření sady tkaných zdrojový kód, někteří tkalci AspectJ místo toho splétají aspekty a třídy společně přímo do bytecode, působící jak jako tkáč aspektů, tak i překladač.[14][15] Očekává se, že výkon tkalců, kteří také provádějí proces kompilace, bude vyžadovat více výpočetního času kvůli použitému procesu tkaní. Proces tkaní bytecode však produkuje efektivnější běhový kód, než jaký by se obvykle dosáhl pomocí kompilovaného tkaného zdroje.
Tkaní za běhu
Vývoj v AspectJ odhalil potenciál začlenit just-in-time kompilace do provádění aspektově orientovaného kódu pro řešení požadavků na výkon.[16] Na run-time, tkáč aspektů by mohl přeložit aspekty efektivnějším způsobem než tradiční přístupy statického tkaní. Používání AspectJ na a Virtuální stroj Java, bylo prokázáno, že dynamické tkaní aspektů za běhu zlepšuje výkon kódu o 26%.[17] Zatímco některé implementace virtuálních strojů just-in-time implementují tuto schopnost prostřednictvím nového virtuálního stroje, některé implementace mohou být navrženy tak, aby používaly funkce, které již v aktuálních virtuálních strojích existují.[18][19] Požadavek na nový virtuální stroj je v rozporu s jedním z původních cílů designu AspectJ.[5]
Chcete-li dosáhnout tkaní just-in-time, změna na virtuální stroj který provede zkompilovaný bytecode je nutné. Navrhované řešení pro AspectJ používá a vrstvené přístup, který staví na stávajícím Java Virtual Machine a přidává podporu pro správu spojovacích bodů a zpětná volání do a Dynamický programovací stroj orientovaný na poměr.[19] Alternativní implementace používá tkací stroj, který používá hraniční body Chcete-li zastavit provádění v bodě, vyberte příslušnou metodu, vložte ji do aplikace a pokračujte.[20] Ukázalo se, že použití zarážek tímto způsobem snižuje výkon kvůli velkému počtu kontextové přepínače.[17]
Výkon
Výkon aspektů tkalců, stejně jako výkon kódu, který produkují, byl předmětem analýzy. Je upřednostňováno, aby zlepšení modularity poskytované tkáním aspektů nemělo vliv na výkon za běhu. Tkalci Aspect jsou schopni provádět optimalizace specifické pro daný aspekt.[21] Zatímco tradiční optimalizace, jako je odstranění nepoužívaného speciálu proměnné z kódu aspektu lze provést na čas kompilace, některé optimalizace může provést pouze tkáč stránek. Například AspectJ obsahuje dvě podobná, ale odlišná klíčová slova, thisJoinPoint
, který obsahuje informace o této konkrétní instanci tkaného kódu, a thisJoinPointStaticPart
, který obsahuje informace společné pro všechny instance kódu související s touto sadou rad. Optimalizace nahrazování thisJoinPoint
s účinnější a statický klíčové slovo thisJoinPointStaticPart
lze provést pouze pomocí tkače aspektů. Provedením této náhrady se tkaný program vyhne vytvoření bodu spojení objekt při každé popravě.[14] Studie ukázaly, že zbytečné vytváření objektů spojovacích bodů v AspectJ může vést k režii výkonu 5% za běhu, zatímco snížení výkonu je pouze přibližně 1%, pokud tento objekt není vytvořen.[22]
Výkon v době kompilace je obecně horší u tkalců aspektů než jejich tradiční protějšky kompilátoru kvůli další práci potřebné pro vyhledání metod, které odpovídají zadaným výřezům. Studie provedená ukázala, že kompilátor AspectJ ajc je asi o 34% pomalejší než Sun Microsystems Java 1.3 a asi o 62% pomalejší než Java 1.4 překladač.[23]
Viz také
Reference
- ^ Kiczales (říjen 2001), s. 2
- ^ Kiczales (říjen 2001), s. 7
- ^ Colyer (2003), s. 6
- ^ Kiczales (říjen 2001), s. 5
- ^ A b Kiczales (červen 2001), s. 3
- ^ Spinczyk (2002), s. 1
- ^ Hůlka (2004), s. 1
- ^ Hůlka (2004), s. 7
- ^ Viega (listopad 2000), s. 2
- ^ Spinczyk (říjen 2007), s. 21
- ^ Wang (červenec 2007), s. 4
- ^ Avgustinov (2007), s. 2
- ^ Hilsdale (2004), s. 5–6
- ^ A b Hilsdale (2004), s. 2
- ^ McEachen (2005), s. 1
- ^ Popovici (2003), s. 1
- ^ A b Sato (září 2003), s. 17
- ^ Sato (září 2003), s. 2
- ^ A b Papovici (2003), s. 3
- ^ Sato (září 2003), s. 11
- ^ Gal (2001), s. 3
- ^ Colyer (2003), s. 2
- ^ Hilsdale (2004), s. 7
Bibliografie
- Avgustinov, Pavel; Hajiyev, Elnar; Ongkingco, Neil; de More, Oege; Sereni, Damien; Tibble, Julian; Verbaere, Mathieu (2007). Sémantika statických bodových řezů v AspectJ. Sborník z 34. výročního sympozia ACM SIGPLAN-SIGACT o zásadách programovacích jazyků. 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). Použití AspectJ pro integraci komponent v Middleware (PDF). Společník 18. výroční konference ACM SIGPLAN o objektově orientovaném programování, systémech, jazycích a aplikacích. 339–344. doi:10.1145/949344.949440. ISBN 978-1-58113-751-4. Citováno 23. ledna 2009.[trvalý mrtvý odkaz ]
- Gal, Andreas; Schröder-Preikschat, Wolfgang; Spinczyk, Olaf (2001). „O minimálních režijních operačních systémech a perspektivně orientovaném programování“ (PDF). Sborník ze 4. workshopu o objektové orientaci a operačních systémech z 15. evropské konference o objektově orientovaném programování (ECOOP-OOOSW). Citováno 27. ledna 2010.
- Hilsdale, Erik; Hugunin, Jim (2004). Poradenské tkaní v AspectJ (PDF). Sborník příspěvků z 3. mezinárodní konference o vývoji softwaru zaměřeného na jednotlivé aspekty. ACM. str. 24–35. doi:10.1145/976270.976276. ISBN 978-1-58113-842-9. Archivovány od originál (PDF) dne 27. července 2011. Citováno 23. ledna 2009.
- Kiczales, Gregor; Hilsdale, Erik; Hugunin, Jim; Kersten, Mik; Palm, Jeffrey; Griswold, William (říjen 2001). "Začínáme s AspectJ". Komunikace 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. (Červen 2001). Přehled AspectJ (PDF). Sborník příspěvků z Evropské konference o objektově orientovaném programování. Přednášky z informatiky. 2072. 327–354. doi:10.1007/3-540-45337-7_18. ISBN 978-3-540-42206-8. Archivovány od originál (PDF) dne 30. 7. 2004. Citováno 4. ledna 2010.
- McEachen, Nathan; Alexander, Roger (2005). Distribuce tříd se znepokojením - zkoumání scénářů možných poruch. Proceedings of the 4th International Conference on Aspect-Oriented Software Development. ACM. str. 192–200. doi:10.1145/1052898.1052915. ISBN 978-1-59593-043-9.
- Popovici, Andrei; Alonso, Gustavo; Gross, Thomas (2003). Aspekty just-in-time: Efektivní dynamické tkaní pro Javu. Sborník z 2. mezinárodní konference o vývoji softwaru zaměřeného na určitý aspekt. ACM. 100, 109. doi:10.1145/643603.643614. ISBN 978-1-58113-660-9.
- Sato, Yoshiki; Chiba, Shigeru; Tatsubori, Michiaki (září 2003). „Selektivní tkadlec v reálném čase“ (PDF). Sborník z 2. mezinárodní konference o generativním programování a konstrukci komponent: 189–208. Archivovány od originál (PDF) dne 24. 9. 2010. Citováno 4. ledna 2010.
- Spinczyk, Olaf; Gal, Andreas; Schröder-Preikschat, Wolfgang (2002). „AspectC ++: Aspect-Oriented Extension to the C ++ Programming Language“ (PDF). Sborník ze čtyřicáté mezinárodní konference o nástrojích Pacifiku. 21: 53–60. Archivovány od originál (PDF) dne 13. října 2009. Citováno 4. ledna 2010.
- Spinczyk, Olaf; Lohmann, Daniel (říjen 2007). „Návrh a implementace AspectC ++“ (PDF). Znalostní systémy. 20 (7): 636–651. CiteSeerX 10.1.1.149.7119. doi:10.1016 / j.knosys.2007.05.004. Citováno 23. ledna 2010.
- Viega, John; Voas, Jeffrey (listopad 2000). „Může programování zaměřené na určitý aspekt vést k spolehlivějšímu softwaru?“. Software IEEE. 17 (6): 19–21. doi:10.1109/52.895163.
- Hůlka, Michael; Kiczales, Gregor; Dutchyn, Christopher (2004). „Sémantika pro radu a dynamické spojovací body v aspektově orientovaném programování“ (PDF). Transakce ACM v programovacích jazycích a systémech. 26 (5): 890–910. CiteSeerX 10.1.1.57.6581. doi:10.1145/1018203.1018208. Archivovány od originál (PDF) dne 25. srpna 2011. Citováno 23. ledna 2009.
- Wang, Yi; Zhao, Jianjun (červenec 2007). Určení výřezů v AspectJ (PDF). Sborník z 21. výroční mezinárodní konference o počítačovém softwaru a aplikacích. 2. s. 5–10. CiteSeerX 10.1.1.547.6577. doi:10.1109 / COMPSAC.2007.196. ISBN 978-0-7695-2870-0. Citováno 23. ledna 2010.
Další čtení
- Suzuki, Junichi; Yamamoto, Yoshikazu (červen 1999). Moreira, A. M .; Demeyer, Moreira (eds.). „Rozšíření UML o aspekty: Podpora aspektů ve fázi návrhu“ (PDF). Sborník workshopů o objektově orientovaných technologiích. 1743: 299–300. Archivovány od originál (PDF) dne 22. července 2011. Citováno 4. ledna 2010.