TIL
[iOS] Xcode Build System
Kim Roks
2025. 1. 8. 19:43
개요
- 시작은 Static Library와 Dynamic Library였는데 파다 보니 여기까지 왔네요. 분명 알아야 할 내용일 거라 생각해서 짚고 넘어갑니다!
- 우리가 0과 1로 이뤄진 기계어나, 어셈블리어 처럼 어려운 언어 대신 swift, java 등의 상위 수준의 코드로 프로그래밍을 할 수 있다는 건 컴파일러, 인터프리터라는 번역가들이 열일해 줘서 라는건 많은 분들이 알고 계실 거 같아요.
- 오늘은 그 과정이 Xcode에선 어떻게 이뤄지는지, 또한 그 과정에서 의문의 시작이었던 스태틱 라이브러리와 다이내믹 라이브러리의 동작에 대해 간단히 보겠습니다.
Xcode 빌드 시스템이란?
- 실행 가능한 프로그램을 생성하는 다양한 작업의 실행을 조율하는 것
과정
- swift, xcode 기준으로 접근했지만, 대부분의 언어 처리 시스템은 5가지로 이뤄져서 진행된다고 합니다
- 돌고 돌아 CS..!
- PreProcessor
- Compiler
- Assembler
- Linker
- Loader
순서대로 살펴보겠습니다
PreProcessing(전처리기)
- 컴파일러에 공급할 수 있도록 프로그램을 변환하는 과정입니다.
- 당연히 컴파일타임보다 이전에 진행되겠죠?
- 이 과정에서 매크로를 그 정의로 대체하고, 의존성을 발견하고, 전처리 지시문을 해결합니다.
- 이 과정은 사실 xcode, swift에서의 방식이 아닌 전통적인 컴파일 과정에서의 전처리입니다.
- 하지만 Swift는 전처리기가 없습니다
- Swift에서 전처리기를 사용할 수는 없지만, Xcode 빌드 시스템은 Active Compilation Conditions라는 기능을 제공합니다.
이 기능을 통해 특정 조건에 따라 코드를 컴파일할 수 있게 합니다.
예를 들어, DEBUG와 같은 컴파일 조건을 설정하면, 코드에서 #if DEBUG와 같은 조건문을 사용하여 특정 코드 블록을 컴파일할지 말지 결정할 수 있습니다.
이 방식은 전통적인 전처리기의 기능을 부분적으로 대체합니다.
- Swift에서 전처리기를 사용할 수는 없지만, Xcode 빌드 시스템은 Active Compilation Conditions라는 기능을 제공합니다.
Compiler(컴파일러)
- 컴파일러가 뭔가요? (링크)
- XCode는 이 과정에서 swift 나 objective C 같은 소스 코드를 어셈블리어로 변환하는 과정을 거칩니다.
- Symbol Table을 생성하고 관리합니다.
- 심볼은 코드 또는 데이터 조각의 이름입니다.
- 과정에서 clang이나 swiftc처럼 한 번쯤 들어본 내용이 있긴 한데, 해당 내용은 다음에 기회 되면 다루는 걸로 하겠습니다.
Assembler(어셈블러)
- 어셈블리어를 기계어(machine code)로 바꿉니다.
- Object 파일을 출력하는 과정입니다.
- 코드와 데이터의 모음이자, iOS와 macOS 운영 체제용 특수파일을 Mach-O 파일이라고 칭합니다.
- . o 확장자를 사용합니다.
Linker(링커)
- 링커는 다양한 Object File과 Library를 병합하여 iOS 또는 macOS 시스템에서 실행할 수 있는 하나의 Mach-O를 만드는 과정입니다.
- 어셈블리에서도 Object파일 (mach-o)를 출력한다고 하는데 어셈블리에선 미완성인 상태임.
- 컴파일러 단계에서 생성된 신볼 테이블을 사요 해서 여러 객체 파일과 라이브러리에서 참조를 해결해서 완제품 Mach-O를 만들어냄앞서 언급한 특성을 가진 Xcode에서 Swift 프로젝트를 빌드할 때 "정의되지 않은 심볼" 오류를 이미 경험했을 수 있습니다.… tuist 마이그레이션하며 진짜 해당 오류때문에 정신 나가는 줄 알았는데 이런 이유였군요
Loader(로더)
- 마지막으로 로더는 프로그램을 메모리로 가져와서 실행
- 로더는 프로그램을 실행시키는데 필수적인 메모리 공간을 할당해 주고 레지스터를 초기상태로 초기화합니다.
마치며..
- tuist 마이그레이션 과정에서 꽤 많이 부딪혔는데 과정에서 겪은 문제들은 대부분이 이 지식을 통해 해결할 수 있는 부분이었네요
물론 다 해결하고 궁금해져서 찾아보게 되었지만..ㅎ swift 외적으로도 cs적인 학습이 많이 포함된 거 같아 재밌던 주제였습니다
참조의 첫 번째 글에서 훨씬 더 자세한 내용을 확인하실 수 있습니다.