This is a good article. Click here for more information.

측면 위버

Aspect weaver
측면 위버
Two classes and a single aspect are presented. The aspect weaver analyzes each class and combines the aspect into the implementation code. The result is two implementation classes with the aspect code present in appropriate, but distinct, places in each class.
측면 보호기는 원시 클래스측면의 정보를 가져와서 클래스에 적절히 저장한 측면 코드를 사용하여 새로운 클래스를 만든다.
다음에서 사용 가능SensionC++, SensionJ
유형측면 지향 프로그래밍

측면 위버측면(프로그램에서 중요한 개념의 분리된 표현)에 의해 명시된 지시를 취하고 최종 구현 코드를 생성하도록 설계된 측면 지향 언어에 대한 메타프로그래밍 유틸리티다.위버는 컴파일 전 단계로 소프트웨어에서 지정한 위치에 측면을 통합한다.측면과 클래스(프로그램의 실체 구조를 나타냄)를 병합하여 위버는 짜임새를 생성한다.

측면 보호자는 측면 코드에서 처리해야 할 방법을 나타내는 코드의 특수 부분인 포인트 컷과 결합 지점을 사용하여 지정된 조언으로 알려진 지침을 취한다.그런 다음 측면의 구현은 관련 코드를 관련 방법의 이전, 이후 또는 전체에서 추가해야 하는지 여부를 명시한다.이렇게 함으로써, 측면 비버는 모듈성을 향상시켜, 그렇지 않았다면 다양한 관련 없는 계층에 걸쳐서 배치되었을 코드를 한 곳에 보관한다.

동기

많은 프로그래밍 언어들이 이미 널리 받아들여지고 이해되고 있다.그러나, 측면 지향 프로그래밍 패러다임을 지원하기 위해 근본적으로 다른 프로그래밍 언어를 만들고자 하는 욕구는 비즈니스와 관련된 우려 때문에 중요하지 않다; 새로운 기술 채택과 관련된 위험이 있다.[1]완전히 새로운 언어를 사용하는 것은 새로운 개발자를 획득하는 기업의 능력에 달려 있다.또한, 기업의 기존 코드 베이스는 폐기되어야 할 것이다.마지막으로, 기업은 개발을 위한 새로운 툴체인(툴의 중요성)을 취득해야 할 것이며, 이는 종종 돈과 시간 모두에 드는 비용이다.[2]신기술 채택 로드맵에 대한 주요 관심사는 새로운 개발자를 양성하고 기존 프로세스를 신기술에 적응시킬 필요성이다.[3]

이러한 비즈니스 문제를 해결하기 위해, 측면 위버는 기존 툴과 함께 작동하는 측면 J와 같은 부적응을 통해 측면 지향 프로그래밍과 함께 자바와 같이 널리 채택된 언어를 사용할 수 있다.[4]완전히 새로운 언어를 개발하는 대신에, Weaver의 측면은 SensionJ에 의해 정의된 확장을 해석하고 기존의 Java 컴파일러에 의해 사용될 수 있는 "부추운" Java 코드를 구축한다.이로써 기존의 모든 객체 지향 코드는 여전히 유효한 측면 지향 코드일 것이며 개발은 객체 지향 언어의 자연스러운 확장처럼 느껴질 것이다.[5]SensionC++ 프로그래밍 언어는 측면 위버의 사용을 통해 C++를 확장하며, 측면 지향 프로그래밍의 장점을 그대로 유지하면서 임베디드 시스템에 필요한 SensionJ에 비해 추가적인 효율성을 제공한다.[6]

실행

측면 보호기는 조언이라고 알려진 측면에 의해 명시된 지시를 받아 프로그램의 다양한 클래스에 자동으로 배포하는 방식으로 작동한다.직조 과정의 결과는 원래 클래스와 이름이 같지만 클래스의 기능에 자동으로 추가 코드가 주입되는 클래스의 집합이다.조언은 주입된 코드의 정확한 위치와 기능을 명시한다.[7]

이 직조 과정을 통해, 측면 청소기는 그렇지 않았다면 여러 계층에 걸쳐 복제되었을 코드를 허용한다.이러한 중복을 제거함으로써, 가로 절단 우려모듈화를 촉진한다.[8]측면은 그렇지 않았다면 중복되었을 구현 코드를 정의하고, 조언을 정의하기 위해 포인트 컷과 결합 지점을 사용한다.직조 시 위버 측면은 포인트 컷(pointcut)과 결합 포인트(injoint point)를 사용하여 구현이 투입되어야 하는 후보 계층의 위치를 식별한다.[9]그런 다음 구현은 식별된 지점의 클래스에 주입되므로 프로그래머가 수동으로 복제하는 것에 의존하지 않고 적절한 시간에 코드를 실행할 수 있다.[10]

