프로그램을 짠다는 것은 사용하는 언어의 문법에 맞게 명령들을 작성하는 것이다. 가령 1+2를 계산하여 결과를 출력하는 프로그램을 작성한다면 "1+2를 계산하라", "출력하라"라는 명령을 작성해서 파일로 저장해야 한다. 이렇게 언어의 문법에 맞게 명령들을 기술한 파일을 원시 파일(Source File)이라고 하며 원문 그대로 소스라고 부른다.

소스는 고급 언어로 작성되어 있기 때문에 컴퓨터가 바로 이해할 수 없으며 따라서 실행할 수도 없다. 컴퓨터는 오로지 이진수로 된 기계어밖에 알아듣지 못한다. 그래서 소스를 컴퓨터가 이해할 수 있는 기계어 코드로 번역해야 하는데 이 동작을 컴파일(Compile)이라고 한다. 컴파일이란 소스에 작성된 명령들을 컴퓨터 언어인 기계어로 번역하는 작업이며 컴파일을 하는 프로그램을 컴파일러(Compiler)라고 부른다.

컴파일러는 소스 파일에 작성된 고급 언어 명령을 해석하여 기계어 코드로 바꾸고 그 결과를 목적 파일(Object File)에 써 넣는다. 즉 컴파일러는 소스 파일을 목적 파일로 바꾸는 프로그램이다. 목적 파일은 소스의 명령들을 번역한 기계어 코드를 가진 파일이되 이 파일도 곧바로 실행할 수 없다. 왜냐하면 프로그램은 기계어 코드외에도 운영체제가 요구하는 코드를 추가로 가져야 하기 때문이다.

목적 파일을 실행 파일로 바꾸기 위해서는 이 실행 파일이 운영체제의 요건에 맞도록 형태를 조금 바꾸고 스타트업(StartUp)이라는 추가 코드를 가져야 한다. 목적 파일에 이런 처리를 하여 실행 파일로 만드는 동작을 링크(Link)라고 하며 링크를 해 주는 프로그램을 링커(Linker)라고 부른다. 하나의 프로그램이 작성되는 과정은 다음과 같이 그릴 수 있다.

사용자 삽입 이미지
소스 파일은 컴파일러에 의해 컴파일되어 목적 파일이 되며 목적 파일은 링커에 의해 링크되어 최종적으로 실행 가능한 실행 파일이 된다. 이렇게 컴파일과 링크를 통해 실행 파일을 만드는 과정을 빌드(Build)라고 한다. 소스 파일을 번역하여 곧바로 실행 파일을 만들지 않고 목적 파일이라는 중간 과정을 거치는 이유는 여러 개의 소스를 합쳐 하나의 실행 파일을 만들어낼 수 있어야 하기 때문이다. 하나의 소스에 필요한 모든 명령을 다 기술할 수 없으므로 소스를 여러 개 작성하고 이것을 모두 연결하면 완전한 실행 파일 하나가 나온다.
사용자 삽입 이미지
A.cpp를 컴파일하여 A.obj를 만들고 B.cpp, C.cpp는 각각 B.obj, C.obj를 만든다. 각 목적 파일은 소스 파일의 명령을 번역한 기계어 코드를 가지고 있을 것이다. 이렇게 개별 소스를 컴파일해서 만들어진 세 개의 목적 파일을 연결하면 하나의 실행 파일이 되며 링크 단계에서 이미 만들어진 라이브러리도 결합된다. 이런 식으로 소스를 여러 개 작성해서 최종적으로 링크하는 방식을 분할 컴파일이라고 하는데 여러 사람이 같이 작업하거나 기능별로 모듈을 개발할 때 일반적으로 사용하는 방법이다.

목적 파일은 개발 언어에 독립적인 형식을 가지고 있기 때문에 한 프로그램을 작성하는 데 여러 개의 언어를 같이 사용할 수 있다. 예를 들어 위 그림에서 A.cpp는 C로 작성하고 B.cpp는 파스칼로, C.cpp는 베이직으로 작성했다고 하자. 이때 각 언어의 컴파일러는 자신의 소스를 해석하여 목적 파일을 만들 것이고 이렇게 만들어진 목적 파일은 링커에 의해 연결되어 하나의 완성된 실행 파일이 될 수 있는 것이다. 이런 식으로 여러 개의 언어를 같이 사용하는 방식을 혼합 프로그래밍이라고 하는데 가능은 하지만 번거로운 문제가 많기 때문에 그리 일반적이지는 않다.

하나의 실행 파일을 만들려면 편집기로 명령들을 기술하여 소스를 만들고 이 소스를 컴파일하여 목적 파일로 만든 후 다시 링크 과정을 거쳐야 한다. 불과 얼마전까지만 해도 프로그래머는 이 번거로운 과정을 거쳐야만 실행 파일을 만들 수 있었는데 여러 단계를 거쳐야 하기 때문에 무척 불편했다. 아직도 일부 리눅스, 유닉스 환경에서는 이 방법대로 개발한다.

최근의 개발툴들은 자체에 편집기, 컴파일러, 링커를 모두 내장하고 있기 때문에 한 번에 소스를 실행 파일로 바꿀 수 있다. 뿐만 아니라 디버거, 프로파일러, 리소스 편집기 등 개발에 필요한 편의 기능까지 같이 제공하는데 이런 환경을 통합 개발 환경(IDE, Integrated Development Environment)이라고 부른다. 쉽게 말해서 종합 선물 세트쯤 된다. 개발 환경 내에서 편집, 개발, 디버깅, 최적화까지 다 할 수 있기 때문에 무척 편리하며 생산성 향상에 크게 기여하고 있다.

용어의 원래 뜻만으로 본다면 컴파일러란 소스 파일을 목적 파일로 변환하는 프로그램을 의미하는데 요즘은 통합 개발 환경이 워낙 일반화되었기 때문에 개발 환경 자체를 컴파일러라고 부른다. 문서 작업시에 워드 프로세서를 사용하고 계산을 할 때 스프레드 쉬트 프로그램을 쓰는 것처럼 개발 작업을 할 때는 주로 컴파일러를 사용한다.

Posted by 테티스
,