티스토리 뷰
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이 선언된 뒤 나타나는 비효율성 및 유연성 부족은 해당 플랫폼에서 영원히 지속될 것임
'iOS > Swift' 카테고리의 다른 글
[Swift] (알고리즘 테스트를 위한) 많은 입력 값을 한꺼번에 받기 (0) | 2021.06.30 |
---|---|
[Swift] 꼬리재귀(tail-recursive, tail call), 트램폴린(trampoline) (0) | 2021.06.30 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- NavigationLink
- ToolbarItem
- dispose
- Text.limitLine
- tableFooterView
- Swift
- rxswift
- fixedsize
- DisposeBag
- lineLimit
- Binding
- UITableView
- UIViewController
- tail-recursive
- EnvironmentObject
- concurrent
- uiscrollview
- .toolbar
- async
- UIKit
- trampoline function
- FuulScreenCover
- Observable
- Disposable
- UIView
- recursive function
- tail call
- reactivex
- SwiftUI
- trampoline
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함