양면 로거 {     점을 찍다 방법() : 처형(* *(..));     전에() : 방법() {         시스템.밖으로.인쇄하다("참가 중" +              이 조인포인트.getSignature().토스트링());     }     다음에() : 방법() {          시스템.밖으로.인쇄하다("탈출" +              이 조인포인트.getSignature().토스트링());     } } 공중의 계급  {     공중의 공허하게 하다 술집을 내다() {         시스템.밖으로.인쇄하다("Foo.bar() 실행 중");     }     공중의 공허하게 하다 야유하다() {         시스템.밖으로.인쇄하다("Foo.baz() 실행");     } } 
SensionJ 프로그래밍 언어로 정의된 샘플 측면클래스
공중의 계급  {     공중의 공허하게 하다 술집을 내다() {         시스템.밖으로.인쇄하다("입력 Foo.bar()");         시스템.밖으로.인쇄하다("Foo.bar() 실행 중");         시스템.밖으로.인쇄하다("리빙 Foo.bar()");     }     공중의 공허하게 하다 야유하다() {         시스템.밖으로.인쇄하다("에엔딩 Foo.baz()");         시스템.밖으로.인쇄하다("Foo.baz() 실행");         시스템.밖으로.인쇄하다("Foo.baz()를 떠난다.");     } } 
위 샘플에서 위와 같은 측면을 실행한 결과로 만들어진 직조 클래스

양면J의 직조

프로그래밍 언어SideJ에서 포인트 컷, 조인 포인트, 모듈화된 코드는 자바 클래스와 유사한 측면 블록에서 정의된다.클래스는 Java 구문을 사용하여 정의된다.직조 과정은 측면 구현 코드가 짜여진 일련의 생성 클래스만 생성하기 위해 측면 조언을 실행하는 것으로 구성된다.[11]

오른쪽 예는 모든 방법의 진입과 출구를 기록하는 측면의 잠재적 구현을 보여준다.단면적인 측면의 위버가 없다면, 이 기능은 모든 방법에 대해 클래스에 코드의 복제가 필요할 것이다.대신, 진입 및 출구 코드는 오로지 측면 내에서 정의된다.[12]

측면 위버는 측면의 포인트컷에 의해 명시된 조언을 분석하고, 그 조언을 이용하여 구현 코드를 정의된 등급으로 분배한다.코드는 (방법 식별자가 변경됨에 따라) 방법에 대한 요구사항의 약간의 차이로 인해 각 방법마다 조금씩 다르다.측면 위버는 구현 조언에 의해 정의된 대로 각 상황에서 생성할 적절한 코드를 결정한 다음 지정된 포인트 컷과 일치하는 방법에 주입한다.[13]

바이트 코드로 직조

엮은 소스 코드 세트를 생성하는 대신, 일부 SensionJ wevers는 측면클래스를 바이트 코드로 직접 짜서, 위버와 컴파일러의 측면 역할을 모두 한다.[14][15]또한 컴파일 프로세스를 수행하는 측량기의 성능은 직조 공정으로 인해 더 많은 계산 시간이 필요할 것으로 예상된다.그러나 바이트 코드 짜기 프로세스는 컴파일된 짜임 소스를 통해 보통 달성되는 것보다 더 효율적인 런타임 코드를 생성한다.

런타임 짜임

SensionJ의 발전은 성능 요구를 해결하기 위해 JIT(Just-in-Time) 컴파일을 측면 지향 코드의 실행에 통합할 수 있는 가능성을 보여주었다.[16]런타임에, 위버의 측면은 전통적인 정적인 직조 방식보다 더 효율적인 방식으로 측면을 번역할 수 있다.Java Virtual Machine에서 SensionJ를 사용하면 런타임에 측면의 동적 직조 기능을 통해 코드 성능이 26%[17] 향상되는 것으로 나타났다.JIT(Just-in-Time) 가상 머신의 일부 구현은 새로운 가상 머신을 통해 이 기능을 구현하지만, 일부 구현은 현재 가상 머신에 이미 존재하는 기능을 사용하도록 설계될 수 있다.[18][19]새로운 가상 머신의 요구 사항은 SensionJ의 원래 설계 목표 중 하나와 반대된다.[5]

