안녕하세요 pilsu-ni 입니다.


 우리는 프로그램을 개발하기 위해 개발툴을 사용합니다. 개발툴에서 제공하는 언어, 컴파일러, 링커를 이용하여 여러가지 프로그램을 만들고, 이를 배포하기도 합니다.


 프로그램을 개발하다보면, 프로그램의 구조(흐름방식) 변경없이 보다 빠르면서 안정적인 프로그램을 개발할 수 없을까? 하는 고민을 할때가 있습니다. 바로 이런 개발자들을 위해, 또는 자사에서 제공하는 디바이스(제품)을 제대로 사용할 수 있도록 하기위해 컴파일러를 개발, 배포(판매)하기도 합니다.


 그럼 컴파일러에 따라 프로그램 성능및 안정성이 바뀔까요? 결론을 이야기 하자면 그렇습니다. 심지어 문법조차 바뀌기도 합니다. 문법이 바뀌는 이유는 프로그램 언어의 표준이 계속 개정되고 있기 때문입니다. 실질적인 간단한 코드로 예를 들어 보겠습니다.


<VisualStudio 6 Version - OK, VisualStudio 2015 Version - Error >

for(int I = 0; I < 10; I++)

{

    int a = I;

}


for(I = 10; I < 20; I++)   // VS2015 Undefined Type Error

{

    int a = I;

}


<VisualStudio 6 Version - Error, VisualStudio 2015 Version - OK >

for(int I = 0; I < 10; I++)

{

    int a = I;

}


for(int I = 10; I < 20; I++)   // VS6 Redefine error

{

    int a = I;

}


 이와 같이 똑같은 동작을 하는 코드이지만, 개발툴에 적용된 컴파일러의 버전(C++ 개정 버전에 따른차이)에 따라 컴파일이 되기도 Error를 발생하기도 합니다.


 그럼, PreCompiler는 무엇일까요? 컴파일러와 같이 제공되어 지는 제품이며, 컴파일러와 짝을지어 제공됩니다.  PreCompiler는 단어가 의미하는것 같이 개발자가 만든 코드를 컴파일하기전에 미리 컴파일하는 것입니다. 프리컴파일러는 개발자가 만든 코드를 컴파일 할수 있도록, include하여 사용하는 코드를 포함하기도 하고, 프로그램 성능 개선을 위해, 개발자가 만든 코드를 변경하기도합니다. 이런 이유로 프로그램 개발시에 프리컴파일러가 변조를 해서는 안되는 영역을 지정하기도 합니다. 프리컴파일러의 성능개선 효과를 설명하기위해 제 머리속에 있는 작은코드를 적어보도록 하겠습니다.


<개발자 코드>

char szBuff[4096];

char* pRcv = lpBuffer; // lpBuffer는 4096바이트의 char* 형의 포인터


for(int I = 0; I < 4096; I++)

{

   szBuff[I] = pRcv[I];

}


<32비트환경 PreCompiler - 개발툴 기본제공 = 주석만 제거합니다.>

char szBuff[4096];

char* pRcv = lpBuffer; 


for(int I = 0; I < 4096; I++)

{

   szBuff[I] = pRcv[I];

}

<32비트환경 PreCompiler - 상용컴파일러에 포함 = 주석 제거 및 For문을 변조합니다.> 

char szBuff[4096];

char* pRcv = lpBuffer; 


for(int I = 0; I < 4096; I+=4)

{

   szBuff[I] = pRcv[I];

   szBuff[I + 1] = pRcv[I + 1];

   szBuff[I + 2] = pRcv[I + 2];

   szBuff[I + 3] = pRcv[I + 3];

}


 위와같이 단지 주석만 제거 하는 경우도 있지만, 상용툴에서 프리컴파일러가 하는 역할은 경우에 따라 다른형식의 프로그램 처리 방식으로 만들기도 합니다. 하지만 결과적으로는 같게되고, 특히 상용툴에서는 코드의 흐름을 변조하여 해당 코드를 실행하는 속도를 개선하기도 합니다.


 그럼 어떤 컴파일러로 만든 프로그램이 잘 만든 프로그램일까요? 


 결론은 컴파일러는 중요하지 않습니다. 컴파일러는 프로그램이 갖는 특성과 같은뿐, 잘 만든 프로그램은 얼마만큼 많은 테스트를 거쳐 프로그램에 존재할지도 모르는 버그를 해결했냐에 따라 달라집니다. 프로그램의 안정성은 디비깅 과정을 통해서 완성되고, 프로그램의 가치는 프로그램 기획단계에서 정해질수 있기 때문입니다.


감사합니다.