Swift/Basic
프로젝트가 프로세스가 되기까지 - 1
songmoro
2024. 12. 6. 17:20
728x90
프로젝트
Xcode 빌드 시스템
Xcode 빌드 시스템은 5개의 단계로 구성되어 있다.
- Preprocessor, 전처리기
- Compiler, 컴파일러
- Assembler, 어셈블러
- Linker, 링커
- Loader, 로더
Preprocessor, 전처리기
전처리기의 목적은 컴파일러에 공급될 수 있는 방식으로 프로그램을 변환하는 것
- 매크로를 정의로 대체
- 종속성 발견
- 전처리기 지시문 해결
스위프트 컴파일러에는 전처리기가 없음
- 대신 Xcode 빌드 시스템이 이를 보상(프로젝트 빌드 설정에서 전처리 조건 설정)
Compiler, 컴파일러
컴파일러는 소스 프로그램을 다른 언어로 매핑하는 역할
- Swift 및 C family 언어를 기계어로 변환
- C family 언어: C/C++, Objective-C/C++
Xcode는 두 개의 컴파일러를 사용
- Swift 언어용: swiftc
- C family 언어용: Clang
컴파일러는 두 부분으로 구성됨
- 프론트엔드, 백엔드
프론트엔드
- 소스 프로그램을 별도의 조각으로 나누고, 문법 구조를 적용
- 이 구조를 사용해 소스 프로그램의 중간 표현을 생성
- 또한, 소스 프로그램에 대한 정보를 수집하는 심볼 테이블을 생성하고 관리
심볼
- 코드 또는 데이터 조각에 대한 이름
- 변수, 함수, 클래스의 이름을 저장하며, 각 심볼은 특정 데이터 조각에 매핑됨
스위프트 컴파일러의 경우, 중간 표현은 스위프트 중간 언어(SIL)로 명명됨
- 코드의 추가 분석과 최적화를 위해 사용
- SIL에서 직접 기계 코드를 생성하는 것은 불가능하므로 LLVM 중간 표현으로 한 번 더 변환됨
백엔드
- 중간 표현을 어셈블리 코드로 변환
Assembler, 어셈블러
어셈블리 코드를 기계어로 변환
- 코드와 데이터의 모음인 Mach-O 파일(.o) 생성
Mach-O 파일
- iOS, macOS 용 파일 형식
- Object 파일, 실행 파일, 라이브러리에 사용
- Arm 및 Intel 프로세서에서 실행되는 그룹화된 바이트 스트림
Linker, 링커
iOS, macOS의 Mach-O 실행 파일(.app)을 만들기 위해 Object 파일과 라이브러리를 병합
- 두 종류의 파일을 입력으로 받음
- 어셈블러 단계와 여러 유형의 라이브러리에서 나온 Object 파일
- 라이브러리: .dylib, .tbd, .a,
- 어셈블러 단계와 여러 유형의 라이브러리에서 나온 Object 파일
어셈블러와 링커 모두 Mach-O 파일을 출력으로 생성
- 어셈블러 단계에서 생성된 Object 파일
- 다른 Object 파일이나 라이브러리를 참조하는 데이터 조각을 포함
- 링커 단계에서 생성된 Object 파일
- 코드에서 printf 등의 함수를 사용할 때, printf 함수가 구현되는 libc 라이브러리가 필요함
- 링커는 컴파일러 단계에서 생성된 심볼 테이블을 참조하여 Object 파일과 라이브러리에 대한 참조 해결
- undefined symbol 에러에서 말하는 symbol과 같음
Loader, 로더
프로그램을 메모리로 가져와 실행
- 로더는 운영체제의 일부
- 프로그램을 실행하는 데 필요한 메모리 공간 할당
- 레지스터를 초기 상태로 초기화
참고
https://ios-development.tistory.com/1336
https://www.vadimbulavin.com/xcode-build-system/
728x90