[Swift] ABI란 무엇인가
지금 시각 22:31. 남은 배터리 19%. 생각은 다 정리했으니 빠르게 ABI를 조져보자.
API
님덜 API 아시져? 인터페이스잖아요?
func call() {}
이런 함수가 있으면
call()
이케 호출하면 되잖슴?ㅇㅇ
ABI
이렇게 ABI도 똑같이 인터페이스임. 근데 바이너리임! 컴파일하면 나오는 call()
의 바이너리 인터페이스가 1010
이라고 하겠음. 그럼 나는 1010
호출하면 되겠지?
근데 똑같은 call()
이라도 Swift4에서는 바이너리 인터페이스 형태가 1010
이고 Swift5에서는 10
인거임!!! 이게 바로 ABI Stability가 안맞는거. Swift5.0 전까지 안맞아왔음
물론 여기서 등장하는 call()
이나 1010
등은 다 예시다. 실제로 함수가 있는지도 모르고 컴파일하면 바이너리로 어떻게 표현되는지도 모름. 그냥 내가 이렇게 이해함 ㅇㅇ 다른 글들 보면서 대충 이해한대로 쓴거라 틀릴 가능성 다분 ㅎㅎ 훈수 환영!
예시 (물론 이해를 돕기 위한것. 사실 내가 이렇게 이해함 ㅎ)
- Swift4로 작성 중인 플젝에서 스위프트 라이브러리에 있는
call()
호출 - 해당 플젝을 컴파일하니
call()
의 바이너리 인터페이스로1010
이 나옴. - 스위프트 라이브러리도 Swift4로 컴파일 된게 있어야함.
- 왜냐면
call()
이 똑같이1010
으로 표현돼 있어야 인터페이스 역할을 제대로 할 수 있을거 아님? - 같은 함수라도 Swift5로 컴파일 되면
10
이 나와서 서로 안통할 수 있음! - 그래서 원래는 앱이랑 해당 버전으로 컴파일 된 라이브러리랑 같이 번들로 묶임.
Swift 4.0 App — Swift 4.0 Dynamic Library (4.0 ABI 포함)
이런식으로!
Swift 5부터
ABI Stability 를 보장. 그니까 call()
을 Swift5로 작성해서 컴파일하든, Swift6으로 작성해서 컴파일하든 똑같이 바이너리 인터페이스는 10
이 나온다는 말.
그러면 전처럼 버전에 맞게 컴파일 된 라이브러리를 앱이랑 같이 묶을 필요 없겠지? 어차피 내가 Swift5 이상으로 코드 작성하면 call()
은 무조건 10
으로 컴파일 될테니까 ㅇㅇ
따라서 컴파일 된 라이브러리를 OS에 심어버릴 수 있음. 라이브러리의 call()
은 10
일테고, 앞으로 Swift5를 쓰든 6를 쓰든 call()
부르면 10
으로 똑같이 바이너리 인터페이스가 나올테니까.
오키?
끗!
ABI stability를 통한 장단점은 여기를 살펴보자
진짜 끗!
23:29. 남은 배터리는 6%. 참을 수 없다. ㅇㅏ메리카노 사와야지.