# 빌드 속도 개선

**빌드란 소스코드가 프로그램이 되는 과정**

## 여러가지 컴파일러

### C++ 컴파일러 (Compile Language)

* 바로 기계어로 번역되어 실행
* 실행 속도가 빠르고 보안에도 유리
* 소스코드를 조금만 수정해도 다시 컴파일 해야함..
* 개발 생산성이 낮아짐
* 즉 개발 속도는 낮고, 실행 속도는 빠르다.

### 자바 컴파일러 (Byte Code Language)

* 바이트 코드는 가상 기계어 개념
* 자바는 컴파일 시 결과물이 실행 파일이 아니라 class 라는 바이트 코드 파일이 생김
* 자바 같은 코드언어는 직접적인 하드웨어 제어 불가
* 하지만 자바가 C++ 보다 개발 생산성이 뛰어남

### Javascript, Python (Interpreter Language)

* 컴파일 언어와 다르게 한 줄 씩 바로 언어를 번역해서 실행
* 실시간 분석 가능 -> 개발 생산성이 높음
* 실행 속도는 낮고, 개발 속도는 높다.

## Precompiled Header 사용

* C++ 소스파일은 많은 파일을 include 하는 경향이 있다.
*   이런 include들의 문제점은 그 과정이 모든 소스파일에서마다 반복된다는 것이다.

    windows.h 와 같이 덩치가 무지 큰 헤더 파일을 #include하는 모든 파일을 매번 컴파일하면 시간이 상당히 걸린다.
* 헤더파일은 사이즈와 상관없이 많은 프로젝트에서 모든 소스파일이 같은 컴파일 시간만큼을 가지는 아주 큰 C++ 컴파일 시간을 가진다.
* 특정 헤더 파일을 미리 파싱한 결과물을 .pch 파일로 덤프시킨다
* 다른 파일들은 이 .pch를 단순히 사용함으로써 중복된 파싱 작업을 없앨 수 있다.
* 그 .pch 파일 중 하나가 stdafx.h이다.

### stdafx.h

* 덩치가 크거나 거의 바뀌지 않는 정의 같은 것을 모두 stdafx.h에 넣는다.
* 기본적인 아이디어는 하나의 cpp파일을 PCH를 만드는 역할로 정하고, 다른 cpp파일 을 그 PCH파일을 사용하는 역할로 정하는 것이다. (stdafx.cpp)
* 하나의 소스파일만이 PCH파일을 만드므로 전체 rebuild에서 한번만 build되는 것을 보장한다.
* 우선 프로젝트의 모든 소스파일이 include할 헤더파일이 하나 필요하다. (stdafx.h)
* PCH파일의 include가 첫줄/제일위에 있는지 확인해보길 바란다.

## Incredi-Build

* 분산 빌드 시스템
* 여러 컴퓨터에서 분산해서 빌드
