728x90

시스템프로그래밍 | SP08 링커와 로더05

컴파일러에 대해

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

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

컴파일이란 소스에 작성된 명령들을 컴퓨터 언어인 기계어로 번역하는 작업이며 컴파일을 하는 프로그램을 컴파일러(Compiler)라고 부른다.

컴파일러는 소스 파일에 작성된 고급 언어 명령을 해석하여 기계어 코드로 바꾸고 그 결과를 목적 파일(Object File)에 써 넣는다.

즉 컴파일러는 소스 파일을 목적 파일로 바꾸는 프로그램이다. 목적 파일은 소스의 명령들을 번역한 기계어 코드를 가진 파일이되 이 파일도 곧바로 실행할 수 없다. 왜냐하면 프로그램은 기계어 코드외에도 운영체제가 요구하는 코드를 추가로 가져야 하기 때문이다.

gcc명령어로 각 단계별로 옵션(플래그) 사용해보기



‘목적파일(.obj)‘을 ’실행파일(.exe)‘로 바꾸기 위해서는 이 실행파일이 운영체제의 요건에 맞도록 형태를 조금 바꾸고 스타트업(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)이라고 부른다.

쉽게 말해서 종합 선물 세트쯤 된다. 개발 환경 내에서 편집, 개발, 디버깅, 최적화까지 다 할 수 있기 때문에 무척 편리하며 생산성 향상에 크게 기여하고 있다.

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

 



출처:

https://clearwater92.tistory.com/39

http://soen.kr/lecture/ccpp/cpp1/1-3-1.htm

 
컴파일러 구조와 원리
실제적인 컴파일러 가이드 『컴파일러 구조와 원리』. 컴파일러를 실제로 구축하기 위한 과정을 설명한 책으로, 프로그램언어로 쓰인 소스 코드가 컴퓨터 안에서 어떻게 실행되는지 순차적으로 설명하고 있다. 컴파일러 프로그래밍 언어의 실행 환경 등 컴파일러를 중심적으로 다루고 있으며, 그 뿐만 아니라 어셈블러, 링커, 하드웨어, 실행 환경까지 모두 다루고 있다. 컴파일러나 인터프리터의 내부 구조가 어떻게 되는지 살펴보고, C언어 프로그램이 동작하는 구조에 대해 알려준다. 더불어 x86 CUP의 구조를 이해하며, Linux에서의 링크, 로드와 라이브러리에 대해 살펴본다.
저자
아오키 미네로우
출판
한빛미디어
출판일
2010.09.10
 
컴파일러의 이해
컴파일러 이론은 방대하고 난이도가 높아 많은 학생들이 포기하기 쉬운 주제이다. 하지만 내공 있는 프로그래머가 되려면 반드시 컴파일러의 구조와 동작을 이해해야 한다. 30년에 걸쳐 컴파일러를 강의한 저자의 경험과 노하우를 바탕으로 최대한 쉽게 설명하였으므로 수준 높은 프로그래머를 꿈꾸는 많은 독자들에게 꼭 필요한 컴파일러 기본서로 자리매김할 수 있을 것이다. ※ 본 도서는 대학 강의용 교재로 개발되었으므로 연습문제 해답은 제공하지 않습니다.
저자
박두순
출판
한빛아카데미
출판일
2020.02.20
 
컴파일러 입문(개정판)
 
저자
오세만
출판
정익사
출판일
2010.08.10
 
컴파일러: 원리 기법 도구(2판)
ALFRED V. AHO, MONICA S. LAM, JEFFREY D. ULLMAN, 그리고 RAVI SETHI의 『컴파일러 - 원리 기법 도구』. 가장 오래된 소프트웨어로, 컴퓨터 과학과 공학의 여러 분야의 이론과 기술을 이용하여 효율적으로 구성할 수 있는 컴파일 설계에 관한 개론을 제공한다. 아울러 컴파일러 기술을 소프트웨어 설계와 개발에서 나타나는 광범한 문제에 적용하는 것을 강조하고 있다. 컴파일러에 관한 최신의 발전에 대해서도 안내한다. 학습한 내용을 점검할 수 있도록 연습문제도 실었다.
저자
Aho, RAVI SETHI, MONICA S LAM, JEFFREY D ULLMAN
출판
PEARSON EDUCATION KOREA
출판일
2009.03.11

+ Recent posts