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,

어셈블러와 링커 모두 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