https://www.vadimbulavin.com/xcode-build-system/
Swift로 작성된 소스코드를 기계가 이해하고 코드를 실행할 수 있도록 바이너리 코드를 만들어가는 과정을 설명함.

5가지 프로세스 존제
Preprocessor(전처리)
→ swift flag를 통해 #if DEBUG 등의 코드를 컴파일하기 전에 정리해서 코드를 완성함.
Compiler

→ 기계가 이해할수 있도록 코드를 변경함 Xcode는 2가지 컴파일러를 사용함
컴파일러는 프론트엔드와 벡엔드 2가지로 나누어진다.
프론트엔드: 소스 코드를 조각으로 분할, 문법적 구조를 정의하여 Symbol table생성함 Symbol Table은 변수 , 함수 , 클래스의 이름을 저장합니다.Swift 컴파일러의 경우 중간 표현은 SIL(Swift Intermediate Language) 코드의 추가 분석 및 최적화에 사용됨. SIL로 기계어를 생성하는 것은 불가능 하기 때문에 LLVM으로 한번 더 변환 된다.
백엔드 : 중간 단계에서 생성된 언어를 어섬블리 코드로 변경한다.
Assembler
어셈블러는 사람이 읽을수 있는 어셈블리 코드를 기계어로 재배치, 번역하는 기능을 함. 코드와 데이터의 모음인 Mach-O 파일을 생성함. Mach-O 파일은 iOS, macOS 운영체제에서 사용하는 특별한 파일임, object file, 실행파일, 라이브러리에서 사용됨. iOS , Mac에서 실행 될 수 있는 그룹으로 묶여있는 바이트 스트림이다.
Linker
링커는 object files, libraries들을 하나로 묶어 실행가능한 단일 Mach-O파일을 생성하는 역할을 담당.링커는 Assembler에서 만들어진 Mach-O에서 의존하는 라이브러리의 코드(printf, …)등을 묶어와 하나의 파일로 만들어진 Mach-O파일을 만들어진다고함.
Loader
Loader는 운영체제의 일부분이다. 프로그램 실행에 필요한 메모리공간을 할당하고 레지스터를 초기화 상태로 만듬.