ABI Stability
오늘 알아볼 것은 ABI입니다.
ABI…뭐지….API는 좀 들어본 것 같은데.. 솔직히 저도 처음 들었습니다.
뭔가 iOS 이론 공부하면서 처음 듣는 개념이라 공부하는 시간이 조금 오래 걸렸습니다.
열심히 했지만 내용이 틀렸다면 바로 알려주세요 바로 수정하겠습니다!! 🦋
왠만하면 모두가 API는 알고 있으니까 한번 짚어보고 가겠습니다.
API는 특정함수나 Property를 공개하고, 타프로그램과 개발자가 서로 통신해주는 메커니즘입니다.
-
AWS API 예시
기상청의 소프트웨어 시스템에는 일일 기상 데이터가 들어 있다고 하면 날씨 앱은 API를 통해 이 시스템과 대화하여 휴대폰에 매일 최신 정보를 표시합니다.
때문에 말그대로 API는 interface입니다.
ABI?
서로 어떻게 소통할 것인지에 대한 규약
ABI도 interface이지만 영역이 Binary라는 것이 차이점입니다.
우리가 코드를 작성 → 컴파일 → Binary code 등장!!!!!
이런 느낌으로 Binary 파일이 생성됩니다.
Binary file들 사이의 소통

런타임에 Swift 프로그램의 Binary는 다른 library와 ABI를 소통한다.
ABI는 함수를 어떻게 호출할지, 메모리에 데이터를 어떻게 표현할지, 메타데이터를 어디에 놓고 어떻게 접근할지 등을 정의한다.
- CPU instructions(registers, stack, organization, memory access type) 등의 CPU 명령어
- Calling convention(함수 호출, argument 전달값 리턴)
- OS에 대한 시스템 호출
- Data Layout
- Type Metadata
- Mangling
- Runtime
- Standard Library
Dynamic library를 로드하여 사용할 때 필요한 것이라고 생각하면 Dynmaic library의 경우 이미 컴파일된 실행 파일 자체를 가지고 와서 메모리에 올려서 사용하기 때문에, Binary 영역에서 인터페이스가 필수적이다.
ABI Stability
ABI가 변하지 않을 것을 보장한다는 것입니다.
그렇다면 왜 AIB Stability가 안정화되어야할까요?
Swift 버전이 변경되면, 해당 언어를 해석할 수 있는 Compiler의 변경이 일어나고 ABI가 변경됩니다.
이렇게 되면 Swift 2.0에서 만들어진 Binary File은 Swift 3.0에서 사용할 수 없습니다.
이렇게 되면 Swift 5.0 전에는 Package에 Swift RunTime Library를 추가하여 하위 버전의 OS와 확보했어야했습니다. 옛날에 진짜 개발 어떻게 했을까…
그래서 Swift 2.0 버전의 APP들을 보면 ipa (.dylib) 를 포함하고 있습니다.
때문에 Swift Dynamic Library 즉, 다른 버전의 Binary 호환성을 위해 APP Bundle에 이를 추가해서 배포했었습니다.
ABI Stability를 지원한다는 말은 무슨 말이지?
ABI를 지원한다는 말은 ABI가 안정화 됐다는 말과 같습니다.
Swift Dynamic Library(Swift Runtime Library)가 OS의 일부가 된다.
Swift Version에 상관 없이 해당 Binary를 해석하는 ABI는 OS가 들고 있어서 APP Package에 추가하지 않아도 된다.
만약 Doployment target 13.0 이상 설정시, Swift RunTime Library의 위치가 @rputh에서 System path로 변경이 됩니다.
Swift 5~~
ABI Stability를 보장합니다.
Swift 5에서 실행된 컴파일과 Swift6으로 작성해서 컴파일 하든 똑같이 바이너리 인터페이스는 같습니다.

이점
- APP과 Library 간의 Binary 호환성을 가진다.
- 특정 버전의 Swift Compiler로 구축된 Product를 버전에 상관없이 적용할 수 있다.