강좌 첫화면으로 최근 글 보기(Post)
갈래별로 보기 categories




  1.3.소스파일과 컴파일, 링크



1.3.소스파일과 컴파일, 링크

1.3.1. 어떤 과정을 거쳐 프로그램이 만들어지는가?

언어 프로그램을 이용하여 실행파일인 *.COM *.EXE 파일을 만듭니다

이제 컴파일러라고 부르는 언어프로그램을 이용해서 컴퓨터프로그램을 만드는 과정을 간단하게 설명하겠습니다. 컴퓨터프로그램을 만든다는 이야기는 실행파일에 해당하는 *.COM 파일과 *.EXE 파일을 만든다는 뜻입니다. 물론 그외의 부속 파일들도 만들어야 하지만 가장 중요한 파일인 실행파일을 만드는 것이 제일 중요합니다. 컴퓨터를 사용하는 분들은 *.COM 파일과 *.EXE 파일을 어떻게 만들고 그것이 어떻게 동작하는지 매우 궁금할 겁니다. 간단하게 언어프로그램을 이용해서 일반적인 프로그램을 짜는 과정을 정리하면 아래와 같습니다.

실행파일 만들기 1: C++언어 문법에 맞게 작문합니다. 다른 말로 소스파일을 짠다고 합니다.

편집기라고 부르는 에디터라는 프로그램을 이용해서 C++언어의 약속에 맞게 프로그램을 짜기 시작합니다. 즉 C++언어 문법에 맞는 문장을 작문하는 겁니다. 마치 한국인이 영어작문을 하는 것과 같습니다. 단지 영어 대신 C++언어라는 것으로 언어가 바뀌었을 뿐입니다. 이때 C++언어 문법에 맞게 작성한 문서파일을 원시파일 또는 소스파일(Source File)이라고 말하고 에디터를 이용해서 C++언어 문법에 맞도록 작문하는 것을 흔히 프로그램을 작성한다, 또는 프로그램을 짠다고 표현합니다.

실행파일 만들기 2: 소스파일을 컴파일러 프로그램을 이용해 기계어파일로 변환합니다

소스파일의 내용에 문법적인 문제가 없다면 소스파일을 컴파일러라는 프로그램을 이용해서 컴파일합니다. 컴파일은 번역한다는 뜻을 지니므로 컴파일러는 번역기에 해당합니다. 무엇을 무엇으로 번역할까요? 사람들이 알아볼 수 있는 소스파일을 기계가 알아볼 수 있는 기계어파일로 번역하는 겁니다.

실행파일 만들기 3: 컴파일 과정을 통해 만들어진 목적파일들을 링커를 이용해 연결합니다

컴파일러라는 프로그램으로 소스파일을 컴파일하면 목적파일, 또는 중간파일이라는 *.OBJ 파일이 생성됩니다. 이렇게 생성된 목적파일을 링커라는 프로그램을 이용해서 연결시킵니다.

링커를 이용해서 목적파일을 연결시키면 마침내 우리가 사용하는 실행파일인 *.COM이나 *.EXE 파일이 하나 만들어집니다. 이 파일은 실행이 되는 프로그램이므로 파일의 이름을 치면 다른 프로그램과 마찬가지로 실행이 됩니다.

**요약: 컴퓨터에서 사용하는 실행 프로그램은 C++의 문법에 맞게 짠 소스파일을 컴파일하고 링크해서 만듭니다.

1.3.2.컴파일러란?

컴파일러는 소스파일을 기계어로 번역해주는 프로그램입니다.

앞서도 몇 차례에 걸쳐서 설명했지만 컴파일러란 사람이 C++언어 문법에 맞추어서 쓴 명령어들을 컴퓨터가 이해할 수 있는 기계어로 번역해주는 프로그램입니다. 그리고 보통 언어프로그램이라고 하면 흔히 이런 컴파일러를 가리킵니다.

다시 말하지만 컴퓨터라는 기계는 0과 1의 이진수밖에는 모릅니다. ON과 OFF 아니면 +, -밖에는 모르는 단순한 기계입니다. 반면 사람은 숫자나 문자로만 모든 것을 이해합니다. 때문에 사람은 자신들이 알아볼 수 있도록 숫자와 문자로 명령을 기록하는데, 이를 기계가 이해할 수 있는 언어인 기계어로 번역해주는 프로그램이 컴파일러입니다. 즉 ABC를 0과 1의 조합으로 바꾸어주는 것입니다.

**요약: 컴파일러란 사람이 짠 소스파일을 기계가 알아들을 수 있는 기계어로 바꾸어주는 일을 하는 프로그램입니다.

1.3.3. 목적파일 *.obj 파일을 만들어 사용하는 이유

