컴파일 과정 / C++로 자기소개 만들기
컴파일이란?
컴파일 과정에 대해 알아보기 전에 먼저 컴파일이 무엇인지 알아볼 필요가 있다.
우선 C++을 공부할 때 Visual Studio에서 F5를 눌러 컴파일 또는 빌드가 되면 콘솔 창이 뜨면서 결과나 나온다.
여기서 컴파일은 번역이라고 생각하면 된다.
즉, 사람이 이해할 수 있는 언어(파이썬, 자바, C++ 등)를 컴퓨터가 이해할 수 있는 언어로 번역하는 것이다.
영어도 우리말로 번역할 때 거치는 순서가 있듯이 프로그래밍 언어도 컴파일할 때 순서대로 거치는 과정이 있다.
그래서 컴파일 과정에 대해 조사해보았다.
컴파일 과정
위와 같이 컴파일 과정은 총 4가지 단계(전처리기, 컴파일러, 어셈블러, 링커)를 거치게 된다.
실행파일이 되기까지 계속 파일이 변하는 것을 볼 수 있는데 하나씩 알아보겠다.
1. 전처리기(Preprocessor)
제일 처음 소스코드(.cpp)를 받아 전처리 된 소스코드파일(.i)로 변환하는 과정을 말한다.
#으로 시작하는 전처리기 구문, #include을 통해서 헤더파일의 내용을 소스코드에 넣어준다.
그리고 매크로 치환을 하는데 #define 지시문으로 정의된 매크로를 심볼 테이블에 저장하고, 같은 문자열들을 #define된
내용으로 치환해준다. 즉, 같은 것들은 전부 정의했던 값으로 바꾼다.
2. 컴파일러(Compiler)
앞서 전처리 된 소스코드파일(.i)를 어셈블리어 파일(.s)로 변환하는 과정이다.
컴파일러는 3단계로 구성이 되어있다. 크게 전단부(Front end), 중단부(Middle end), 후단부(Back end)로 나누는데,
이 과정을 거쳐 어셈블리어 파일이 되는 것이다.
전단부(Front end)
전단부는 언어의 종속적인 부분을 처리한다. 각각의 언어로 작성된 코드들이 모두 다른 모듈에 의해 처리된다.
이곳에서는 소스코드가 올바르게 작성됬는지 확인하고 중단부(Middle end)로 넘겨주기 전 GIMPEL 트리를 생성한다.
GIMPEL트리는 소스코드를 트리 형태로 표현해놓은 자료구조를 말한다.
중단부(Middle end)
중단부에서는 앞에서 만든 GIMPEL 트리를 통해 아키텍쳐 비종속적인 최적화를 수행한다.
아키텍쳐 비종속적인 최적화는 다른 CPU 아키텍쳐여도 문제없이 수행할 수 있게 해주는 것을 뜻한다.
여기서 최적화는 꽤 중요한 부분이라 생각한다. 최적화의 유무에 따라 프로그램의 속도와 성능의 차이가 크기 때문이다.
마지막으로 최적화 완료 후에, 후단부에 넘길 RTL(Register Transfer Language)구조를 생성한다.
RTL(Register Transfer Language)은 고급 언어와 어셈블리 언어의 중간 형태를 말한다.
후단부(Back end)
후단부에서는 RTL을 통해 아키텍쳐 종속적인 최적화를 수행한다.
아키텍쳐 종속적인 최적화는 아키텍쳐마다 효율적인 명령어로 대체해 성능을 높이는 최적화 작업을 뜻한다.
마지막으로 아키텍쳐 종속적인 최적화가 끝나면 어셈블리 코드로 구성된 어셈블리어 파일(.s)이 생성된다.
3. 어셈블러(Assembler)
어셈블리어 파일(.s)를 오브젝트 파일(.o)로 변환하는 과정이다. 여기서 앞의 컴파일이 끝난 어셈블리 코드가
기계어로 바뀌게 된다. 그 기계어를 오브젝트 코드라고 부르는데, 이런 오브젝트 코드로 구성된 파일이 바로
오브젝트 파일(Object file)이 된다.
오브젝트 파일은 어셈블된 프로그램의 명령어와 데이터가 들어있는 ELF 바이너리 포맷(Binary format) 구조이다.
이를 다음 단계인 링커에서 바이너리 파일을 실행 파일로 묶기 위해서 각 바이너리 정보들을 일정한 규칙을 갖게
형식화 해놓은 것이다.
4. 링커(Linker)
링커는 오브젝트 파일(.o)들을 묶어서 실행파일로 만드는 과정이다.
오브젝트 파일들과 라이브러리 파일들을 링크해서 하나의 실행파일을 만드는 것을 뜻한다.
이렇게 링킹을 통해 오브젝트 파일을 실행 가능한 오브젝트 파일(Executable Object File)
즉, 실행파일(.exe)이 만들어지게 된다.
마지막으로 전처리기- 컴파일러 - 어셈블러 - 링커를 묶어서 툴체인(Toolchain)이라고 부르기도 한다.
C++로 자기소개 하기
아직 부족하지만, 최대한 간단하게 해보았다.
조금 더 배워서 차차 업그레이드 하도록 노력하겠다.