아주 간단한 방법으로 데드 코드 리무버를 자극하고 있습니다. 내 아이디어가 있음 들어내 간단한 데드 코드 리무버
,
1 단계 : 라인으로 입력 된 C 프로그램 라인을 읽고 이중 연결리스트 또는 배열에 저장 (삭제 이후 및 삽입이보다 쉬워진다. 파일 조작에서).
내 접근 방식이 맞습니까? 그렇다면 링크 된 목록을 매번 탐색하는 것을 최소화하는 방법.
2 단계 : 읽기 문자열의 분석이 병렬로 수행되며, 테이블,
3 단계 변수의 이름과 자세한 기능과 전화 등을 유지하기 위해 만들어집니다. 검색은 변수 테이블의 각 항목에 대해 수행되며 변수는 해당 시간 값 (있는 그대로)으로 대체됩니다. (예를 들어)
i=0;
if(i==3) will be replaced by if(0==3).
그러나 같은 상황에 .. 또 다른 변수에 의존하기 때문에 여기
get(a);
i=a;
if(i){}
이, '나'교체되지 않습니다. 'a'는 사용자 입력에 따라 달라 지므로 대체되지 않습니다.
의심 : 사용자 입력되면 (5 * 5 + 6) 경우에 {헬로 인쇄;} 은 반드시 불필요한 검사 할 것이다. 어떻게 코드를 단순화하기 위해이 표현식을 풀 수 있습니까? { print hello; }
4 단계 : 문자열은 (1), (0 등) 및 스택을 사용하여 동작 블록이 제거되는 동안 경우 검색한다. if (0) {// this will be removed * /}
단계 5 : (예) function foo() {/ ** /} ... if (0) foo(); ... 일단 모든 데드 코드가 제거되면 함수 테이블에서 foo()의 항목을 검사하여 코드에서 참조 된 no.of.times를 가져옵니다. 값이 0이면 동일한 스택 메소드를 사용하여 해당 함수를 제거해야합니다.
6 단계 : 나머지 기능에서 '}'를 제외한 나머지 명령문 (있는 경우) 아래의 행이 제거됩니다. 이 제거는 함수가 끝날 때까지 수행됩니다. 함수의 끝은 스택을 사용하여 식별됩니다.
7 단계 : 이제 죽은 코드는 준비가되었다고 가정합니다. 연결된 목록이나 배열을 출력 파일에 저장하십시오.
내 질문은 입니다. 내 생각은 의미가 있습니까? 아니면 구현 가능합니까? 어떻게이 알고리즘을 향상시킬 수 있습니까?
2.이 아이디어를 구현하려고하는데, 데드 코드를 제거하는 대신 문자열을 더 처리해야합니다. 이 알고리즘에서 문자열 조작을 줄일 수있는 방법이 있습니까?
gcc 소스를 연구 할 수 있습니다. 이미이 모든 작업을 수행하고 있습니다. 최적화를 위해 또는 -Wall로 컴파일 할 때. –
프로그램을 텍스트로 생각할 때까지 아무런 진전을 보이지 않을 것입니다. 아무 것도 C 문이 한 줄에 걸쳐 지도록하거나, 한 줄에 한 C 문만 포함되도록하는 것은 아닙니다. ** 컴파일 과정을 **. 그런 다음 간단한 데드 코드 제거 도구를 만들 수 있습니다. 그때까지만해도 시간을 낭비 할뿐 아니라 순서대로 학습하고 가능한 습관을 고르면 가능한 한 많이 배우지 않습니다. –
@I 아직 편집 과정을 밟지 않았습니다. 당신이하는 말을 이해할 수 있지만 온라인 이벤트에서 결승전에 선정되었습니다. 이 프로그램은 데드 코드 리무버를 자극하는 것입니다. 나는 많은 서핑을했으나 파서에 대한 아이디어를 얻을 수는 없습니다. http://stackoverflow.com/questions/7206752/how-to-use-ast-in-our-own-c-program http://stackoverflow.com/questions/7205749/what-is-ast-cfg-clang -de-can-we-use-it-deadcode-removal-algorithm 그래서이 무의미한 알고리즘으로 끝났습니다. –