적시 직조를 수행하려면 컴파일된 바이트 코드를 실행하는 가상 시스템을 변경해야 한다.SensionJ를 위해 제안된 솔루션은 기존 Java Virtual Machine을 기반으로 하는 계층화된 접근 방식을 사용하여 동적 측면 지향 프로그래밍 엔진에 결합 지점 관리 및 콜백을 추가한다.[19]대체 구현에서는 중단점을 사용하여 포인트 컷에서 실행을 중지하고 적절한 방법을 선택하여 애플리케이션에 내장한 후 계속하는 직조 엔진을 사용한다.[20]이러한 방식으로 중단점을 사용하면 컨텍스트 스위치가 매우 많아 성능이 저하되는 것으로 나타났다.[17]

퍼포먼스

측면 보호자의 성능뿐만 아니라 그들이 생산하는 코드의 성능도 분석의 대상이 되어 왔다.단면 직조에 의해 제공되는 모듈화의 개선이 런타임 성능에 영향을 미치지 않는 것이 바람직하다.가로 방향 전환기는 가로 방향별 최적화를 수행할 수 있다.[21]측면 코드에서 사용되지 않는 특수 변수 제거와 같은 기존 최적화는 컴파일 시간에 수행할 수 있지만, 일부 최적화는 위버 측면에서만 수행할 수 있다.예를 들어, ElementJ에는 유사하지만 구별되는 두 개의 키워드가 있다.thisJoinPoint이 특수하게 짜여진 코드의 인스턴스에 대한 정보를 포함하고 있으며,thisJoinPointStaticPart에는 해당 조언 집합과 관련된 코드의 모든 인스턴스에 공통적인 정보가 포함되어 있다.교체 최적화thisJoinPoint보다 효율적이고 정적인 키워드로thisJoinPointStaticPart오직 약한 면에서만 할 수 있다.이 교체를 수행함으로써, 짜여진 프로그램은 모든 실행에서 조인 포인트 객체가 생성되는 것을 피한다.[14]연구에 따르면 SensionJ에서 불필요한 조인 지점 객체를 생성하면 런타임에 5%의 성능 오버헤드가 발생할 수 있는 반면, 이 객체를 생성하지 않을 때는 성능 저하가 약 1%에 불과하다고 한다.[22]

컴파일 시간 성능은 일반적으로 기존 컴파일러에 비해 좋지 않다. 이는 지정된 포인트 컷과 일치하는 방법을 찾는 데 필요한 추가 작업 때문이다.연구에 따르면 Sun Microsystems Java 1.3 컴파일러보다 SideJ 컴파일러 ajc가 약 34%, Java 1.4 컴파일러보다 약 62% 느리다.[23]

참고 항목

참조

  1. ^ Kiczales(2001년 10월), 페이지 2
  2. ^ Kiczales(2001년 10월), p.7
  3. ^ 콜리어(2003), 페이지 6
  4. ^ Kiczales(2001년 10월), 페이지 5
  5. ^ a b Kiczales(2001년 6월), 페이지 3
  6. ^ 스핀지크(2002), 페이지 1
  7. ^ 완드(2004), 페이지 1
  8. ^ 완드(2004), 페이지 7
  9. ^ 비에가 (2000년 11월), 페이지 2
  10. ^ 스핀지크(2007년 10월), 페이지 21
  11. ^ 왕(2007년 7월), 페이지 4
  12. ^ 아부스티노프(2007), 페이지 2
  13. ^ 힐스데일(2004), 페이지 5.5–6
  14. ^ a b 힐스데일(2004), 페이지 2
  15. ^ 맥이헨(2005), 페이지 1
  16. ^ 포포비치(2003), 페이지 1
  17. ^ a b 사토(2003년 9월), 페이지 17
  18. ^ 사토(2003년 9월), 페이지 2
  19. ^ a b 파포비치(2003), 페이지 3
  20. ^ 사토(2003년 9월), 페이지 11
  21. ^ Gal(2001), 페이지 3
  22. ^ 콜리어(2003), 페이지 2
  23. ^ 힐스데일(2004), 페이지 7

