Letswift internals cover

Swift Internals- LLVM, Type system, Swift Foundation을 중심으로

Let’Swift는 Swift 개발자들이 만나고, 배우고, 즐기는 컨퍼런스로 총 13개의 세션으로 이뤄졌습니다. Swift 개발자들이 모여 iOS의 넥스트 스텝을 이야기한 행사였습니다. 빠르게 발전하는 언어 Swift에 대한 뜨거운 열의를 엿볼 수 있었던 Let’Swift 행사 동영상을 공유합니다

보다 Swift를 깊게 이해하고 효율적으로 활용하고 싶으신가요? LLVM, Type system과 Swift Foundation을 중심으로 Swift 내부가 어떻게 동작하는지, Let’Swift의 주최자 김정님이 발표한 Swift Internals 세션 동영상을 통해 Swift에 대한 이해도를 높여 보세요.


Swift Compiler

  • LLVM
    • LLVM이란 Low-Level Virtual Machine
    • Chris Arthur Lattner의 2002년 석사 논문에서 시작
    • 오픈 소스로 컴파일러를 제작
    • Apple에서 후원한 컴파일러
    • 2007년도에 Apple에 팀 합병


  • Swiftc

    • LLVM과 거의 유사하나 최적화를 하는 2단계 더 있음
    • 프론트엔드는 swift 파일을 읽에서 토큰 처리와 의미분석, 중간언어 생성 및 타입 검사를 함
    • 중간 언어 최적화는 SIL 수준에서 분석과 변환, ARC 처리와 Generic 코드 타입 지정
    • 이후 LLVM IR 수준을 최적화하고 타깃 기계에 맞는 binary 생성


Swift Type System

  • Objective-C의 Type System
    • C 스타일의 Static Type과 Smalltalk의 Duck Type이 함께 제공
    • Duck Type 특징: 메시지 호출을 했을 때 런타임에 메시지만 구현돼 있으면 성공
  • Swift의 Type System
    • 강한 Type System: 양방향으로 타입 추정
    • 타입을 위한 제약 사항으로 구성(Constraint-based type checker)
    • Hindley-Milner Type System
    • Generate -> Solve -> Solution Application
    • 컴파일해가면서 제약 사항을 만들어 나가면서 최종적으로 타입을 추정해냄
  • Hindley-Milner Type System (HM Type System)
    • 코드의 experssion이 어떤 타입인지를 수학적으로 표시할 수 있음
    • 이를 통해 타입을 계산하는 알고리즘을 제시할 수 있음
    • 삼단 논법 사용: A이고 A이면 B라면 B이다
    • 수학적인 정의와 수식으로 타입을 표현할 수 있고 삼단 논법을 통해 최종적으로 타입을 찾을 수 있음


  • Type Checker - Contraints
    • 타입 체커들이 돌아가면서 제약 사항을 만듦
    • Equality: 두 개 타입이 같은가
    • Subtype: 다른 타입의 서브타입인가
    • Conversion: 다른 타입으로 전환 가능한가 (equality + subtype)
    • Construction: 해당 타입 값으로 다른 타입을 생성 가능한가
    • Member: 주어진 이름의 멤버가 있고, 그 멤버가 특정 타입인가
    • Conformance: 특정 프로토콜을 만족하는 타입인가
    • Checked Cast: as 연산자로 타입 캐스트가 가능한가
    • Applicable function: 인자타입과 리턴타입이 같은 함수인가
    • Overload binding: 함수 오버로드 집합 중에 특정 타입인가
    • Class: 클래스 타입인가
    • Conjunction / Disjunction: 결합하기 또는 분리하기
  • Constraint Solving
    • 제약 사항 세트를 가지고 단순화하거나 전략적으로 선택하거나 비교를 해서 타입을 추정함

Swift Type Internals

  • Native class type
    • Swift name mangling을 돌려서 Swift 클래스 이름이나 타입이름 등을 만들어냄
    • Swift 중간 언어의 모습
    • Objective-C의 중간 언어와 유사한 모습: alloc init이 생김
  • Enumeration type
    • 열거하는 케이스에 따라 다른 타입으로 확장 가능한 타입: 함수를 갖거나 확장도 가능한 의미있는 값
    • 초기 값만 먼저 만들지만 구분을 위해 Hashable protocol과 Equatable protocol을 구현해야 함
    • protocol witness table도 생성
  • Struct type
    • 표준 라이브러리의 기본이 되는 의미있는 값 타입: 90% 정도의 타입이 struct 사용
    • 생애 주기를 갖고 있으며 생성자 / 소멸자가 만들어짐
    • 내부적으로 참조 소유권을 계산함 (retain / release): 자동으로 만들어져서 인지하기 힘들지만 Object와 별 차이없이 돌아갈 가능성이 있음
    • let의 경우 내부적으로 getter가 생김, var의 경우 getter와 setter가 2개씩 생김(옵셔널 처리)

Swift 3 Foundation


이런 개발 뉴스를 더 만나보세요

  • NS가 아닌 Swift에 맞는 Foundation으로 변경됨
  • 특히 네트워크 래퍼 클래스에서 코드 변경이 많을 듯
  • 주황색 표시한 파일 등은 struct로 새로 만듦

요약

  • Siwft Compiler
    • LLVM + Chris Lattner, Talyer Swift
    • LLVM을 기반으로 Chris Lattner가 만듦, Swift인 이유는 그가 Talyer Swift를 좋아하기 때문이라는 후문
  • Type System
    • HM Type System + W Algorithm
    • HM Type System과 W Algorithm을 기반으로 제약사항을 만들고 점수가 제일 낮은 특정 타입으로 지정
  • Type Internals
    • class, enumeration, struct, protocol Types
    • SIL(중간 언어)로 살펴보면 각각 타입별로 생기는 메서드가 각기 다름
  • Swift Foundation
    • IndexPath, IndexSet, Measurement, Notification
    • 새로 생긴 파일들을 살펴보면 좋음
  • Swift 3 최종 버전에서는 Type이 바뀔 가능성도 있음

참고 자료


발표 슬라이드는 아래를 참고해주세요.

컨텐츠에 대하여

이 컨텐츠는 저자의 허가 하에 이곳에서 공유합니다.

Realm Team

Realm의 미션은 더 나은 앱을 빠르게 개발할 수 있도록 돕는 것입니다. 이를 위해 저희는 개발자들이 실시간 협업, 가상 현실, 라이브 데이터 동기화, 오프라인 경험, 메시징 등 정교하고 강력한 기능을 쉽게 개발할 수 있도록 하는 개발 도구와 플랫폼을 제공하고 있습니다.

저희는 모바일 인터넷이 수많은 사용자와 보다 많은 디바이스가 속한 개방형 네트워크와 이들 간의 실시간 상호 작용으로 진화할 것이라고 믿으며, 개발자가 이같은 방향으로 발전할 수 있도록 돕기 위해 저희 제품들을 개발하고 있습니다.

4 design patterns for a RESTless mobile integration »

close