티스토리 뷰

ABI (vs API)

  • API
    • Application Programming Interface의 약자
    • 프로그래밍시 코드에서 사용하는 인터페이스
    • API에는 보통 함수의 이름, 타입, 인자, 리턴 타입 등을 정의
    • 소스코드 상에서 다양한 구성 요소간의 통신 규칙 정의
  • ABI
    • Application Binary Interface의 약자
    • 바이너리 간 인터페이스
    • 런타임에 Swift 프로그램 바이너리는 다른 라이브러리와 ABI를 통해 상호작용합니다.
    • 운영체제와 앱, 앱과 라이브러리간 상호작용을 위해 ABI를 사용하게 됩니다.
    • ABI에는 함수를 어떻게 호출할지, 메모리에 데이터를 어떻게 표현할지, 메타데이터를 어디에 놓고 어떻게 접근할지 등을 정의OS-App-Library간 상호작용
    • 기계 코드(machine code)에 대한 통신 규칙 정의
      • CPU instructions (registers, stack organization, memory access type) CPU명령어
      • calling convention(함수 호출, argument전달, 값 리턴)
      • OS에 대한 시스템 호출
      • Data Layout
      • Type Metadata
      • Mangling
      • Runtime
      • Standard Library

Source compatibility

  • 소스 호환성 (== API Stable)
  • 버전에 상관없이 소스들을 호환시킬 수 있음
  • Swift 개발자가 새로운 Swift 버전이 나왔을 때, 새 버전으로 마이그레이션 해야 할 경우의 번거로움을 줄여줌
    • ex) Swift 4.2 이후에 NSAttributedStringKey를 NSAttributedString.Key로 변경해야 했음
    • 소스 호환성이 없다면, 소스의 Swift 버전과 컴파일러의 Swift버전이 맞지 않으면 컴파일이 되지 않음
    • 프로젝트 내의 모든 소스와 패키지를 동일한 버전의 Swift로 작성해야 하는 버전 잠금(version-lock) 문제를 가짐

Binary framework & runtime compatibility

  • 바이너리 프레임워크 및 런타임 호환성
  • 여러 Swift버전에서 작동하는 binary form(이진 형식)의 프레임워크를 배포 할 수 있게 하는 것
    • 앱에 Swift 4.0으로 작성된 third party framework가 있을 경우, 그 이상 버전으로 업데이트 할 경우, 버전 호환이 안되어 에러 등의 문제가 생길 수 있음
  • Binary framework에는 프레임워크 API의 소스레벨 정보를 전달하는 Swift모듈파일과 런타임에 로드되는 컴파일 된 구현을 제공하는 공유 라이브러리가 모두 포함
    • Binary framework = Swift 모듈 파일 + 공유 라이브러리
  • Module format stability (모듈 형식 안정성)
    • 프레임워크의 공용 인터페이스에 대한 컴파일러의 표현인 모듈 파일을 안정화 (API선언 및 inlineable코드가 포함)
    • 모듈 파일
      • 프레임워크를 사용하여 클라이언트 코드를 컴파일 할 때, 타입 검사 및 코드 생성과 같은 필요한 작업을 위해 컴파일러에서 사용
  • ABI stability
    • 다른 Swift버전으로 컴파일 된 앱과 라이브러리 간의 Binary compatibility를 가능하게 함

ABI Stability

  • ABI가 안정화 되었다 == 앞으로 ABI가 변하지 않을 것
  • 바이너리의 내부 처리 방식은 바뀔 수 있지만 인터페이스는 유지된다는 것
  • ABI stability가 지원되면 ABI가 지원된 버전의 Swift 컴파일러로 컴파일한 앱과 이후 업데이트 된 Swift 컴파일러로 컴파일된 라이브러리의 바이너리간 호환이 가능
  • Swift 5.0 미만의 Swift는 ABI stable 하지 않음
    • 그래서 각 바이너리 번들에는 고유의 Swift 동적 라이브러리(.dylib 파일)를 갖고 있고 이 라이브러리는 바이너리간 상호 작용을 위해 사용

ipa파일 내부의 동적 라이브러리 파일

  • Swift 5.0부터 ABI가 안정화 됐고 이후 Swift 표준라이브러리를 iOS(운영체제 단)에 적용하면 ABI는 Swift 5.0 이후 모든 버전에서 호환되어 동작 가능

ABI 안정로 인한 호환성 보장

  • 즉, 기존의 앱 내에 존재하는 Swift 버전별 Dinamic Library가 OS의 일부로 포함 되게 되어 Swift 표준 dylib를 앱에 패키징할 필요가 없어짐
    • 따라서 소스 파일 대신 미리 컴파일된 프레임워크로 배포가 가능
      • 외부 dependencies를 프로젝트에 통합해야하는 경우, 기존보다 빌드시간이 빨라질 수 있음

장점

  • 앱 번들 크기 축소
    • 이제 Swift 표준 라이브러리를 앱마다 포함시킬 필요가 없음
    • 해당 라이브러리 크기 만큼 앱 용량 축소
  • 소스 호환성
    • 구 버전으로 작성된 Swift 코드를 새 컴파일러에서 컴파일할 수 있기 때문에 새로운 버전으로의 마이그레이션 작업량을 줄여 줌
  • Swift 언어의 변경 축소
    • ABI를 유지하기 위해서는 Swift 언어에서 함수의 인터페이스를 바꾸지 못함 (리턴 타입, 매개변수, 숫자, 타입 등 자료형 정의나 구조체 정의, 상수 정의 등)
    • 따라서 Swift 언어 큰 변화없이 기존의 문법을 유지할 것을 기대할 수 있음
  • 바이너리 프레임워크 & 런타임 호환성
    • 바이너리로 된 프레임워크를 다양한 Swift 버전으로 배포하는 것이 가능

제한 / 단점

  • 앞으로 Swift는 ABI stability를 보장하기 위해 Swift 런타임이나 표준 라이브러리에 추가가 필요한 feature는 제안이 제한됩니다.
    • 외부에서 볼 수 있는 공용 인터페이스 및 symbol의 상수 값에만 영향을 줌
    • 표준 라이브러리에 새로운 타입, 프로토콜, 프로토콜 순응(Conformance), 함수, 매소드, 프로퍼티 등을 추가하는 것
    • Swift 타입시스템을 변경하는 것. ex. 새로운 타입을 추가하거나 기존 타입에 함수 에트리뷰트 같은 새로운 변경자를 추가하는 것
    • 새로운 브릿징, 서브 타이핑, 동적 캐스팅 관계를 추가하는 것
    • (internal symbol, convention, layout은 ABI를 위반하지 않고 게속 변경 가능)
  • ABI Stable이 선언된 뒤 나타나는 비효율성 및 유연성 부족은 해당 플랫폼에서 영원히 지속될 것임

 

 

 

ABI stability

안녕하세요 :) Zedd입니다. 저번글에서..Swift 5.0이 가장!! 가장 중심적으로 보고 있다는게 바로 ABI stability라고 계~속 강조를 하는데요, 이 ABI stability가 뭔지 저는 잘 모르겠어요. 딱 뭔가 개념이

zeddios.tistory.com

 

 

[Swift] ABI stability란?

Swift 5.0에서 가장 중요한 피처는 ABI stability의 지원이라고 할 수 있습니다. 이번 포스트에서는 이 ABI stability 대해 알아보도록 하겠습니다.

jusung.github.io

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함