본문 바로가기

정보통신/IT

2. 컴파일과 빌드의 차이점

프로그래밍 언어에 대한 서적들을 읽다 보면 프로그래밍 언어와는 상관없이 컴파일(compile)이나 빌드(build)와 같은 전문용어를 접하게 됩니다.

컴파일(compile)이란, 텍스트 형식으로 되어 있는 소스 파일을 기계어 파일(바이너리 파일, 이진 파일)로 만드는 과정을 뜻합니다. 단순히 텍스트 파일 형식으로 되어있는 것을 사용하는 프로그래밍 언어의 문법에 맞는지 검사하여 잘못된 오류가 있는지 확인하고 없다면 기계어 파일로 변환하여 주는 역할을 합니다.

그러나 컴파일된 파일은 실행 파일과는 다릅니다. 정확하게 말하자면 우리가 윈도우 환경에서 실행할 수 있는 .exe 파일의 형태가 아니기 때문입니다. visual studio 환경에서는 .c로 되어 있는 소스 코드를 컴파일한다면. obj 파일로 변환합니다. 마찬가지로 리눅스 및 유닉스 운영체제에서도 .c로 되어 있는 소스 코드를 컴파일하면 .o 파일로 변환됩니다. 이처럼 .obj 파일 및 .o 파일을 통상적으로 오브젝트(object) 파일이라고 칭합니다.

이에 반해 빌드는 기본적으로 실행 파일을 만드는 일을 뜻합니다. 사실상 하나의 소스 파일이 하나의 실행 파일로 만들어지기 위해서는 컴파일 과정과 링크 과정을 거쳐야 하기 때문입니다.
링크(Link)라는 용어는 뜻 그대로 실행 파일로 만드는 데 필요한 기능들을 컴파일된 파일에 연결한다는 의미입니다. 따라서 .c 파일을 컴파일한 후에 생성된 오브젝트 파일을 이용하여 링크 작업을 해야 .exe 파일이 생성됩니다.

visual studio에서는 빌드과정을 통해 링크 과정을 실행합니다.
만약 .c 파일이 컴파일되어 있지 않은 상태에서 빌드를 진행하게 된다면 컴파일과 링크를 모두 실행하며, 이미 .obj로 컴파일된 파일이 존재하면 빌드를 실행했을 때 컴파일 작업을 지나쳐 버리고 링크 작업을 진행한 후에 실행 파일을 생성하게 되는 것입니다.

 여기서 컴파일러(compiler)와 인터프리터(interpreter)에 대해서도 궁금해하실 분이 계실 텐데요.
컴파일러는 개발자가 텍스트로 입력한 프로그램의 소스 파일들을 컴퓨터의 CPU가 이해할 수 있는 기계어 즉 이진코드로 변환해주는 소프트웨어입니다. 쉽게 말해 번역기라고 생각하시면 이해하시기 편하실 겁니다. 컴파일러는 CPU 종류에 따라 다르기 때문에 본인의 CPU 종류가 무엇인지 확인 후에 맞는 컴파일러를 사용해야 하며 대표적인 컴파일러는 마이크로스포트(MS)사의 Visual Studio입니다.
추가로 리눅스에서는 gcc라는 컴파일러를 사용하며 g++라는 컴파일러를 사용하는 경우도 있습니다. gcc 컴파일러는 공짜이며 윈도우 운영체제에서도 사용이 가능한데 왜 굳이 visual studio를 사용하는지 궁금한 분들도 계실 텐데요.
gcc 컴파일러가 사용료가 무료이고 성능도 다른 컴파일러에 비해 뛰어난 것은 사실이지만 기본적으로 유닉스와 리눅스에서 사용하는 컴파일러입니다. 따라서 윈도우에 적합한 visual studio보다는 사용법이 까다롭습니다. 또한 gcc는 사용 프로그램이 아니기 때문에 윈도우용 visual studio보다는 편리한 기능이 적지요.
이러한 다양한 이유로 인해 gcc 컴파일로 보다는 visual studio 컴파일러를 윈도우 운영체제에서 많이 사용하는 것이며, 잘 들어보지 못하셨을 겁니다.

인터프리터도 컴파일러와 비슷한 역할입니다. 텍스트로 되어 있는 소스 파일을 CPU가 이해할 수 있는 기계어로 변환해줍니다. 그러나 컴파일러와 차이점이 있는데요.
컴파일러가 텍스트로 되어 있는 소스 파일을 번역하여 이진파일인 오브젝트 파일을 생성하는 것에 비해, 인터프리터는 소스 파일의 한 줄을 읽어서 이진 코드로 바꾸어 줍니다. 이런 경우 간단한 프로그램의 경우 컴파일과 링크 과정을 거치지 않으므로 편리할 수 있지만, 실행 파일이 없기 때문에 소스 파일을 실행하기 위해서는 항상 인터프리터가 필요합니다. 또한 소스 파일의 첫 번째 줄부터 한 줄씩 실행되기 때문에 프로그램의 실행 속도가 컴파일러 방식과 비교했을 때 현저하게 떨어집니다.
 
오늘도 긴 글 읽어주셔서 감사드리며, 유익한 정보로 돌아오겠습니다.

'정보통신 > IT' 카테고리의 다른 글

6. 인공지능(A.I) & 로봇(Robot)  (0) 2022.10.12
5. XP(eXtreme Programming) 기법  (0) 2022.10.09
4. 스크럼(Scrum) 기법  (0) 2022.10.09
3. 소프트웨어 생명 주기  (0) 2022.10.08
1. C 언어의 장점  (0) 2022.10.08