Swift 컴파일, 컴파일러

2023. 2. 14. 18:16Swift

반응형

Swift Compile

컴파일?, 컴파일러?란?

  • 컴파일러란 특정 프로그래밍 언어로 쓰여 있는 문서를 다른 프로그래밍 언어로 옮기는 번역 프로그램을 의미한다.
  • 컴파일러는 대부분 사람이 쓰는 프로그래밍 언어를 기계어로 바꾸는데 사용되는데 사람이 쓰는 프로그래밍 언어를 소스코드 혹은 원시코드라고 말한다.
  • 반대로 컴파일러를 통해 바꿔진 최종 출력물을 목적 코드라고 명하는데, 이는 다른 프로그램이나 하드웨어가 처리하기 용한 형태 즉 기계어쪽 상태로 출력되지만, 사람이 볼 수 있는 문서나, 그림형태로 출력되기도 한다.
  • 컴파일이란 위에서 설명한 소스코드 혹은 원시코드를 목적코드로 번역? 옮기는? 과정을 컴파일이라고 한다.

왜 컴파일을 하는 것일까?

  • 우리가 소스코드를 작성는 이유는 Mac, 아이폰, 안드로이드, PC와 같은 기계에서 실행되는 프로그램을 만들기 위함이다.
  • 다만, 이 소스코드는 기계가 이해하기에는 어려운 고급 프로그래밍 언어이므로 이를 기계가 이해하기 편한 저급 프로그래밍 언어로 만들기 위함이다.
  • 또한 컴파일러는 컴파일을 하여 최종 결과물을 내놓는다. 이는 XCode내에서 시뮬레이션에서 바로 동작하는 앱을 실행하거나, 터미널에서 표시되는 결과물을 출력한다.
  • 즉, 우리는 기계에서 동작하는 무언가을 만들기 위해 기계에서 사용가능한 최종적인 프로그램 형태로 받기위해 컴파일러를 이용해서 컴파일을 하는것이다.

Swift의 컴파일형태는??

  • 우리는 iOS앱을 만들 때 저 재생버튼 혹은 Product->Run을 클릭하여 시뮬레이터에서 작동을 확인한다.

  • 이렇게 우리는 시뮬레이션에서 해당 앱의 동작을 확인할 수 있는데 Swift의 컴파일러는 어떤상태로 동작을 할까??

Swift Compiler Architecture

  • 스위프트는 LLVM컴파일러를 사용한다
  • 다만, LLVM컴파일러를 곧바로 사용하는 것이 아닌 여러 구조를 거친 이후에 LLVM컴파일러를 통해 컴파일 된다.

1. Parsing

  • Parsing은 소스코드의 추상구문트리(AST)라는것을 생성하며 문법적 문제에 관하여 경고나 에러를 개발자에게 보여준다.
while b != 0 {
    if a > b {
        a -= b
    } else {
        b -= a
    }
    return a
}
  • 해당 구문이 Parsing구조에 들어가게 된다면 AST를 생성하는데 이는 아래와 같은 그림 형태로 생성된다.

2. Semantic analysis

  • 해당 구조는 위에서 생성된 AST를 확인하는 역할을 합니다.
  • 예를 들어 Parsing 구조의 소스코드의 a, b에 관하여 변수인지, Int값인지, 비교가능한 값인지에 대한 추론을 한다.
  • 만약 이 과정에 성공할 경우 해당 AST가 안전하다는 것을 나타낸다.

3. Clang importer

  • 이 구조는 Modules — Clang(LLVM) 해당 모듈을 불러와서 objective-C 혹은 C언어관련 API를 Swift API로 보내주어 LLVM에서 해당 언어를 분석한다.

4. SIL generation

  • 이제 고급프로그래밍언어 Swift로 작성된 소스코드를 곧바로 기계어로 번역하는 것이 아닌 한단계 아래인 중급언어로 낮춘다.
  • Swift를 한단계 낮춘 중급표현, 중간표현인 SIL(Swift Intermediate Language)을 생성한다.

5. SIL guaranteed transformations

  • 위에서 만들어진 SIL을 검증하는 단계이다.
  • 예를들어 소스코드에서 초기화되지않은 변수를 사용한거와 같이 프로그램의 정확성에 영향을 미치는 흐름 진단한다고 한다.
  • 이를 통과할 경우 canonical SIL이라는 결과를 내놓는데 정확한 의미는 모르겠지만 정규화 된 SIL? 이런 뜻 인것 같다.

6. SIL optimizations

  • 이는 위에서 생성 된 canonical SIL을 최적화 시키는 단계이다.
  • 위 SIL을 분석하고 ARC, V-Table등에 관하여 최적화를 실행한다.

7. LLVM IR generation

  • 이후에 LLVM IR로 생성하여 LLVM을 통해 다시 최적화하는 단계이다.
  • IR은 기계의 아키텍쳐 (Intel, ARM)등에 맞는 기계어로 바꾼 형태인 것 같다.

최종 구조

참고자료

반응형

'Swift' 카테고리의 다른 글

Mirror 란?  (0) 2023.05.12
JSON Decoding 재활용  (0) 2023.03.03
ARC-간단정리  (0) 2023.02.07
Closures 간단 정리  (2) 2023.02.06
정규표현식(Swift)  (0) 2023.01.29