2017년 2월 28일 화요일

데드 코드 삭제

데드 코드 삭제

데드 코드 삭제(데드 코드 찢겠어, : dead code elimination)는, 컴파일러 최적화 기법의 일종으로, 프로그램의 결과에 영향을 주지 않는 코드를 삭제하는 것으로 프로그램의 사이즈를 삭감하는 것을 가리킨다.데드 코드로서는, 전혀 실행되지 않는 코드, 참조되지 않는 변수(그 프로그램으로는 불필요한 변수)를 갱신할 만한 코드등이 포함된다.

다음 C언어의 코드예를 보자.

 int foo() {   int a = 24;   int b = 25; /*참조되지 않는 변수에의 대입*/   int c;   c = a << 2;   return c;   b = 24; /*실행되지 않는 코드*/ } 

변수 b에는 return문의 뒤에 값이 대입되고 있지만, 이것은 실행되지 않는다.즉, 코드의 실행은 순서대로적이고, return문이 어떠한 조건으로 둘러싸여 있는 것도 아니기 때문에, return문의 뒤의 코드는 실행 불가능하다.다만, 예를 들면 return문의 뒤에 라벨이 있고, 어딘가로부터 분기 해 날아 오는 경우는, 예위로 한다.

게다가 이 대입문을 삭제하면, b라고 하는 변수가 초기치를 대입했을 때 이외로는 전혀 사용되지 않는 것을 알 수 있다.오프티마이자가 어디까지 적극적으로 최적화할까에도 밤이, 변수 b는 생성되는 코드로부터 완전하게 삭제될 가능성도 있다.

함수내에서 어떠한 계산을 했다고 해도, 그 결과가 이 함수의 스코프외로부터 액세스 가능한 위치에 격납되지 않으면, 그 계산은 무의미하다.한층 더 이 함수는 항상 같은 값(96)을 돌려주므로, 단지 그 값을 돌려주는 함수로서 단순화 될 가능성도 있다.

최근의 컴파일러는 데드 코드 삭제를 실시하는지 아닌지를 옵션으로 지정할 수 있어 경우에 따라서는 그 레벨을 지정할 수 있는 것도 있다.낮은 레벨로는, 실행되지 않는 코드만을 삭제할 것이다.좀 더 높은 레벨로는, 사용되지 않는 변수를 위한 영역을 확보하지 않게 된다.한층 더 높은 레벨로는, 의미가 없는 코드나 함수를 특정하고, 그것들을 삭제한다.

데드 코드 삭제의 전형적인 이용예로서 프리프로세서에 의한 옵션 코드의 대체로서의 사용법이 있다.다음 코드를 보자.

 int main() {   int a = 5;   int b = 6;   int c;   c = a * (b >> 1);   if (0) {   /* DEBUG */     printf("%d\n", c);   }   return c; } 

if문의 조건식이 0이라고 하는 것은, 항상 가짜인 것을 의미해, 이 if문안의 코드는 실행되지 않는다.따라서, 데드 코드 삭제를 실시한 최적화된 프로그램으로는, 그 부분의 코드는 삭제된다.이것은 디버그용의 코드를 만약을 위해 놓아둘 때의 전형적인 테크닉이며, 최종적인 제품으로는 최적화를 해 디버그용 코드가 삭제되는 것과 동시에, 프리프로세서의 처리를 경감하는 것으로 컴파일 시간의 단축으로도 된다.

This article is taken from the Japanese Wikipedia 데드 코드 삭제

This article is distributed by cc-by-sa or GFDL license in accordance with the provisions of Wikipedia.

Wikipedia and Tranpedia does not guarantee the accuracy of this document. See our disclaimer for more information.

In addition, Tranpedia is simply not responsible for any show is only by translating the writings of foreign licenses that are compatible with CC-BY-SA license information.

0 개의 댓글:

댓글 쓰기