2011-08-27 2 views
2

아주 간단한 방법으로 데드 코드 리무버를 자극하고 있습니다. 내 아이디어가 있음 들어내 간단한 데드 코드 리무버

,

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.이 아이디어를 구현하려고하는데, 데드 코드를 제거하는 대신 문자열을 더 처리해야합니다. 이 알고리즘에서 문자열 조작을 줄일 수있는 방법이 있습니까?

+1

gcc 소스를 연구 할 수 있습니다. 이미이 모든 작업을 수행하고 있습니다. 최적화를 위해 또는 -Wall로 컴파일 할 때. –

+6

프로그램을 텍스트로 생각할 때까지 아무런 진전을 보이지 않을 것입니다. 아무 것도 C 문이 한 줄에 걸쳐 지도록하거나, 한 줄에 한 C 문만 포함되도록하는 것은 아닙니다. ** 컴파일 과정을 **. 그런 다음 간단한 데드 코드 제거 도구를 만들 수 있습니다. 그때까지만해도 시간을 낭비 할뿐 아니라 순서대로 학습하고 가능한 습관을 고르면 가능한 한 많이 배우지 않습니다. –

+0

@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 그래서이 무의미한 알고리즘으로 끝났습니다. –

답변

7

이렇게하지 마십시오. C는 자유 형식 언어이므로 한 줄씩 처리하려고하면 C의 하위 집합을 지원하게되어 엄밀히 말하면 이름을 가질 자격이 없다는 제한을 받게됩니다.

당신이해야 할 일은 적절한 파서를 작성하는 것입니다. 거기에 관한 많은 책들이 있습니다. 학교에서 컴파일러 작성 과정에 사용하는 교과서를 확인하고 그 과정을 수강하십시오. 구문 분석기를 다운시킨 경우에만 의미론을 고려해야합니다. 그런 다음 문자열 대신 추상 구문 트리에서 작업하십시오. 또는 C에서 재사용 할 수있는 이미 작성되고 테스트 된 파서를 찾으십시오 (그러나 자신의 처리와 통합하기 위해서는 여전히 약간의 지식이 필요합니다).

결국 파서를 직접 작성하고 자신의 교훈을 얻기 위해서라면 C보다 간단한 언어를 사용하는 것이 좋습니다. 언어가 갈수록 C에서 코어가 상당히 컴팩트하지만, 선언 구문의 모든 세부 사항을 얻는 것은 의외로 까다 롭습니다. 실제로 관심이있는 것에서 당신을 멀게 할 것입니다. 그리고 전 처리기의 존재 자체가 문제입니다 이는 의미있는 소스 - 소스 변환을 설계하는 것을 매우 어렵게 만들 수 있습니다.

그런데, 당신이 스케치하는 변환은 "상수 전파"또는 (다른 상수 입력이있을 때 기능과 루프 바디를 복제하는보다 야심적인 변형에서) "부분 평가"로 알려져 있습니다. 그 용어를 검색하는 것은 흥미로울 수 있습니다.