C로 프로그램을 짜면 컴파일러로 컴파일을 해서 목적파일(Object File)인 *.obj 파일을 만들어줍니다. 그러면 다시 링커라는 프로그램을 이용해서 우리가 원하는 *.exe 파일을 만듭니다. 그러면 왜 한번에 바로 소스파일을 *.exe 파일로 만들지 않고 *.obj라는 중간파일을 만드는 것일까 하는 의문이 들겁니다.

*.obj라는 파일을 만드는 이유는 여러 가지 이유가 있지만 한 마디로 설명하면 프로그램을 좀더 편하게 만들기 위해서입니다. 프로그램을 직접 만들다보면 왜 *.obj 파일이 필요한지 알 수 있지만 간단하게 예를 들겠습니다.

목적파일이 필요한 이유 1: 소스파일의 보안을 유지하면서 기능만 제공할 수 있습니다.

(가)라는 사람이 시계 프로그램을 C++언어로 짠 뒤에 이를 clock.exe라는 실행 프로그램으로 만들었다고 합시다. 그리고 (나)라는 사람이 사람은 달력프로그램을 만들어서 calendar.exe로 만들었다고 합시다. (나)는 (가)가 만든 시계프로그램과 자신의 달력프로그램 합쳐서 cc.exe라는 새로운 달력프로그램을 만들고 싶습니다. 가장 좋은 방법은 clock.exe의 C++언어 소스파일을 제공받아서 자신의 달력프로그램에 합친 후에 이를 컴파일하고 링크해서 cc.exe를 만드는 방법입니다.

그러나 소스파일이라는 것은 그 사람이 지닌 고도의 기술과 경험에 해당하며 일종의 회사기밀입니다. 프로그램의 소스 자체가 가장 중요한 재산이므로 프로그래머는 함부로 이를 공개하지 않습니다. 그래서 (가)는 소스파일 대신에 중간파일인 clock.obj를 (나)에게 제공합니다. 그럼 (나)는 clock.obj와 calendar.obj를 링커 프로그램으로 연결(linking)해서 cc.exe 파일을 만들 수 있습니다. 보안성도 유지되고 서로 각기 다른 프로그램을 만들어서 합칠 수 있으므로 효율적입니다.

목적파일이 필요한 이유 2: 분업화, 모듈화가 가능합니다

꼭 보안성 문제 때문만은 아닙니다. obj파일을 이용하면 하나의 프로그램을 짤 때 열 명이 각기 다른 기능을 가진 프로그램을 짜도 됩니다. (가)는 시계프로그램을 짜고, (나)는 달력프로그램을 (다)는 문서편집프로그램을 짠 뒤에 각기 짠 프로그램을 *.obj 파일로 만들어서 총기획자에게 보내주면 작업이 끝납니다. 프로그램 기획자는 (가) (나) (다)로부터 받은 세 개의 파일을 링크프로그램으로 연결만 하면 되기 때문입니다.

따라서 하나의 프로그램을 혼자서 낑낑 대며 짤 필요가 없습니다. 여러 명에게 나누어 준 뒤에 나중에 합치기만 하면 되므로 인력을 효율적으로 관리할 수 있으며 프로그램 개발에 걸리는 시간이 줄어듭니다. 만약 하나의 소스로 방대한 프로그램을 짜야 한다면 한 사람이 방대한 소스파일의 내용을 모두 파악하고 있어야 하며, 한 사람이 모두 짜야 하므로 시간이 무척 오래 걸리게 됩니다.

또한 프로그램을 만드는 실무자들은 자신이 맡은 부분만 담당하게 되므로 프로그램 전체의 기밀을 유지하는데도 도움이 됩니다.

목적파일이 필요한 이유 3: 컴파일 시간 등을 줄일 수 있습니다

보안과 분업화라는 기업적인 측면의 장점 외에도 개인에게 도움이 되는 장점이 있습니다. 목적파일을 만들어 사용하면 컴파일 시간을 줄일 수 있다는 점입니다.

요즘은 컴퓨터와 언어프로그램이 워낙 좋아져서 컴파일하는 시간이 많이 안걸리지만 예전에는 프로그램 하나 컴파일하는데 하루 종일 걸렸습니다. 지금도 조금 덩치가 큰 프로그램을 컴파일할 때는 몇 십분에서 몇 시간씩 걸립니다. 소스 길이가 몇 만 줄, 몇 십 만 줄이나 되는 덩치 큰 프로그램을 개발한다고 생각해보시면 이해가 될 겁니다. 몇 십 만 줄에서 한 줄 고치고 컴파일하면서 몇 십분 또는 몇 시간씩 기다려야 한다면 얼마나 시간낭비입니까?

