728x90

컴파일의 과정

컴파일러의 목적

우리가 읽고 작성할 수 있는 형태의 코드를 소스코드프로그램 텍스트라고 하며, 컴퓨터가 실행할 수 있는 형태의 텍스트를 실행 파일이나 목적 코드, 기계 코드라고 합니다. 보통 C++ 소스코드 파일의 확장자는 .cpp 또는 .h이며, 목적 코드 파일의 확장자는 .obj 또는 .o입니다.

컴파일러의 역학은 소스코드를 목적 코드로 컴파일하는 것입니다. 컴파일러는 문법에 굉장히 예민하므로 오타나, 세미콜론, 중괄호 등 사소한 사항의 누락도 허용되지 않습니다. 특히, 컴파일러는 세미콜론(;)으로 한 구문이 끝나고 다른 구문이 시작하는 것을 구별합니다.


자주 하는 실수들

우리가 자주 하는 실수로 인한 조그만 오류를 하나씩 포함한 몇 가지 예제로 이 사실을 살펴봅시다.


// #include가 없음
int main() {
    cout << "Hello, World! \n";
    return 0;
}

cout을 정의하는 파일을 포함하지 않았으므로 컴파일러가 오류를 냅니다.
위의 에러를 고치려면 헤더파일을 추가해야 합니다.


#include "std_facilities.h"

int main() {
    cout << "Hello, World! \n";
    return 0;
}

컴파일러가 다시 불만을 토로합니다. std_lib_facilities.h의 철자가 틀렸기 때문입니다.


#include "std_facilities.h"

int main() {
    cout << "Hello, World! \n;
    return 0;
}

위의 소스코드도 컴파일러 오류를 냅니다. 문자열을 "로 종료하지 않았기 때문입니다.


#include "std_facilities.h"

integer main() {
    cout << "Hello, World! \n";
    return 0;
}

위의 소스코드도 마찬가지입니다. C++에서는 integer 대신 int를 사용해야 합니다.


#include "std_facilities.h"

int main() {
    cout < "Hello, World! \n";
    return 0;
}

이번에는 뭐가 문제일까요?
<<(출력연산)을 써야 할 곳에서 <(부등호)를 썼습니다.


#include "std_facilities.h"

int main() {
    cout << 'Hello, World! \n';
    return 0;
}

위의 코드에서는 큰따옴표가 아닌 작은따옴표로 문자열을 구분했습니다.


#include "std_facilities.h"

int main() {
    cout << "Hello, World! \n"
    return 0;
}

출력 구문을 세미콜론으로 끝내지 않았습니다.

이렇게 간단한 프로그램에서 사소한 오류의 예를 보여주기 위해 시간을 들인 이유는 무엇일까요? 그것은 많은 프로그래머들이 프로그램 소스코드의 오류를 찾는 데 많은 시간을 낭비하기 때문입니다.


표준을 지키는 컴파일러

프로그래밍을 하다 보면 컴파일러가 짜증날 수도 있습니다. 세미콜론 누락 등과 같은 아주 사소한 세부 사항으로 불평을 하고, 분명히 옳아 보이는 부분에서 오류를 냅니다. 하지만 일반적으로는 컴파일러가 맞습니다. 여러분의 소스코드에서 오류가 발생해서 목적 코드를 생성하기를 거부한다면 여러분의 프로그램에 틀린 무언가가 있다는 말입니다. 즉, 여러분이 의도하는 바가 C++ 표준에서 상세하게 정의한대로 기숭되지 않았다는 말입니다.

컴파일러는 인간처럼 상식을 지니지 않으며, 세부 사항에 매우 까다롭습니다. 상식이 없으므로 C++ 정의에 맞지 않는 '그럭저럭 괜찮아 보이는' 무언가로부터 여러분의 의도를 유추하려고 해서는 안 됩니다. 컴파일러가 마음대로 의미를 유추한다면 여러분의 의도와 다른 해석을 하고 결국 여러분은 모든 프로그램이 의도대로 동작하지 않는 니유을 찾아내는 데 많은 시간을 낭비해야 합니다.

모든 소스코드가 명확하게 정의될 때 컴파일러는 여러분 스스로 불러온 화로부터 여러분을 지켜줄 수 있습니다. 또 그로 인해 발생하는 많은 다른 문제로부터 우리를 구해줄 수 있습니다. 따라서 여러분이 프로그래밍할 때 컴파일러를 친구로, 가능하다면 최고의 친구로 대해야 합니다.


728x90
728x90