C++ Native AOP의 가능성에서는 Aspected Oriented Programming이란 용어를 사용하였고, 크게 문제될게 없다고 생각했지만, AOP에 대해 고찰을 해보니 AOP라고 (좁은 의미에서) 부르기에는 약한 것이 사실이었다.

그래서 생각해낸 말이 직교적(수직적?) 코드 삽입orthogonal code injection이다. 뭐 기존에 존재하는 말일수도 있지만… 말 그대로 “기본 뼈대가 되는 기존 로직에 수직적인 코드삽입을 해야할 때 쓰면 좋지 않을까?” 라는 생각으로 만든 Flowcut!이란 이야기 되겠습니다.

기본적인 아이디어는 C++ Native AOP의 가능성에 기술해 두었으니 참고하시기 바랍니다. C++ Native AOP의 가능성에서 더 진행된 내용은 한 포인트에 한종류의 코드만 삽입할 수 있다는 단점에 대한 해결책입니다. 이를 위해 manager란 개념을 도입했습니다. 그리고, 실제 구현을 위해 boost::mpl과 boost::preprocessor가 사용되었습니다.

아직도(orz) 코드를 공개할 단계는 아닙니다. 일단은 간단한 그림 한 장으로 시작해보지요.

flowcut! example diagram

제 학사 졸업논문인 “백엔드 소프트웨어의 품질관리를 위한 향상된 커버리지 기법”에 실린 그림입니다. 간단하지만, Flowcut!이 하고자 하는 바를 명확히 보여준다고 할 수 있습니다. 🙂

기존의 실행 흐름에 삽입된 point_guard (실제 이름은 flowcut_guard)의 생성자/소멸자를 이용해서 싱글튼 객체인 flowcut_manager에 등록된 flowcut들을 실행하는 것이 Flowcut!의 시작이자 끝입니다. RAII기법의 변주인 IDIE(Initialization/Destruction Is Execution)을 이용하고 있기 때문에, 당연히 블록의 시작과 끝에 코드를 삽입하게 됩니다. 이것이 Flowcut!의 전부입니다.

물론, Flowcut!을 통해 삽입될 코드의 외부화를 위한 별도의 지원 코드와 쓰레드 안전성등을 위한 고민등이 남아있습니다. 그렇다고 코드를 공개하지 못하는 이유가 이 녀석인 것은 아닙니다. 다만.. 아직 코드의 표현력이 모자라서 저 스스로도 미궁에 빠질때가 많습니다. 이를 정리하고 나면 공개하도록 하지요.

ps. 무려 1년이 넘게 지나고 나서야 글을 올리게 되는군요.. 하아..

Flowcut!: Orthogonal Code Injection for C++

Flowcut!: Orthogonal Code Injection for C++”에 대한 6개의 생각

  • 2008/06/14 10:55 오후
    고유주소

    flowcut_manager -> registered flowcut에서
    trace_tag -> log_tag, log_tag -> trace_tag로 되어있넹.
    버근가? ㅎㅎ

    응답
  • 2008/06/15 4:31 오후
    고유주소

    그르네.. T_T
    시적허용이라고 우기고 싶은 버그.

    근데 저거 OmniGraffle로 그린건데 데모 사용기간이 지나서 패스 @_@. 사긴 사야되는데 언제 살지 모름.

    응답
  • 2013/02/13 4:52 오후
    고유주소

    C++, AOP 키워드로 여기저기 찾아다니다 여기까지 왔습니다.
    벌써 5년 전 글이긴 하지만.. 혹시 여기서 더 진행된 것이 있으신지요?

    응답
    • 2013/02/14 9:05 오전
      고유주소

      현재 개발중인 소프트웨어에서 유사개념을 사용하고 있습니다만, 일반화 시키기는 어려워서 공개를 “포기”했습니다. ㅎㅎ

      여유가 있으면, 정리해볼텐데 저도 좀 안타깝네요.

      ps. 아. 이 황량한 블로그에… 감격적인.. 댓글!!

      응답
      • 2013/02/19 9:48 오전
        고유주소

        그러시군요.
        Code Generation이 가능한지 아니면 그냥 함수머리에 직접 추가해주고 계신지 여쭈고 싶어요.
        전자가 가능하면 저도 공유좀 ㅎㅎㅎ…

        응답
        • 2013/02/19 11:01 오전
          고유주소

          음. 제품에서 쓰는건 후자고.

          전에 졸업논문쓸때 아주 무식하게 처리를 했었습니다.
          뭐냐면…

          전처리가 끝나고, {을 {INJECT_CODE;로 replace치는 거였죠.

          INJECT_CODE매크로는 log_guard __g; 였습니다. (..);

          이게 좀 위험하긴 한데.. log_guard가 크기가 0인 클래스라면 큰 문제는 안됩니다.

          이렇게 했을때, 예외적인 상황이 좀 발생해서 손을 봤던 기억은 납니다만… 무엇을 손보았던 건지는.. (죄송)

          참고가 되셨으면 합니다. ㅎㅎ

          응답

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.