반응형
1. 컴파일(Compile): 사용자가 작성한 코드를 컴퓨터가 이해할 수 있는 언어로 번역하는 일
2. 링크(Link): 컴파일된 소스코드를 연결하는 일
3. 빌드(Build): 컴파일된 코드를 실제 실행할 수 있는 상태로 만드는 일
4. 배포
* Release: 같은 제품을 새롭게 만드는 것
* Deploy: 프로그램 등을 서버와 같은 기기에 설치하여 서비스 등을 제공하는 의미
* Distribute: 제품을 사용자들이 사용할 수 있도록 서비스 등을 제공하는 의미
C++ 코드를 실행파일로 변환하는 과정.
- 전처리(Preprocessing) 단계: #include 와 #define 와 같은 전처리기 매크로들을 처리합니다.
- 컴파일 (Compile) 단계: 각각의 소스 파일들을 어셈블리 명령어로 변환합니다.
- 어셈블 (Assemble)단계: 어셈블리 코드들을 실제 기계어로 이루어진 목적 코드(Object file)로 변환합니다.
- 링킹 (Linking) 단계: 각각의 목적 코드들을 한데 모아서 하나의 실행 파일로 만듭니다.
전처리(Preprocessing)
- 문자들 해석: 소스 파일에 있는 문자들을 해석하는 것입니다.
- 5 종류의 공백 문자들 (스페이스, 탭, 개행 문자 등등)
- 10 종류의 숫자들 (0 부터 9 까지)
- 52 종류의 알파벳 대소문자
- 29 종류의 특수 문자들 (_, {, + 등등)
- 이 기본 문자 셋(총 96개)에 포함되어 있지 않은 다른 모든 문자들 컴파일러에 의해서 따로 해석합니다.
- 문자 해석
- 만약에 백슬래시 (\) 문자가 문장 맨 끝 부분에 위치해있다면, 해당 문장과 바로 다음에 오는 문장이 하나로 합쳐지고 개행 문자는 삭제합니다.
- 전처리 토큰들로 분리: 소스 파일을 주석 (comment), 공백 문자, 전처리 토큰(Preprocessing token)들로 분리합니다.
- 헤더 이름 (<iostream> 과 같이)
- 식별자
- 문자/문자열 리터럴
- 연산자들 (+, ##)
- 전처리기 실행 단계: 전처리 토큰들로 분리하였으므로 전처리기를 실행합니다.
- #include 에 지정된 파일의 내용을 복사합니다.
- 참고로 #include 로 복사된 헤더 파일은 다시 Phase 1 부터 4 단계까지의 과정을 거칩니다.
- 이 과정은 소스 파일에 더이상의 전처리기문이 없을 때 까지 지속됩니다.
- #define 에 정의된 매크로를 사용해서 코드를 치환합니다.
- #if, #ifndef 와 같은 구문들을 실행해서 코드를 치환합니다.
- #pragma 와 같은 컴파일러 명령문들을 해석합니다.
- 보통 헤더파일이 중복되어서 include 되더라도 한 번만 포함이 되게 헤더 가드(Header guard) 를 작성합니다.
- 헤더 가드(Header guard)에 대한 자세한 내용은 [C++] 조건부 컴파일 매크로(전처리기 지시어): Header Guard를 참조해주시기 바랍니다.
- #include 에 지정된 파일의 내용을 복사합니다.
- 실행 문자 셋으로 변경
- 모든 문자들은 이전의 소스 코드 문자 셋에서 실행 문자 셋(Execution character set) 의 문자들로 변경됩니다.
- 마찬가지로 이전의 Escaped 된 자들도 실행 문자 셋의 문자들로 변경됩니다.
- 인접한 문자열 합치기
- 기존: std::cout << "abc" "def";
변환: std::cout << "abcdef";
- 기존: std::cout << "abc" "def";
컴파일(Compile)
- 개발자가 작성한 source code를 (어셈블리 형태로 변환한 후) binary code인 기계어로 변환하는 과정입니다.
- 해당 작업을 해주는 프로그램이 Compiler입니다.
- Java의 경우, JVM(Java Virtual Machine)에서 byte 코드 형태의 *.class 파일이 생성됩니다.
- C++의 경우, MinGW, Clang에서 byte 코드 형태의 *.o(Object file) 파일이 생성됩니다.
- 추가로 컴파일에 대한 보다 자세한 내용은 [CS] 컴파일(Compile)에 대해 보다 심도있는 내용를 참조해주시기 바랍니다.
Compile된 어셈블리 코드를 확인하고 싶다면?
- compiler explorer: https://godbolt.org/
- 위 링크에 코드를 넣으면 어셈블리 코드를 확인할 수 있습니다.
링킹(Linking)
- A와 B 소스파일이 있을 때, 각각 compile만 하면 A가 B에 존재하는 함수(메서드)를 찾을 수 없어 호출할 수가 없습니다.
- 따라서, A와 B를 연결해주는 작업이 필요한데 이를 Linking라 합니다.
- 여러 개로 분리된 compile한 소스파일들을 최종 실행 가능한 파일로 만들기 위해 필요한 부분을 찾아서 연결해주는 작업입니다.
- 주로 사용하는 실행 파일 형태는 Portable Executable 이라 불리는 PE 파일 형식의 파일을 생성하게 됩니다.
- 윈도우 계열: *.exe
- 맥 계열: *.pkg *.dmg
- 리눅스 계열: *.ELF (Executable and Linkable Format)
- 추가로 ELF에 대한 보다 자세한 설명은 [Linux] Executable and Linkable Format(ELF): 실행 및 링킹 파일 포멧를 참고하시기 바랍니다.
- 주로 사용하는 실행 파일 형태는 Portable Executable 이라 불리는 PE 파일 형식의 파일을 생성하게 됩니다.
- Link는 정적링크(static link)와 동적링크(dynamic link)가 있습니다.
- 정적링크(static link): compile된 소스파일들을 연결해서 최종 실행 가능한 파일을 만드는 것입니다.
- 동적링크(dynamic link): 프로그램 실행 도중, 프로그램 외부에 존재하는 코드를 찾아서 연결하는 것입니다.
- 추가로 링킹에 대한 보다 자세한 내용은 [CS] 링킹(Linking)에 대해 보다 심도있는 내용를 참조해주시기 바랍니다.
빌드(Build)
- 개발자가 작성한 source code를 실행 가능한 소프트웨어 결과물로 만드는 일련의 과정입니다.
- Build 단계 중 Compile이 포함되어 있으며, Build tool은 다음과 같은 Build 과정을 도와줍니다.
- 전처리(Preprocessing)
- 컴파일(Compile)
- 패키징(Packaging)
- 테스팅(Testing)
- 배포(Distribution)
- Build tool
- JAVA: Ant, Maven, Gradle 등
- C++: CMake, Gradle, Ninja, SCons, MSbuild, Meson 등
- C++의 Build tool 과 관련된 상세내용은 [C++] C++ 빌드 시스템(툴)에는 뭐가 있을까?를 참조합시다.
- C++의 Build tool 중 CMake에 대한 상세내용은 [CMake] CMake 소개 및 필요성: Modern CMake 3.23+과 이후에 연재되는 글을 참조합시다.
배포(Release, Deploy, Distribute)
- Release: 같은 제품을 새롭게 만드는 것(예: 새로운 버전을 배포, 새로운 아이피 번로 부여)
- Deploy: 프로그램 등을 서버와 같은 기기에 설치하여 서비스 등을 제공하는 의미
- Distribute: 제품을 사용자들이 사용할 수 있도록 서비스 등을 제공하는 의미
참고
- [CS] Compile, Link, Build 란?: https://velog.io/@leede418/CS-Compile-Link-Build-%EB%9E%80
- [Github] 컴파일, 빌드, 배포의 개념 및 차이: https://itholic.github.io/qa-compile-build-deploy/
- [TROLL:티스토리] 빌드, 배포, 컴파일의 개념 & 차이점 (Build, Deploy, Complie): https://choseongho93.tistory.com/296
- [tistory] 배포의 의미: https://ukcasso.tistory.com/73
- [씹어먹는 C++]: https://modoocode.com/319
반응형
'Study: ComputerScience(CS) > CS: Basic' 카테고리의 다른 글
[CS] 캐시(Cache)란? (0) | 2022.07.06 |
---|---|
[CS] 링킹(Linking)에 대해 보다 심도있는 내용 (0) | 2022.07.05 |
[CS] 컴파일(Compile)에 대해 보다 심도있는 내용 (0) | 2022.07.05 |
[CS] 래퍼(Wrapper) 클래스란? (0) | 2022.07.04 |
[CS] 컴퓨터 CPU 용어: CPU 코어, 쓰레드, 클럭, 캐시메모리 (0) | 2022.06.17 |