요즘 간혹 올리는 글들이 대체로는 Regular Expression(정규 표현식)에 대한 것들이네요. C 코드 분석이나 Perl 이야기나 모두.. 몇번에 걸쳐 올리던 C 코드 분석은 현재로서는 잠정 중단입니다. 대신에 회사 업무 도중 Regexp 를 사용할 수 있는 좋은 기회가 생겼지요.
아시다시피 제가 속한 부서는 임베디드 소프트웨어를 만들고 있습니다. C 를 이용해서 프로그램을 만들지요. 비슷한 기능들을 모아 CSC라 분류하고 각 개발자는 몇개의 CSC를 맡아서 개발 및 테스트를 진행합니다. 보통 CSC는 디렉토리별로 나뉘게 되고, 이 디렉토리 아래에 .c 파일이 위치하게 되는 형태이지요.
프로그램을 작성하다보면 소프트웨어의 작동시 발생되는 여러 이벤트들을 외부에 알려야 하는 경우가 생깁니다. 이를 위해 event_log 라는 함수를 사용하게 되는데요, event_log 함수는 다음과 같이 사용됩니다.
event_log( EVENT_ID , "detail desc");
개발 과정에서는 뒤의 detail description을 이용해서 보다 알기 쉽게 이벤트의 내용을 표시해주게 됩니다. 하지만 정식 릴리즈가 가까워지면 수행 시간이나 이미지 크기 등의 문제로 인해, 뒤의 "detail desc"를 삭제해 주어야 합니다. 즉 아래와 같은 형태로 바꾸어야 하지요.
event_log( EVENT_ID );
여기서 문제가 발생합니다. event_log 함수가 전체 프로그램 내에서 무척이나 많이 사용되고 있기 때문에 "detail desc"을 삭제하는 일이 만만치 않은 작업이 되는 것이죠. 또한 정식 릴리즈 버전이 아니라 테스트를 위해서는 자세한 이벤트의 내용을 알기를 원하기 때문에 아래와 같은 형태로 변경하기로 하였습니다.
#ifdef EVENT_DEBUG
event_log( EVENT_ID, "detail desc");
#else
event_log( EVENT_ID);
#endif
event_log( EVENT_ID, "detail desc");
#else
event_log( EVENT_ID);
#endif
즉, 컴파일 시점에서 테스트용 이미지와 정식 빌드용 이미지를 EVENT_DEBUG를 이용해서 분리해내고자 하는 것입니다. 이러한 기법은 C/C++에서는 너무도 많이 쓰이는 방법입니다.
소스 코드 전체에 대해서 단순히 뒤의 자세한 설명만 없애는 것을 예상했을 때는 UltraEdit, AcroEdit 등 개발용 텍스트 에디터등을 이용해 정규 표현식으로 치환하려고 했습니다. 하지만 새롭게 제안된 내용은 단순한 치환으로는 안되더군요. 해당 에디터 들에서 줄바꿈을 만들어 내기가 어려웠습니다. 물론 매크로등을 이용하면 되긴 했지만, 뭔가 찜찜한 기분에 아예 변환 도구를 만들자고 생각했습니다.
어떤 언어로 만들까 잠시 고민을 해보았습니다. 최근에 관심을 가지고 있는 Perl을 이용해서 간단히 작업을 해보았는데 꽤나 쉽게 처리할 수 있었습니다. 이 글을 작성하는 곳이 회사가 아니라 집이다보니 해당 소스를 완벽하게 첨부를 하지는 못하지만, 대략 아래와 같은 형태입니다.
foreach $aLine (<fileHandle> )
{
if( $aLine =~ /^\s*(event_log.*),.*;$/ ) {
{
if( $aLine =~ /^\s*(event_log.*),.*;$/ ) {
print "#ifdef EVENT_DEBUG\n";
print "$aLine\n";
print "#else\n";
print "$1);\n";
print "#endif\n";
} else {
print "$aLine";
}
}
close( fileHandle );
print "$aLine\n";
print "#else\n";
print "$1);\n";
print "#endif\n";
} else {
print "$aLine";
}
}
close( fileHandle );
앞서 소개했던 Perl을 이용한 C 소스 코드 분석 에 나온 코드 형태와 유사합니다. 일단 주어진 하나의 파일에 대해 처리하는 것은 어렵지 않더군요. 하지만 코드를 작성하다보니 점점 하고 싶어지는 게 많아집니다. #ifdef 을 붙였다가 다시 떼고 싶을 땐 어떻게 하지? 이렇게 했다가 다시 이벤트 아이디만 표시하는 깔끔한 (?) 코드로 변경하고자 한다면? 디렉토리를 입력으로 주면 하위 디렉토리에 있는 모든 .c 파일에 대해서 같은 처리를 하면 편리하지 않을까? 등등등...
그러다 보니 아직 서툰 Perl로 작성하기에는 어려움이 많더군요. 손에 익숙치 않다보니.. 그래서 일단 Java로 짜기로 했습니다. Perl이야 말로 정규 표현식을 이용한 문자열 처리의 최고봉이긴 하지만, Java도 정규 표현식을 지원하니 비슷한 형태가 가능합니다.
오늘 회사에서 관련된 툴을 작성하여 팀 내에 배포를 하였는데, 자잘한 버그들이 존재하는 바람에 두번이나 더 배포를 해야 했습니다. 아직 한번 더 배포할 것이 남아있기도 하구요. 일단 원하는 기능을 잘 동작하는 것 같습니다. 자세한 소스는 다음에 올리기로 하고, 앞으로는 오늘 작성한 소스에 대한 공개적인 리팩토링 및 이를 Perl 등의 다른 언어로 표현하는 것에 대해서 다루어볼까 합니다. Perl을 배우는 좋은 기회가 될 것 같기도 하구요.
모두 좋은 밤, 그리고 즐거운 주말 되세요.
p.s. 펄 관련 유용한 사이트 링크 하나..
http://gypark.pe.kr/wiki/Perl/%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9D
TRACKBACK :: http://naratalk.com/trackback/269
-
Subject: Regular Expression 을 실제 작업에 이용하기 (2)
Tracked from Talking with Shinnara :: NaraTalk.com 삭제Regular Expression을 실제 작업에 이용하기에 이은 두번째 글입니다. 이번 글에서는 지난 글에서 소개하지 못했던 자바 소스에 대해서 간략히 설명을 할까 합니다. 그리고는 고수님들의 조언을 받아서 리팩토링도 하고, 또 다른 언어로 바꾸어볼까도 생각합니다. 지난 글에서 밝혔듯이 처음에 작성하고 섣불리 팀내에 배포했다가 몇가지 패턴을 인식못하고 또 잘못 바꾸어주는 덕에 테스트의 중요성을 실감한 사건이기도 했습니다. 정말이지 테스트는 무지 중요..
2008/12/15 10:03
댓글을 달아 주세요