iOS

ABI 란?

iOS_Assin 2019. 9. 30. 07:00

ABI 를 이해하기 가장 좋은 예는 API 와 비교하는 것이다.

 

Stackoverflow 에서 잘 설명된 답변을 찾아볼 수 있었다.

https://stackoverflow.com/questions/3784389/difference-between-api-and-abi

API (Application Programming Interface)

API는 코드 레벨에서 다른 소프트웨어와 통신하는 인터페이스를 정의한다.

 

ABI (Application Binary Interface)

ABI는 특정 아키텍처에서 두 개 이상의 소프트웨어 간 하위 수준 이진 인터페이스를 정의한다.

  • Application과 상호 작용
  • Application이 커널과 상호 작용
  • Application이 Library와 상호 작용

즉, ABI는 API와 특정 CPU 아키텍처의 기계 언어를 정의한다.

API는 런타임 호환성을 보장하지 않지만 ABI는 기계 언어(Machine lau) 또는 런타임 형식을 정의하기 때문에 이를 보장한다.

 

CPU 아키텍처?

Xcode > Build Setting > Architectures 아래 그림과 같은 설정을 많이 접해보았지만 어떻게 쓰이는지 다음 기회에 알아보도록 하겠다.

 

이 포스트에서는 아키텍처 설명은 깊게 다루지 않습니다. 자세한 설명은 여기에서 확인할 수 있습니다.

 

 

 

 

[아키텍처 별 애플기기 모델]

원본

 

런타임 호환성???

API 는 런타임 호환성을 보장하지 않고 ABI 는 런타임 호환성을 보장해준다고 한다.

런타임 호환성이란... 무엇일까..?

여기에서 그 내용을 확인할 수 있었다.

 

Binary framework & runtime compatibility enables the distribution of frameworks in a binary form that works across multiple Swift versions. Binary frameworks include both a Swift module file, which communicates source-level information of the framework's API, and a shared library, which provides the compiled implementation that is loaded at runtime. Thus, there are two necessary goals for binary framework compatibility:

 

예를 들면)

라이브러리를 사용하다보면 Swift 버전이 맞지 않아서 라이브러리 업데이트를 기다려야 하는 경우가 많았다.

런타임 호환성이란 Swift 버전과 상관없이 라이브러리를 사용할 수 있다는 의미로 생각해도 될 것 같다.

 

API가 런타임 호환성을 보장하지 않는 이유를 생각해보자.

다시 API 정의를 상기시켜보면 API는 코드 레벨에서 다른 소프트웨어와 통신하는 인터페이스를 정의한다.

코드 레벨에서 인터페이스를 정의하기 때문에 Swift 버전에 영향을 받을 수 밖에 없다.

 

 

 

이제 다른 주제로 넘어가서 ABI Stability 를 살펴보자.

ABI Stability?

ABI 안정성이 왜 필요한가? 

 

왼쪽 그림은 안정성이 있지만 오른쪽은 안정성이 없다고 말할 수 있다. 

 

클라이언트가 사용할려는 Draw 1.2 draw_polygon() 함수가 삭제되면서 Draw2.0 과의 호환성을 유지할 수 없기 때문이다. 

 

즉, 사용할려는 클라이언 입장에서 라이브러리의 버전 호환성을 지원해줘야 하는 것이 Stability 라고 말할 수 있다.

 

 

더 자세히 알고 싶다면 ABI Stability Manifesto 를 참조하길 바란다.

 

 

참조: 

https://github.com/apple/swift/blob/master/docs/ABIStabilityManifesto.md

http://kyejusung.com/2015/10/armv7s-armv7-arm64%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90/

https://codeday.me/ko/qa/20190306/4138.html

https://github.com/apple/swift/blob/master/docs/ABIStabilityManifesto.md

https://medium.com/swiftify/swift-5-and-abi-stability-the-best-time-to-migrate-d4029d5342e9