그래서 문제가 없는 프로그램이나 함수 부분을 컴파일해서 *.obj 파일로 만들어놓습니다. 그리고 새로 고친 부분이나 새롭게 추가한 부분만 컴파일을 합니다. 그러면 몇 십분씩 걸리는 컴파일 시간이 몇 초로 줄어듭니다. 이렇게 해서 이상이 없으면 다시 *.obj 파일로 만들어놓고, 또 새로운 함수나 프로그램을 만듭니다. 그리고 나중에 최종적으로 그동안 만든 *.obj 파일을 하나로 링크시키기만 하면 됩니다. 이렇게 *.obj 파일을 이용해서 컴파일을 하면 컴파일 시간이 획기적으로 줄어듭니다.

만약 *.obj 파일을 사용하지 않고 바로 *.exe 파일을 만들어야 한다면 단 한 줄을 고치고도 수 십 만 줄이나 되는 소스파일을 전부 컴파일하느라고 많은 시간을 낭비해야 합니다. 또한 한꺼번에 수 십 만 줄을 읽을 수 있는 비싼 에디터를 써야 하며, 빠른 컴파일을 위해 컴퓨터도 매우 높은 사양의 기종으로 갖추어야 합니다.

목적파일이 필요한 이유 4: 확장성과 이식성을 높일 수 있습니다

그외에도 obj 파일을 이용할 때의 장점은 많습니다. 시계프로그램을 clock.obj로 한 번 만들어두었다면 다른 프로그램을 짤 때는 시계프로그램을 다시 짤 필요가 없습니다. 나중에 링크를 할 때 clock.obj 파일만 연결시켜주면 간단하게 해결되기 때문입니다. 따라서 이식성이 매우 높아집니다.

또한 유용한 함수나 소스파일을 컴파일하여 목적파일로 만든 다음에 목적파일만 합쳐놓은 라이브러리 파일을 만들어 사용할 경우 다양한 기능의 함수를 손쉽게 확장시킬 수 있습니다. 대표적인 것이 한글 라이브러리입니다. 한글 라이브러리를 이용하면 따로 한글을 구현하는 방법을 직접 구현하지 않더라도 다른 사람이 만들어놓은 라이브러리를 이용해서 손쉽게 한글을 구현할 수 있습니다. 이와 같은 확장성 때문에 프로그램을 만들 때 목적파일을 만들어 사용하는 것입니다.

**요약: 목적파일을 만들어 사용하는 이유는 소스파일의 보안, 작업의 분업화, 프로그램의 모듈화, 이식성과 확장성을 높이기 위해서입니다.

1.3.4.링크와 링커 프로그램

목적파일을 연결해 실행파일로 만드는 일을 링크라고 하며, 링크작업을 해주는 프로그램을 링커라고 합니다

중간중간 소스파일을 컴파일해서 *.obj 파일로 만들어주는 프로그램을 컴파일러(번역기)라 하고, 목적 파일로 만드는 과정을 '컴파일한다'고 표현합니다. 그리고 중간 목적파일인 obj 파일을 연결해서 최종적으로 하나의 실행파일로 만들어주는 프로그램을 링커(Linker)라고 하고, 실행파일로 만드는 과정을 '링크시킨다(Linking)'라고 말합니다. 이렇게 obj 파일을 링커 프로그램으로 링크시키면 비로소 실행파일이 만들어지는 것입니다.

다양한 링커 프로그램이 있으며 프로그램의 성격에 맞는 링커를 선택해 사용합니다

컴파일러 프로그램이 여러 종류인 것처럼 링커 프로그램 역시 수 십 종류가 있습니다. 마이크로소프트C에서 사용하는 MS링크, 터보C에서 사용하는 터보링크, 클리퍼 프로그램에서 사용하는 RT링크와 B링크 프로그램 등으로 링커 프로그램은 많은 종류가 있습니다.

이처럼 다양한 링커 프로그램이 있는 이유는 링커마다 성능과 기능이 조금씩 다르기 때문입니다. 초보자에게는 어렵지만 조금 수준이 높아지면 자신에게 맞는 링커 프로그램을 이용하게 됩니다.

과거에는 컴파일을 한 다음에 따로 링킹 과정을 거쳤습니다. 그러나 통합개발환경이 된 지금은 통합개발 프로그램 안에서 컴파일과 링킹 과정을 하나의 과정으로 연속 처리해줍니다. 따라서 별도로 링커 프로그램을 구할 필요도 없으며, 따로 링킹시킬 필요도 없습니다. 물론 라이브러리 파일이라는 것을 만들 때에는 별도로 링커 프로그램을 이용해야 합니다.

**요약: 컴파일러로 컴파일을 하면 *.obj 파일이 만들어지는데 이를 연결(link)해서 실행파일인 *.exe 파일로 만들어주는 프로그램을 링커(linker)라고 합니다.




첫줄로(go top, go first line) 문화원첫화면으로(go dal site home) 강좌차림으로(go Chair) 사이트맵으로(go sitemap)




total chairpost