보통 대학4학년 과정에서 배우는 것이 컴파일러다. 컴파일러는 뭐하러 배울까?

나 스스로 대답하길 '컴퓨터 공학(과학)에서의 기초중의 기초야'라는 것이다. 사실 이 물음은 단지 이성적으로 이해하기위한 것일지도 모른다. 마음적으론 컴퓨터에 조금 더 배워보고싶지만, 듣기 않기위한 변명을 찾고 있었는지도 모른다.

  그래도 컴파일러를 뭐하러 배우는지에 대해 조금 더 찾는다면 글쎄...굳이 찾는다면 나중에 도움이 될 수도 있고, 더 나은 프로그래머가 될 수도 있을 것이다. 

  내가 배우는 것은 컴퓨터에 대한 흥미와 궁금증이 크기에 더 깊게는 생각안하고 이제 컴파일러에 대해서 설명해볼까한다.

1. 컴파일러란?

  


  원시 프로그램(원시 코드)는 보통 고급 언어로 작성되어 사람이 이해하기 쉽게 쓰여진 것이다. 컴퓨터가 알아듣게 바꿔야 한다. 그 과정에서 번역이 필요하다. 그 번역해주는 프로그램이 컴파일러이다. 여기서 컴파일러(Complier)는 번역기의 일종이다. 하나의 프로그램에서 다른 프로그램으로 번역해주는 것을 말한다.

  우리가 흔히 아는 C, Java등을 컴파일러를 통하면 결과로 어셈블리어, 기계어코드(실존기계, 가상기계)가 나오는 것이라고 보면 된다.

여기서 C, C++, Java같은 특정 문법에 따라 쓰인 프로그램을 원시 프로그램이라 한다. 결과로 나오는 어셈블리어, 기계어코드는 목적 프로그램이라고 한다.


* 가상기계?

  위키백과의 정의에 의하면 "실제 하드웨어와 통신이 없는 가상의 컴퓨터"라고 적혀있다. JVM(자바 가상머신), VMWARE 그리고 자주 쓰이는 Docker(도커) 등이 있다. 

  자바 가상머신을 예로 들면, 원시 코드 -> 컴파일러 -> JVM -> 인터프리터 -> 목적 코드 이다. 앞쪽을 따서보면 비교하면 다음과 같다.

원시코드 -> 컴파일러 -> 목적코드

원시코드 -> 컴파일러 -> JVM

(왜 자바는 JVM으로 컴파일하는 지에 대해선 다루지 않는다. jvm에 대해서 검색해보면 알 수 있을 것이다.)


2. 번역기의 종류

  번역기는 말 그대로 영어<->국어 와 같이 번역을 하는 것이다. 종류로는 4가지가 있다.


 전처리기


 입력: 원시프로그램

 출력: 확장된 원시 프로그램

 어셈블러


 입력: 어셈블리 원시 프로그램

 출력: 기계어 코드 

 결합기(loader/linker)


 입력: 여러 뭉치의 기계어코드

 출력: 하나로 묶이고 재배치 정보가 확정된 코드 

 해석기(interpreter)


 입력: 원시 프로그램, 중간코드

 출력: 원시 프로그램을 실행시킨 결과


3. 처리 과정

  컴파일러에 의해서 처리되는 과정은 다음과 같다.

원시 프로그램 > 전처리기 > 컴파일러 > 어셈블러 > 로더/링커 > 목적 프로그램


* main이 없으면 어디서 멈출까?

  c, c++등의 언어는 모두 main을 갖추고 있다. 그렇다면 main은 어디서 멈추는게 맞을까? 그건 로더/링커다.

전처리기는 #이 붙은 것을 처리한다. 컴파일러는 말그대로 어셈블리코드로 바꾸는 것을 한다. 

어셈블러는 재배치가능한 목적프로그램으로 바꿔주기만 한다. 하지만 로더/링커에선 다른 c파일들과 하나로 합치고, 라이브러리를 가져오고, 실제 실행가능한 프로그램으로 만들기때문에 기본적으로 파일을 실행할 때, 실행되는 main이 없으면 만들어지지 않는다.

따라서, 로더/링커에서 main이 있는지 검사를 한다고 보면 된다.

4. Linux계열에서의 과정

  Linux계열은 c컴파일을 위해 gcc를 사용한다. 컴파일이 제대로 되었는지 중간중간과정을 확인해보는 방법은 없을까?

gcc프로그램에는 여러가지 옵션이 있다. (gcc컴파일방법 바로가기)

옵션 

결과

 -E

 전처리기의 결과인 확장된 원시프로그램(.i)

 -s

 컴파일러의 결과인 어셈블리프로그램(.s)

 -c

 어셈블러의 결과인 재배치가능한 목적프로그램 (.o)


또한 gcc를 통해서 실행파일(실행가능한 목적프로그램)이 나오기까지의 기록을 보고 싶다면 gcc -v filename.c를 하면 된다.



제 블로그의 내용이 도움이 되셨나요?

여러분의 공감댓글이 큰 힘이 됩니다 :)

▼▼▼▼▼▼▼▼▼▼▼



+ Recent posts