상기의 프로그램 제작 때문이었습니다.
VC++ 2003/2005 프로젝트 파일(*.VCPROJ)에서 사용하지 않는 헤더 파일을 제거하는 프로그램입니다.
프로그램 제목은 그럴싸한 "Header Crasher".
에 있습니다.
그래서 버전도 0.9 alpha 라는 꼬리표를 달고 있습니다.
하지만 Visual AssistX 처럼 Symbol Resolving을 완벽히 수행하는(사실 Visual AssistX도 한계는 있습니다만.) 프로그램을 만들고 보고 싶네요.
아래는 대략의 개발 노트입니다.
Head Crasher ver 0.9 alpha
1. 소개
Head Crasher는 빌드 되지 않은 소스 단계에서 C/CPP 내에서 불필요하게 Include된 H/HPP 파일을 제거(주석처리)하는 툴이다.
별도의 OBJ나 빌드 정보가 필요없으므로 Head Crasher 하나만으로 작업 수행이 가능하다.
2. 아이디어
1) 한정된 리소스로 Lex & Yacc까지 구현하는 것은 불가능하다고 판단, H, CPP 내의 텍스트 파싱만으로 제작하기로 하였다.
2) vcproj 파일에 수록된 H 파일 정보는 불필요하다. 실제 수록만 되어 있고 참조하지 않는 경우가 있기 때문이다.
따라서 C/CPP 파일내에 #include로 선언된 부분만 파싱하여 선언된 H 파일을 검색한다.
3) H파일의 검색 위치는,
- 프로젝트 경로
- #include에 선언된 논리 경로( ../../xxx.h )
- VS 설치시에 생성된 헤더파일 경로
- vcproj에 저장된 추가 헤더파일 경로
등이다.
4) 초기 버전에서 (, )와 C++ 키워드를 이용하여 함수와 변수를 구분하였다.
또한 H 파일속에 include된 H 파일을 Recusive하게 검색했으나 시간이 너무 걸렸다.
결국 H 파일의 검색 Depth가 1 로 주어졌으나 그 결과 변수를 구분한다는 것이 무의미해졌다.
Depth 1 로는 표준 C++ 키워드 이외에 class, struct, 매크로 등을 정확하게 파악할수 없다.
5) 따라서 최대한 알려진 KeyWord를 삭제하고 순수한 Symbol로만 H와 CPP 를 매칭시켰다.
6) KeyWord 리스트는 외부 파일(텍스트 파일)로 제공한다.
H 파일은 HeadKeyWord.dat 이며 C/CPP 파일은 CPPKeyWord.dat 을 이용한다.
실험상 프로젝트에 따라 리스트의 추가/삭제 만으로도 적중률을 상당히 올릴 수 있었다.
(원래 이 외부 파일은 Keyword뿐만 아니라 다양한 코딩 Pattern을 넣기 위한 아이디어였었다.)
7) 만약 H 파일명에 프로젝트명과 같은 이름이 들어가 있다면
(RheaStrike.vcprj 에서 RheaStrikeView.h, RheaStrikeDlg.h 일 경우)
시간 단축을 위해 해당 H 파일은 검색에서 제외한다.
MFC와 같은 프로그램에서 이런 경우가 상당히 빈번하기 때문이다.
8) 파싱에서 꽤 높은 정확성을 보이는 Visual AssistX의 경우,
키워드 리스트, 실시간 파싱, H 파일들에 대한 이미지와 Pattern을 갖고 있다.
실제 이 정도가 있으면 상당히 정확한 헤더파일 제거기를 만들수 있으며 개발자로써 도전해볼만 부분이나
테스트 유틸리티로는 무리가 따르는 부분이다.
9) 사용되지 않는 CPP 파일로 판정되면 해당 H파일은 주석처리하게 된다.
주석은 "// Comment by HeaderCrasher ::" 으로 처리된다.
(Undo 기능을 넣기 위해서)
10) 수정된 파일과 함께 기존 파일은 *.bak으로 저장된다.
11) 로그 파일은 HeadCrasher.exe와 같은 경로 내에어서 "읽은 프로젝트명 : 시간.txt"로 저장된다.
3. 추가할 점
1) 자료구조는 vector, list, CListBox 등을 이용하였다.
실제 수행시간에서 보다 만족스러운 결과를 위한 보다 나은 자료구조를 제작해 봐야하며 n중으로 수행되는 loop문이 많다.
검색시 loop를 최대한 줄이기 위한 새로운 자료구조가 필요하다.
2) Head Crasher는 짧지만 비번한 파일 입출력이 상당히 많은 프로그램이지만
CFile, CStdioFile, Serialize, fstream 등의 동기 입출력 함수를 사용한다.
입출력 시간을 줄이고 다음 CPP에서 미리 읽어오는 기능을 위해 비동기 입출력 함수로 수정할 필요가 있다.
3) 모든 H 파일의 검색과 이미지 저장. Visual AssistX나 상용툴과 같은 정확성을 보이려면 반드시 필요하다.
실행중 토큰 매칭으로는 한계가 따르는게 현실이다(이게 붙으면 돈주고 팔수도 있겠다.).
자, 다음 목표는~~

이런 로봇을 만드는 것.