참고 문헌 목록

  • Avgustinov, Pavel; Hajiyev, Elnar; Ongkingco, Neil; de More, Oege; Sereni, Damien; Tibble, Julian; Verbaere, Mathieu (2007). Semantics of Static Pointcuts in AspectJ. Proceedings of the 34th Annual ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages. ACM. pp. 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). Using AspectJ for Component Integration in Middleware (PDF). Companion of the 18th Annual ACM SIGPLAN Conference on Object-oriented Programming, Systems, Languages, and Applications. pp. 339–344. doi:10.1145/949344.949440. ISBN 978-1-58113-751-4. Retrieved 23 January 2009.[영구적 데드링크]
  • Gal, Andreas; Schröder-Preikschat, Wolfgang; Spinczyk, Olaf (2001). "On Minimal Overhead Operating Systems andAspect-Oriented Programming" (PDF). Proceedings of the 4th Workshop on Object-Orientation and Operating Systems at the 15th European Conference on Object-Oriented Programming (ECOOP-OOOSW). Retrieved 27 January 2010.
  • Hilsdale, Erik; Hugunin, Jim (2004). Advice Weaving in AspectJ (PDF). Proceedings of the 3rd International Conference on Aspect-oriented Software Development. ACM. pp. 24–35. doi:10.1145/976270.976276. ISBN 978-1-58113-842-9. Archived from the original (PDF) on 27 July 2011. Retrieved 23 January 2009.
  • Kiczales, Gregor; Hilsdale, Erik; Hugunin, Jim; Kersten, Mik; Palm, Jeffrey; Griswold, William (October 2001). "Getting Started with AspectJ". Communications of the 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. (June 2001). An Overview of AspectJ (PDF). Proceedings of the European Conference on Object-Oriented Programming. Lecture Notes in Computer Science. Vol. 2072. pp. 327–354. doi:10.1007/3-540-45337-7_18. ISBN 978-3-540-42206-8. Archived from the original (PDF) on 2004-07-30. Retrieved 4 January 2010.
  • McEachen, Nathan; Alexander, Roger (2005). Distributing Classes with Woven Concerns – An Exploration of Potential Fault Scenarios. Proceedings of the 4th International Conference on Aspect-Oriented Software Development. ACM. pp. 192–200. doi:10.1145/1052898.1052915. ISBN 978-1-59593-043-9.
  • Popovici, Andrei; Alonso, Gustavo; Gross, Thomas (2003). Just-In-Time Aspects: Efficient Dynamic Weaving for Java. Proceedings of the 2nd International Conference on Aspect-Oriented Software Development. ACM. pp. 100 109. doi:10.1145/643603.643614. ISBN 978-1-58113-660-9.
  • Sato, Yoshiki; Chiba, Shigeru; Tatsubori, Michiaki (September 2003). "A Selective, Just-In-Time Aspect Weaver" (PDF). Proceedings of the 2nd International Conference on Generative Programming and Component Engineering. Lecture Notes in Computer Science. 2830: 189–208. doi:10.1007/978-3-540-39815-8_12. ISBN 978-3-540-20102-1. Archived from the original (PDF) on 2010-09-24. Retrieved 4 January 2010.
  • Spinczyk, Olaf; Gal, Andreas; Schröder-Preikschat, Wolfgang (2002). "AspectC++: An Aspect-Oriented Extension to the C++ Programming Language" (PDF). Proceedings of the Fortieth International Conference on Tools Pacific. 21: 53–60. Archived from the original (PDF) on 13 October 2009. Retrieved 4 January 2010.
  • Spinczyk, Olaf; Lohmann, Daniel (October 2007). "The design and implementation of AspectC++" (PDF). Knowledge-Based Systems. 20 (7): 636–651. CiteSeerX 10.1.1.149.7119. doi:10.1016/j.knosys.2007.05.004. Retrieved 23 January 2010.
  • Viega, John; Voas, Jeffrey (November 2000). "Can Aspect-Oriented Programming lead to More Reliable Software?". IEEE Software. 17 (6): 19–21. doi:10.1109/52.895163.
  • Wand, Michael; Kiczales, Gregor; Dutchyn, Christopher (2004). "A semantics for advice and dynamic join points in aspect-oriented programming" (PDF). ACM Transactions on Programming Languages and Systems. 26 (5): 890–910. CiteSeerX 10.1.1.57.6581. doi:10.1145/1018203.1018208. Archived from the original (PDF) on 25 August 2011. Retrieved 23 January 2009.
  • Wang, Yi; Zhao, Jianjun (July 2007). Specifying Pointcuts in AspectJ (PDF). Proceedings of the 21st Annual International Computer Software and Applications Conference. Vol. 2. pp. 5–10. CiteSeerX 10.1.1.547.6577. doi:10.1109/COMPSAC.2007.196. ISBN 978-0-7695-2870-0. Retrieved 23 January 2010.

추가 읽기