[C++] Compile Process
기존에 컴파일을 한다면 문법 오류를 잡나보다 ~ 내가 작성한 코드를 실행시켜주는구나~ 라고만 이해했지 정확한 과정은 모르고 있었다.
사실은 학부 수업때 한번 들은 것 같았는데, 그땐 아무것도 몰랐던 상태라 그냥 그런게 있나보다 하고 넘어갔던 것 같다.
C++를 공부하는김에 어떤 과정을통해 내가 작성한 코드가 개발 환경에서 돌아갈 수 있는지 정리하고 넘어가겠다.
Compiler
컴파일러는 특정 프로그래밍 언어로 쓰여 있는 문서를 다른 프로그래밍 언어로 옮기는 언어 번역 프로그램을 말한다. (위키 백과)
번역을 해주는 프로그램이다. 이는 컴파일러는 하나의 소프트웨어라는 뜻이다.
어 근데 내가 아는 컴파일러는 내가 쓴 코드를 컴퓨터한테 전달해서 실행가능한 프로그램으로 만드는거 아닌가? 라고 생각이 들 수 있는데, 이것은 우리가 일반적으로 생각하는 컴파일러의 역할이다.
일반적으로 컴파일러는 C, C++ 과 같은 고급언어(printf("Hello World!"))를 컴퓨터가 이해할 수 있는 기계언어(0110101..)로 번역을한다. 대부분의 우리가 알고있는 컴파일러는 이와같은 역할을 한다.
위와같은 컴파일러 말고 유사한 수준의 언어 (고급언어를 다른 고급언어로 번역) 사이에서 번역하는 컴파일러를 트랜스 컴파일러 또는 크로스 컴파일러라고 한다. 예를들어 타입스크립트를 자바스크립트로 컴파일하는 컴파일러 말이다.
Compile 과정
다음은 컴퓨터에서 작성한 소스코드가 실행 가능한 형태로 변형되기까지 거치는 것들이다.
- Preprocessor (전처리)
- Compiler (컴파일)
- Assembler (어셈블러)
- Linker (링커)
Preprocessing (전처리 과정)
편집기에서 작성된 코드는 .cpp 라는 확장자가 부여된다. 이 소스코드는(헤더파일도 같이) 먼저 전처리기로 전달된다. 전처리기는 이 소스코드를 확장하는데, 이과정에서 일어나는 일은 주로 주석제거, 헤더파일 삽입, 매크로 치환 및 적용이다.
전처리기의 모든 명령은 # 기호로 시작된다. C++ 언어로 프로그램을 작성할때 흔하게 사용되는 #include, #define, #ifndef 과 같은것들이 전처리 언어이다.
# 기호는 전처리기로 가는 경로만 제공하기 때문에 이 기호와 같이 쓰인 명령은 전처리기에서 처리된다. 따라서 전처리 과정에서 일어나는 일들은 #include로 헤더파일을 끌어오는 작업, #define로 매크로 정의 및 대체, #ifdef #ifndef와 같은 조건부 처리 등을 작업하는 것이다.
Compilation (컴파일 과정)
전처리기에 의해 확장된 코드는 컴파일러로 전달된다. 컴파일러는 이 코드를 보다 더 CPU가 알아들을 수 있는 어셈블리 코드로 변환된다.
이 과정은 컴파일러가 전처리된 코드를 어셈블리 코드로 변환한다. 라는 말로 설명할 수 있다.
Assembly (어셈블리 과정)
컴파일 과정을 거쳐온 어셈블리 코드(*.s)는, 어셈블러에 의해 object 코드(*.o)로 변환된다.
이때 오브젝트 코드는 더이상 사람이 알아볼 수 없는 기계어(011001....)로 변환된 결과물을 이야기한다. 어셈블러에서 생성된 오브젝트 파일의 이름은 원본 파일과 동일하다.
예를들어 원본파일의 이름이 hello.cpp 이면 오브젝트 파일의 이름은 hello.o 가 된다.
Linking (링크 과정)
링킹 과정은 링커를 통해 오브젝트 파일들을 묶어 실행가능한 파일로 만드는 과정이다.
이 과정에서 오브젝트 파일과 라이브러리 파일도 링크하여 하나의 실행 파일로 만든다.
여기서 라이브러리 파일의 코드는 미리 컴파일되어 있으며 (*.a) 형식의 확장자로 저장되어있고, 링커는 이러한 라이브러리 파일의 오브젝트 코드 및 기타 파일의 오브젝트 코드를 우리가 만든 프로그램의 오브젝트 코드와 결합하는 작업을 한다. 이렇기 때문에 링커는 매우 중요한 역할을 한다.
링커의 출력은 실행파일이다. 실행파일의 확장자는 .exe(리눅스)이고 유닉스에서의 실행파일은 .out 형식의 확장자로 출력된다.
참고 링크:
https://developer.mozilla.org/ko/docs/Glossary/Compile
Compile - 용어 사전 | MDN
컴파일(Compile)은 주어진 language로 작성된 컴퓨터 프로그램을 다른 언어의 동등한 프로그램으로 변환하는 프로세스입니다. 컴파일러는이 작업을 실행하는 소프트웨어입니다. 때로는이 작업을 "
developer.mozilla.org
https://bradbury.tistory.com/226
컴파일(Compile)에 대한 이해
서론 C, C++, Java 프로그래밍을 해봤으면 작성한 소스 코드를 빌드(Build) 혹은 컴파일(Compile)해서 실행해봤거나 코드를 잘못 작성하여 컴파일 에러가 났던 경험이 있을 것이다. 정확하게 컴파일이
bradbury.tistory.com
https://www.javatpoint.com/compilation-process-in-c
Compilation Process in C - javatpoint
Compilation Process in C with Tutorial or what is c programming, C language with programming examples for beginners and professionals covering concepts, control statements, c array, c pointers, c structures, c union, c strings and more.
www.javatpoint.com